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() メソッドで登録および実行され、プラグインの前にビュースクリプトが実行され、プラグインのにレイアウトが実行されたため、私の問題は実際には非常に単純でした。

これから、私の選択肢は何ですか?スクリプト ディレクトリが設定されていないため、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 Web サイトでこれをテストしたところ、うまくいきました。おそらく別のシナリオ。知らない。

より複雑ではありますが、別の方法を次に示します。

//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

preDispatch フックを使用して Zend_Controller_Plugin として動作するはずです。確認する必要があるのは、ビュー スクリプト/ヘルパー パスとレイアウト パスを設定した後で、そのプラグインを注文することだけだと思います。これは、同じプラグインまたは別のプラグインで実行できます。

これは、私が自分の Web サイトで使用しているものに基づくコード例です。関連する部分は、ビュー スクリプト パスなどを設定した 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 に答える