маршрутизация и компоновка zend framework

#zend-framework

#zend-framework

Вопрос:

У меня есть базовый контроллер CMS, который расширяют большинство других моих контроллеров. У него есть действие по умолчанию для действий list, create, read, update и delete, все они устанавливают заголовок на основе имени ресурса (ов), с которым работает пользователь.

Действие index по умолчанию содержит только одну строку:

 $this->_forward('list');
  

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

Обратите внимание, что проблема не появляется, если я переименую свое действие списка в index. Также может иметь значение, что изменение заголовка представления в индексном действии не работает.

Комментарии:

1. Я правильно вас понял? Если пользователь нажимает / index, вы хотите, чтобы заголовок был «index», а не «list», но все равно получал вывод списка?

2. Допустим, пользователь редактирует статьи. Я хочу, чтобы он видел заголовок как «Список статей», когда он нажимает /cms/articles . Это происходит, когда он попадает в /cms/articles/list

Ответ №1:

Хм, где вы устанавливаете свой заголовок и каким образом вы это делаете? Лично мои заголовки состоят всего из двух частей, таких как «Приложение: текущее действие». Для достижения этой цели я делаю следующее:

 //layout.phtml
<?=$this->headTitle()->setPrefix('APP: ')?>

//indexAction()
$this->_forward('list');

//listAction()
$this->view->headTitle()->append('List Data');
  

Я делаю это для каждого действия отдельно, и, поскольку я не присваиваю заголовок в indexAction(), я получаю полный требуемый заголовок «ПРИЛОЖЕНИЕ: данные списка» внутри listAction(). Это остается верным, если у меня есть действие редактирования, подобное следующему

 //editAction()
if (!is_numeric($this->_getParam('id'))) {
  return $this->_forward('list');
}
  

Если это не поможет вам, ваши скрипты понадобятся для поиска ошибки в другом месте 🙂

Комментарии:

1. На самом деле я не использую контейнер, я просто устанавливаю заголовок как обычную объектную переменную следующим образом: $this-> view-> title = ‘Мой новый заголовок’;

2. Должно работать в любом случае: возможно, S показывает соответствующие части вашего контроллера и сценарии просмотра.

Ответ №2:

На самом деле, моя первоначальная идея об этой проблеме, связанной с маршрутизацией, была правильной. Я загружаю макет в действие preDispatch контроллера действий. Итак, что на самом деле произошло, так это то, что я заново создал свой вид макета после установки атрибута title в действии index.