Concrete5控制器逻辑
问题描述:
我有以下用例,我需要从ip-api.com
中检索一些数据并将其放入会话中,以便某些特定的客户数据可以稍后在我的应用程序的过程中使用。Concrete5控制器逻辑
问题是,我不知道在哪里把逻辑放在Concrete5
本身。我现在在application/src/IpApi
中创建一个班级,班级本身不是问题。主要问题是我如何确保它在每个单独的综合浏览页面上执行。 第二个选择是创建一个块并将其添加到标题中,但是即使在激活FrontPage之前需要解析数据,以至于在模板引擎被渲染之前。
我应该把它放在哪里,我应该如何加载它。我目前的主题是elemental
主题的延伸,所以它仍然非常现成。
谢谢你的建议
答
我发现我应该创建一个PageType
第一。该特定类型的控制器可以在application/controllers/page_types/<mytype.php>
创建从那里经过on_start方法是你的朋友或任何功能,你需要ofcourse
答
您可以创建一个包,并使用封装控制器的on_start功能。我建议在on_before_render事件中进行操作,以确保您不会在ajax请求和其他类似事情上执行此操作。它看起来像这样:
<?php
namespace Concrete\Package\SomePackage;
class Controller extends \Concrete\Core\Package\Package
{
public function on_start()
{
$app = \Core::make('app');
$app->make('director')->addEventListener(
'on_before_render',
function() use ($app) {
$session = $app->make('session');
$flashBag = $session->getFlashBag();
if (!$flashBag->has('my-custom-data')) {
$dataGetter = $app->make('YourCustomDataGetterClass');
$flashBag->set('my-custom-data', $dataGetter->getData());
}
}
);
}
}