Опубликовано ср, 07/02/2014 - 14:43 пользователем DepX
На каждом сайте существует множество блоков (меню, погода, новости...), чтобы не использовать SonataBlockBundle, не подключать контроллеры в каждом шаблоне - создаем ядро контроллеров
Создадим бандл AcmeDemoBundle, теперь добавим ядро контроллеров (Acme/DemoBundle/Controller/CoreController.php)
namespace Acme\DemoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class CoreController extends Controller
{
// параметры шаблона
public function param()
{
return array(
'main_menu' => // подключаем контроллер или сервис главного меню
'sub_menu' => // ...
'base_template' => $this->getBaseTemplate() // базовый шаблон бандла/сайта
);
}
// генерируем новый шаблон с параметрами
public function template($template, $params = array())
{
return $this->render($template,
array_merge(
$this->param(),
$params
)
);
}
// указываем базовый шаблон
public function getBaseTemplate()
{
return 'AcmeDemoBundle::layout.html.twig';
}
}
создадим и добавим в шаблон AcmeDemoBundle::layout.html.twig теги
<div id="main-menu">{{ main_menu }}</div>
<div id="sub-menu">{{ sub_menu }}</div>
<div id="body">{% block body %}{% endblock %}</div>
создадим и добавим в шаблон для вывода основной информации AcmeDemoBundle:Main:index.html.twig главной страницы
{% extends base_template %}
{% block body %}
Содержимое главной страницы {{ test_tag }}
{% endblock %}
создаем контроллер главной страницы
namespace Acme\DemoBundle\Controller;
use Acme\DemoBundle\Controller\CoreController;
class AdminController extends CoreController
{
public function indexAction()
{
return $this->template('AcmeDemoBundle:Main:index.html.twig', array(
// можем добавить свои теги
'test_tag' => 'Test tag'
//или изменить существующие
//'main_menu' => ...
//'base_template' => ...
));
// либо используем стандартной функцией с нашими параметрами $this->params
// return $this->render('AcmeDemoBundle:Main:main.html.twig', $this->params);
}
}