Логика контроллера Concrete5

У меня есть следующий вариант использования: мне нужно получить некоторые данные из ip-api.com и поместить их в сеанс, чтобы некоторые конкретные данные клиента можно было использовать позже в процессе в моем приложении.

Проблема в том, что я понятия не имею, куда поместить логику в самом Concrete5. Я создаю класс в application/src/IpApi прямо сейчас, и сам класс не проблема. Основная проблема заключается в том, как я могу гарантировать, что он выполняется при каждом просмотре страницы. Второй вариант — создать блок и добавить его в заголовок, но мне нужно, чтобы данные анализировались еще до того, как главная страница станет активной, то есть до того, как механизм шаблонов будет обработан.

Куда его положить и как загрузить. Моя текущая тема является расширением темы elemental, поэтому она все еще довольно нестандартная.

Спасибо за совет


person Dirkos    schedule 22.07.2016    source источник


Ответы (2)


Вы можете создать пакет и использовать функцию 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());
                }
            }
        );
    }

}
person Korvin Szanto    schedule 04.08.2016

Я узнал, что сначала должен создать PageType. После этого можно создать контроллер определенного типа по адресу application/controllers/page_types/<mytype.php>.

Оттуда метод on_start — ваш друг или любая другая функция, которая вам нужна, конечно.

person Dirkos    schedule 22.07.2016