我有以下用例,我需要从ip-api.com
检索一些数据并将其放入会话中,以便稍后在应用程序的流程中使用一些特定的客户数据。
问题是我不知道在Concrete5
中把逻辑放在哪里。我现在在application/src/IpApi
中创建了一个类,这个类本身不是问题。主要的问题是我如何确保它在每个页面浏览量上都被执行。第二种选择是创建一个块,并将其添加到标题中,但我需要在frontpage激活之前,也就是在模板引擎呈现之前,解析数据。
我应该把它放在哪里,我应该如何加载它。我目前的主题是elemental
主题的扩展,所以它仍然是开箱即用的。
谢谢你的建议
发布于 2016-08-05 00:19:31
您可以创建包并使用包控制器的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());
}
}
);
}
}
发布于 2016-07-22 20:52:16
我发现我应该首先创建一个PageType
。之后,可以在application/controllers/page_types/<mytype.php>
中创建特定类型的控制器
从那时起,on_start方法就是您的朋友,或者您需要的任何函数
https://stackoverflow.com/questions/38523247
复制相似问题