3

我正在尝试从视图脚本中清除自定义占位符,假设我有一个创建侧边栏的控制器插件:

    $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,但我仍然不喜欢这个想法,我觉得我做错了。

任何的想法?

4

1 回答 1

0

你其实很接近。您只需要添加占位符的名称,sidebar在这种情况下:

$this->placeholder('sidebar')->exchangeArray(array());应该管用。

请参阅http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.placeholder

编辑:

很奇怪,上面的方法对你不起作用。我在我自己的 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');

编辑3

它应该使用 preDispatch 钩子作为 Zend_Controller_Plugin 工作。我认为您唯一需要确保的是在设置视图脚本/帮助程序路径和布局路径后订购该插件。这可以在同一个插件或另一个插件中完成。

这是一个基于我在我的网站上使用的东西的代码示例。相关部分只是我设置视图脚本路径等的 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);
    }
}
于 2012-03-24T18:36:38.243 回答