我正在尝试从视图脚本中清除自定义占位符,假设我有一个创建侧边栏的控制器插件:
$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());
但似乎我无法从视图脚本访问占位符:
// 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,但我仍然不喜欢这个想法,我觉得我做错了。
任何的想法?