2009-08-21 16 views
8

Zend_Layoutを使用して動的サイトを生成したいとします。 Zend Framework:1つのレイアウトで複数のビューをレンダリングする

マイレイアウト(/application/layouts/scripts/layout.phtml)

は、次の行が含まれます。

...   
<body> 

     <?php echo $this->render('header.phtml') ?> 

     <div id="content"><?php echo $this->layout()->content ?></div> 

     <?php echo $this->render('footer.phtml') ?> 

    </body> 
... 

私は私のインデックスコントローラのindexアクションを参照している場合は - Zendのは、インデックスビューをレンダリングする(アプリケーション/ビュー/ scripts/index/index.phtml)を$ this-> layout() - > contentの中で自動的に作成します。

私はレイアウトの異なるコントローラアクションにビューをレンダリングします。 私はログインフォームを表示するアクションログインで新しいコントローラ認証を生成します。

私はに私のレイアウトを変更:私はインデックス/インデックスを参照すると、私はます$ this->レイアウト内の認証/ログインビューを()レンダリングするのは、Zendこのアクションで定義したい

...   
    <body> 

      <?php echo $this->render('header.phtml') ?> 

      <div id="content"><?php echo $this->layout()->content ?></div> 
      <div id="login"><?php echo $this->layout()->login ?></div> 

      <?php echo $this->render('footer.phtml') ?> 

     </body> 
    ... 

- >ログイン、例えば$ this-> layout() - > contentの中のnews/listのようなものです。

インデックス/インデックスは、ページレイアウトの種類よりもある - および認証/ログインおよびニュース/これを行うにはどのようにウィジェット

の種類をリストアップ!

+0

実際に別の質問として、ビューヘルパーやスクリプトの表示を好むものは何ですか? – basstradamus

答えて

8

まずアドバイスは全くアクションビューヘルパーを避けるためです(http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.partialを参照)

$this->partial() 

でそれを試してみてくださいとにかく、ZF 2.0ではおそらく削除されるでしょう。 (ZF-5840)(Why the actionstack is evil

これはquestion I askedに関連しており、ビットタマンの答えは非常に便利です。そのようなものを実装する最善の方法は、あなたの "ログイン"領域を生成できるビューヘルパーを持つことです。 My_View_Helper_Loginなどです。その後、レイアウトは$this->login()と呼ばれ、user/loginのビュースクリプトも呼び出すことができます。限り、index/indexを持っているコンテンツをnews/listからレンダリングするだけで、コントローラからの他のコントローラ/アクションへの要求が転送されます。 $this->_forward('list', 'news');

+0

ありがとう、私はhavetはまだパフォーマンスの問題について考えた。 – opHASnoNAME

1

あなたは

$this->action() 

パフォーマンスではないので、スピードを使用することができますかあなたは

+3

私は '$ this-> action()'に対して助言したいと思います。非常に非効率です。 – gnarf

3

また、action view helperの使用をお勧めします。あなたのコントローラにたくさんのロジックがない限り、ビューを部分的にレンダリングするだけで別のコントローラに別のリクエストをディスパッチする必要はないでしょう。

私はあなたheader.phtmlfooter.phtmlで行っているだけのような部分ビューを使用して、単純に推薦する:

<body> 

     <?php echo $this->render('header.phtml') ?> 

     <div id="content"><?php echo $this->layout()->content ?></div> 

     <div id="login"><?php echo $this->render('auth/login.phtml') ?></div> 

     <?php echo $this->render('footer.phtml') ?> 

</body> 

そして多分あなたのauth/login.phtmlビュースクリプトは次のようになります。

<div id="login_box"> 
    <?php if (empty($this->user)): ?> 
     Please log in 
    <?php else: ?> 
     Hello <?php echo $this->user->name ?> 
    <?php endif; ?> 
</div> 

限りコントローラ内のある時点でビュー変数を設定する場合は、ビュー内(または必要に応じてコントローラ)からrender view helperを呼び出すことができます。

#index controller 
public function indexAction() 
{ 
    $this->view->user = Model_User::getUserFromSession(); 
} 
+0

インデックス/インデックス(インデックスコントローラ、インデックスアクション)にない場合、ビュー - >ユーザーは定義されません。ビュー - >ユーザーのロジックを現在のアクションから分離する方法私の研究で見つけた答えは、ビューヘルパーです。 – Tangocoder

0

私のレイアウトが複数回呼び出されたという私自身の問題に対する答えを探すとき、私はこのページに行きました。これは、複数の理由で起こった:

1)私は、私は

を入れていたexampleAction()、アクションと呼ばれる)モジュール/ヘルプ

2 /悪いAJAX呼び出しを作った/助けを持っていたの代わりに、

$this->_helper->layout->disableLayout(); 

レイアウトが再度レンダリングされないようにする。

3)リダイレクトを行いました。フォワードまたはルートを使用してみます。

関連する問題