【发布时间】:2012-04-08 20:21:28
【问题描述】:
我正在尝试从视图脚本中清除自定义占位符,假设我有一个创建侧边栏的控制器插件:
$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 是在 before 插件执行的,而 layout 是在 after 执行的强>插件。
从现在开始,我有哪些选择?我无法在 preDispatch 方法中真正声明我的侧边栏,因为不会设置任何脚本目录,因此我无法确定在这一步执行哪个视图脚本。
我也可以使用action() 助手,你觉得呢?一个问题是already asked about it。我仍然觉得这不是正确的做法,而且对我来说听起来有点矫枉过正。
另外,另一个想法是将我的插件移动到我的控制器的 preDispatch() 方法中,但这会导致我在侧边栏的每个控制器上复制/粘贴,或者创建一个 baseController,但我仍然没有喜欢这个主意,感觉自己做错了。
有什么想法吗?
【问题讨论】:
-
一个想法是设置一个像
$view->isSidebarRenderable这样的标志,并在渲染侧边栏之前在布局中检查它。不优雅,但应该可以。 -
我想过这个,但正如你所说,它似乎不优雅。无论如何,感谢您分享您的想法:)
-
确实如此。我有兴趣看看其他人是否想出了更清洁的东西。干杯!
-
发现我的问题,我已经编辑了我的问题。但我仍在寻找最好的解决方案。
标签: php zend-framework placeholder zend-view zend-layout