0

私は次のようなレイアウトファイルを持っています:

<?php echo $this->doctype(); ?>
<html>
    <head>
        <?php echo $this->headTitle(); ?>
        <?php echo $this->headLink(); ?>
    </head>
    <body>
        <?php echo $this->layout()->content; ?>
    </body>
</html>

別のテンプレートで書かれたメニューシステムがあります

<p>
    <div>
        menu code goes here
    </div>
    <p>
        <?php echo $this->actionContent; ?>
    </p>
</p>

アクションメソッドの出力を$this->actionContentに配置し、そのすべてをレイアウトに配置する必要がありました。

次に、コントローラープラグインを次のように作成しました。

class ZFExt_Controller_Plugin_Addmenu extends Zend_Controller_Plugin_Abstract 
{
    public function postDispatch(Zend_Controller_Request_Abstract $request)
    {
        $view = Zend_Controller_Front::getInstance()
                      ->getParam('bootstrap')
                      ->getResource('view');

        if (false !== $request->getParam('menu'))
        {
            $response = $this->getResponse();
            $content = $response->getBody(true);
            $view->menuContent = $content['default'];
            $updatedContent = $view->render('menu.phtml');
            $response->setBody($updatedContent);
        }
    }
}

コントローラクラスで

class IndexController extends Zend_Controller_Action {


    public function indexAction() {

    }

    public function viewAction()
    {
          $this->getRequest()->setParam('menu', false);
    }
}

したがって、メニューを必要としないアクションはどれでも、値「false」のパラメーター「menu」を渡すことができます。

私の質問は:これは正しい方法ですか?

4

1 に答える 1

1

まず、アクションからメニューをレンダリングすることはおそらくないでしょう。私はアクションを HTTP リクエストに対応するものと考える傾向があり、待機中のクライアントに対して単なるページ フラグメントではなく、完全なページ/レスポンスを構築します。別のクラス/コンポーネント ハンドル メニューを作成するか、単に を使用しますZend_Navigation

それを超えて、私の理解が正しければ、各アクションでレイアウトのメニュー部分を有効/無効にできるようにしたいだけですよね?

では、レイアウト内のメニューを有効/無効にするスイッチをビューに設定するだけではどうですか。

レイアウトは次のようになります。

<?php echo $this->doctype(); ?>
<html>
    <head>
        <?php echo $this->headTitle(); ?>
        <?php echo $this->headLink(); ?>
    </head>
    <body>
        <?php if ($this->renderMenu): ?>
            // render menu here 
        <?php endif; ?>
        <?php echo $this->layout()->content; ?>
    </body>
</html>

次に、メニューのレンダリングを無効にする場合は、アクションで次のように設定できます。

$this->view->renderMenu = false;

おそらく、リクエストディスパッチサイクルのある時点でフラグのデフォルト値を設定することも価値があります$view->renderMenu-おそらくブートストラップ、コントローラープラグイン、またはコントローラーでinit()

于 2013-02-22T06:39:05.673 に答える