Ответ 1
Я сделал еще несколько исследований, и самый простой способ, который я нашел, это просто эта простая строка в шаблоне:
{% render 'MyBundle:MyController:myAction' %}
Это выводит результат действия с шаблоном, указанным в действии.
В моем приложении Symfony2 я хочу, чтобы на разных страницах отображался виджет. Это не может быть просто определено его шаблоном, ему нужно вызвать БД и пройти через контроллер.
В Symfony1 я бы создал компонент и включил его. Как я могу сделать то же самое в Symfony2?
Я сделал еще несколько исследований, и самый простой способ, который я нашел, это просто эта простая строка в шаблоне:
{% render 'MyBundle:MyController:myAction' %}
Это выводит результат действия с шаблоном, указанным в действии.
Вы можете создать расширение Twig с функцией widget
и зарегистрировать его в контейнере. Также добавьте Kernel
в это расширение.
class WidgetFactoryExtension extends \Twig_Extension
{
protected $kernel;
public function __construct($kernel)
{
$this->kernel= $kernel;
}
public function getFunctions()
{
return array(
'widget' => new \Twig_Function_Method($this, 'createWidget', array('is_safe' => array('html'))),
);
}
public function createWidget($name, array $options = array())
{
list($bundle, $widget) = explode(':', $name);
$widgetClass = $this->kernel->getBundle($bundle)->getNamespace() . '\\Widget\\' . $widget;
$widgetObj = new $widgetClass();
$widgetObj->setContainer($this->kernel->getContainer());
if ($options) {
$widgetObj->setOptions($options);
}
return $widgetObj;
}
}
И после этого напишите в шаблонах:
{{ widget('QuestionsBundle:LastAnswers', {'answersCount' : 10}) }}
{# class QuestionsBundle/Widget/LastAnswers #}