Zend Framework - очистить пользовательский заполнитель от viewScript - PullRequest
3 голосов
/ 24 марта 2012

Я пытаюсь очистить пользовательский заполнитель от 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());, но мне кажется, что я не могу получить доступ к своему заполнителю из сценария просмотра:

// 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) {
  }
}

Есть идеи, как это сделать?

Спасибо.

Edit:

Моя проблема была на самом деле очень простой, так как мой плагин был зарегистрирован и выполнен в методе postDispatch (), тогда мой скрипт был выполнен за до , плагин и макет были выполнены после плагин.

Отныне, какие у меня варианты? Я действительно не могу объявить свою боковую панель в методе preDispatch, потому что не будет никакого установленного каталога скриптов, и, следовательно, я не смогу определить, какой скрипт представления выполнить на этом шаге.

Я мог бы также использовать помощника action(), как вы думаете? Был задан вопрос . Я все еще чувствую, что это неправильный способ сделать это, и мне это кажется излишним.

Кроме того, другой идеей было бы переместить мой плагин в метод preDispatch () моего контроллера, но это привело бы к копированию / вставке на каждом контроллере моей боковой панели или созданию baseController, но я все еще не как эта идея, я чувствую, что я делаю это неправильно.

Есть идеи?

1 Ответ

0 голосов
/ 24 марта 2012

Вы были довольно близко на самом деле.Вам просто нужно добавить имя вашего заполнителя, 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');

EDIT3

Он должен работать как 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);
    }
}
...