Я новичок в Phalcon. Я создаю приложение PhalconPHP, которое получает элементы меню из базы данных. Я использую макет для создания меню, которое вызывается в index.volt, но макет напрямую вызывает функцию модели.
Я думаю, что это не лучшее решение, может быть, я должен использовать контроллер между моделью и макетом.
расположение:
<?php
$menus = Menus::find();
foreach ($menus as $menu) {
echo "<li>".$menu->name."</li>";
}
индекс:
<!DOCTYPE html>
<html>
<head>
<title>Phalcon PHP Framework</title>
</head>
<?php $this->partial("layouts/menus") ?>
{{ content() }}
</html>
Я был бы очень признателен, если бы кто-нибудь сказал мне, что является лучшим решением для этого.
В случае создания меню, вы, вероятно, ищете расширение класса BaseController. Это хорошая практика для генерации контента, который вам нужен на всех ваших контроллерах, таких как меню, метаданные или хлебные крошки.
class BaseController extends \Phalcon\Mvc\Controller {
function initialize() {
$menus = Menus::find(array(
// you may want to condition query based on user cookie
// or controller you are in
'conditions' => 'controller = "' . $this->dispatcher->getControllerName() . '"'
));
// and set it as View variable to use it if you want
$this->view->setVar('menus', $menus);
}
}
И установите все свои контроллеры, чтобы использовать это по умолчанию:
class DefaultController extends BaseController { }
Чем в menus.phtml:
<?php
foreach ($menus as $menu) {
echo "<li>".$menu->name."</li>";
}
должно быть достаточно. Выглядит лучше в вольт:
<ul>
{% for menu in menus %}
<li>
<a href="{{ menu.url }}">{{ menu.name }}</a>
</li>
{% enfor %}
В случае более сложных проблем, таких как создание контента только на 50% ваших страниц, вы можете включить параметры просмотра только, например:
$this->view->setVar('menus', array(
'conditions' => 'controller = "' . $this->dispatcher->getControllerName() . '"'
));
но это может считаться не элегантным решением и не мешает вам получить модель в вашем View, чего, я полагаю, вы хотели бы избежать. Чуть лучше было бы установить встроенный запрос QueryBuilder и работает его ->execute()
в цикле просмотра, чтобы не подчеркивать БД, пока это не нужно.
Других решений пока нет …