Как запустить действие после выполнения действия управления (во всех страницах)
-
29-10-2019 - |
Вопрос
У меня есть плагин для FrontController.
Это работает нормально для диспетчеровSerloodstartup Metod, но postdispatcher не может вызывать действие!
Что не так?!
Это мой плагин:
class Places_Controller_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup( Zend_Controller_Request_Abstract $request)
{
$front = Zend_Controller_Front::getInstance();
if (!$front->hasPlugin('Zend_Controller_Plugin_ActionStack')) {
$actionStack = new Zend_Controller_Plugin_ActionStack();
$front->registerPlugin($actionStack, 97);
} else {
$actionStack = $front->getPlugin('Zend_Controller_Plugin_ActionStack');
}
$menuAction = clone($request);
$menuAction->setActionName('menu')->setControllerName('index');
$actionStack->pushStack($menuAction);
}
public function postDispatch(Zend_Controller_Request_Abstract $request)
{ $menuAction = clone($request);
$menuAction->setActionName('toolbar')->setControllerName('index');
}
}
.
Это мой код bootsrap:
$frontController->registerPlugin(new Places_Controller_Plugin_ActionSetup(), 98);
.
Если я должен использовать штабнуюпушку, номер для того, что номер полезен?
Решение
Первое. Это плохая практика. Вам нужно сделать 3 обходных пути (все плагины до и после отправки, контроллеры до и после отправки, ...) - Если возможно, я бы переключился на один плагин фронт-контроллера, который заполнит соответствующие переменные макета и будет использовать партиалы / помощники просмотра для отдают их.
Проблема с вашим кодом заключается в том, что в postDispatch () ваш запрос уже генерирует код кода, а это означает, что он больше не будет отправлен. Вариантом может быть создание запроса самостоятельно. А затем отправьте его в стек действий.
Также вы можете использовать методы стека действий isDispatched = true
, которые создадут для вас запрос;) Вы можете получить текущие параметры, например, $this->actionstack($action, $controller, $module, $params)
или sth. вот так (не уверен на 100% в названии метода).
ИЗМЕНИТЬ:
Если вы поместите рендеринг панели инструментов в макет, то проблем не будет. Вы можете назначить переменные виду, и они будут готовы в макете. У вас будет только сгенерированный код и все. Он всегда будет отображаться после визуализации всех действий, так как макет является последним визуализированным представлением. Просто убедитесь, что переменные вашей панели инструментов не конфликтуют с другими переменными (неплохо было бы исправить их чем-нибудь, скажем, $params = $frontController->getRequest()->getParams()
и т. Д.)