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()); 
       } 
      } 
     ); 
    } 

}