Phalcon / Volt динамически создает / отображает общие области шаблона (частичные)

Я начинаю проект, используя платформу Phalcon с Volt в качестве движка шаблонов. У меня есть некоторый опыт работы с Symfony/Twig. Я прочитал документацию и попытался выполнить поиск по всему Интернету, но не могу найти удовлетворительный способ выполнить то, что я хочу (я нахожу некрасивое решение, описанное здесь: как мне создать общий шаблон с верхним и нижним колонтитулами для проектов phalcon с помощью Volt Engine; не используя вольт как таковой для навигации.)

Так что история довольно проста: мой базовый шаблон состоит из 4 частей: навигации, заголовка, контента и нижнего колонтитула. Я использую партиалы для включения общих областей в базовый шаблон, таких как навигация, верхний и нижний колонтитулы, отлично работает со "статическими данными".

Теперь вопрос: как я могу динамически генерировать меню навигации с элементами, поступающими из базы данных? Шаблон будет иметь общие области, которые должны поступать из БД также в верхнем и нижнем колонтитулах и на боковой панели. Необходимость извлекать это во всех действиях Контроллера звучит как излишнее и не слишком СУХОЕ (возможно, сделать это на части инициализации? Но это должно быть сделано в каждом контроллере. Может быть, в абстрактном контроллере, я не знаю.)

Каков наилучший способ сделать это в Phalcon/Volt? В Symfony / Twig вы можете вызывать из представления действие контроллера, поэтому вы можете иметь, например, LayoutController, который отображает частичные данные со страницы.

Спасибо!

1 ответ

Решение

Вот несколько вариантов:

1) Ваши контроллеры могут расширять BaseController и в initialize() Метод, который вы можете назначить эти переменные для представления.

class BaseController extends \Phalcon\Mvc\Controller
{
    public function initialize()
    {
        // Common Variables
        $this->view->assetsSuffix = $this->config->debug ? '' : '.min';
    }

2) Создайте пользовательскую функцию Volt, которая загружает данные.

// In your Volt service:
$compiler->addFunction('getMenu', function($resolvedArgs, $exprArgs){
    return 'Helpers\CommonFunctions::getMenu(' . $resolvedArgs . ')';
})

// Helper file and function
public static function getMenu()
{
    return \Models\Menu::find();
}

// Volt usage
{% set menuItems = getMenu() %}
{% for item in menuItems %}

{% endfor %}

3) Используйте модели для запроса БД прямо из шаблона. Однако это еще не поддерживается с Вольт (не уверен, если он добавлен в последней версии, должны подтвердить).

<?php $menuItems = \Models\Menu::find(); ?>
{% for item in menuItems %}

{% endfor %}

4) Ajax / Javascript, но это действительно зависит от вашего приложения. Что-то вроде углового подхода, но я не буду вдаваться в подробности с этим varaiant.

Другие вопросы по тегам