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.