Zend Framework - очистить пользовательский заполнитель от viewScript
Я пытаюсь очистить пользовательский заполнитель от viewScript, скажем, у меня есть плагин контроллера, который создает боковую панель:
$bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
$view = $bootstrap->getResource('view');
$partial = $view->render('partials/_sidebar.phtml');
$view->placeholder('sidebar')->append($partial);
Моя часть содержит мое подменю (отображается через помощник вида Zend_Navigation).
Для рендеринга этой боковой панели у меня есть это в моем макете:
<?= $this->placeholder('sidebar'); ?>
Но что, если на некоторых страницах я не хочу отображать свою боковую панель (например, страницу входа)? Как я могу справиться с этими случаями?
Я думал, что могу сбросить / очистить мой заполнитель, используя $this->placeholder('sidebar')->exchangeArray(array());
но кажется, что я не могу получить доступ к своему заполнителю из viewScript:
// in /application/modules/default/views/account/login.phtml
<?php $placeholder = $this->placeholder('sidebar');
Zend_Debug::dump($placeholder); ?>
// output:
object(Zend_View_Helper_Placeholder_Container)#217 (8) {
["_prefix":protected] => string(0) ""
["_postfix":protected] => string(0) ""
["_separator":protected] => string(0) ""
["_indent":protected] => string(0) ""
["_captureLock":protected] => bool(false)
["_captureType":protected] => NULL
["_captureKey":protected] => NULL
["storage":"ArrayObject":private] => array(0) {
}
}
Есть идеи, как это сделать?
Благодарю.
Редактировать:
Моя проблема была на самом деле очень простой, так как мой плагин был зарегистрирован и выполнен в методе postDispatch(), тогда мой viewScript был выполнен до плагина, а макет был выполнен после плагина.
Отныне, какие у меня варианты? Я не могу действительно объявить свою боковую панель в методе preDispatch, потому что не будет никакого установленного каталога скриптов, и поэтому я не буду в состоянии определить, какой скрипт представления выполнить на этом шаге.
Я также мог бы использовать action()
помощник, что ты думаешь? Вопрос уже был задан по этому поводу. Я все еще чувствую, что это не правильный способ сделать это, и это звучит излишне для меня.
Кроме того, другой идеей было бы переместить мой плагин в метод preDispatch() моего контроллера, но это привело бы меня к копированию / вставке на каждый контроллер моей боковой панели или созданию baseController, но мне все еще не нравится эта идея Я чувствую, что делаю это неправильно.
Любая идея?
1 ответ
Вы были довольно близки на самом деле. Вам просто нужно добавить имя вашего заполнителя, sidebar
в этом случае:
$this->placeholder('sidebar')->exchangeArray(array());
должно сработать.
См. http://framework.zend.com/manual/en/zend.view.helpers.html
РЕДАКТИРОВАТЬ:
Странно, что вышесказанное у вас не сработало. Я проверил это на своем собственном сайте ZF, и это сработало. Возможно другой сценарий. Я не знаю.
Вот еще одна альтернатива, хотя и более сложная.
//Get the placeholder object directly
$placeholderObj = $this->getHelper('placeholder')
//This may be why you were getting null in your example above. Since your were using the magic method in the View class to call the placeholder view helper method directly.
//For example you could call the placeholder like so:
$placeholderObj->placeholder('sidebar')->set("Some value");
//Now the alternative way to remove the placeholder value is as follows.
$registry = $placeholderObj->getRegistry()
$registry->deleteContainer('sidebar');
EDIT3
Он должен работать как Zend_Controller_Plugin с использованием ловушки preDispatch. Я думаю, что вам нужно убедиться только в том, что вы заказываете этот плагин после того, как вы установили пути скрипта / помощника и пути макета. Это можно сделать в том же плагине или в другом плагине.
Вот пример кода, основанный на том, что я использую на своем сайте. Соответствующая часть - это просто материал в preDispatch, где я устанавливаю пути скриптов вида и т. Д.
class RT_Theme extends Zend_Controller_Plugin_Abstract
{
private $_sitename;
private $_assets;
private $_appPath;
private $_appLibrary;
/**
* Constructor
*
* @param string $sitename
* @param SM_Assets $assets
* @param string $appPath
* @param string $appLibrary
*/
public function __construct($sitename, $assets, $appPath, $appLibrary)
{
$this->_sitename = $sitename;
$this->_assets = $assets;
$this->_appPath = $appPath;
$this->_appLibrary = $appLibrary;
}
/**
* Sets up theme
*
* Sets up theme template directory and assets locations (js, css, images)
*
* @param Zend_Controller_Request_Abstract $request
*/
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$module = $request->getModuleName();
$controller = $request->getControllerName();
$action = $request->getActionName();
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$view->sitename = $this->_sitename;
$view->headTitle()->setSeparator(' - ')->headTitle($view->sitename);
$layout->setLayoutPath($this->_appPath . "/html/$module/layout/");
$view->setScriptPath($this->_appPath . "/html/$module/view/");
$view->addScriptPath($this->_appPath . "/html/$module/view/_partials/");
$view->addScriptPath($this->_appLibrary . '/RT/View/Partials/');
$view->addHelperPath('RT/View/Helper', 'RT_View_Helper');
$view->addHelperPath($this->_appPath . '/html/view/helpers','My_View_Helper');
$viewRenderer =
Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
$viewRenderer->setView($view);
//Ignore this line. Not relevant to the question
$this->_assets->loadFor($controller, $action);
//Example: Now I can set the placeholder.
$view->placeholder('header_title')->set($view->sitename);
}
}