1

我有以下用例,我需要从中检索一些数据ip-api.com并将其放入会话中,以便稍后可以在我的应用程序的流程中使用一些特定的客户数据。

问题是我不知道将逻辑放在哪里Concrete5。我现在创建了一个班级,application/src/IpApi班级本身不是问题。主要问题是我如何确保它在每个页面浏览量上执行。第二种选择是创建一个块并将其添加到标题中,但我需要在前端页面处于活动状态之前解析数据,因此在模板引擎被渲染之前。

我应该把它放在哪里,我应该如何加载它。我当前的主题是主题的延伸,elemental所以它仍然非常开箱即用。

感谢您的建议

4

2 回答 2

1

您可以创建一个包并使用包控制器的 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-08-04T16:19:31.260 回答
0

我发现我应该创建一个PageType第一个。之后,可以在以下位置创建特定类型的控制器application/controllers/page_types/<mytype.php>

从那里 on_start 方法是您的朋友或您当然需要的任何功能

于 2016-07-22T12:52:15.760 回答