2

Layoutの変数を使用するタイミングとView、ページのページ セグメントを取得するために の変数を使用するタイミングがわかりません。これは彼らのLayoutパッケージチュートリアルの写真です(どこでもインスタンス$thisを意味しViewます): ここに画像の説明を入力

なぜNavigationContentおよびSidebarセグメントはLayout変数として取得されるのですか?

$this->layout()->nav;

しかしHeadTitle、、、 ViewHeadScriptからHeadStylesheetそのまま取得できますか?

$this->headTitle(); // I know that this is a placeholder view helper. 
                    // But this segment of the page logically belongs to Layout.
                    // and it has to be called smth like view->layout->placeholder 

そして、なぜHeaderFooterはのプロパティではなくのpartialメソッドからのものなのですか?ViewLayout

$this->partial('header.phtml');

私はそれらを変更しようとしましたが、両方の方法でうまくいきます:

echo $this->nav; // I assigned navigation segment script to the View and it works;

Footerにセグメントスクリプトを割り当てようとしましたがLayout、それも機能します:

$layout->footer = $footer;
echo $this->layout()->footer;  // it also works, it's displayed on the page

どの方法でも、ページ上の任意の変数に適用できます。たとえば、Navigationセグメントには表示する変数がたくさんあり、両方の方法を使用してそれらを出力できます-1つの変数をLayoutのプロパティとして、別の変数を saViewのプロパティとして。

では、それらを正しい方法で使用するためのルールは何ですか? Viewの変数と の変数はいつ使用する必要がありLayoutますか?

4

1 に答える 1

3

$this->layout()->navこれはドキュメントからはあまり明確ではないことに同意します。また、まったく説明されていないと思います。役立つかもしれないいくつかのポイント:

  • $this->layout()は、実際にはレイアウト ビュー ヘルパーの呼び出しであり、 の現在のインスタンスを返しますZend_Layout
  • Zend_Layout独自のプレースホルダー ヘルパーを (キー 'Zend_Layout' で) 登録し、デフォルトでこれに 'content' 変数を作成します。
  • このクラスには、メンバー変数の呼び出しを登録済みのプレースホルダー コンテナーにプロキシZend_Layoutする魔法のメソッドがあります。__get()したがって、呼び出し$this->layout()->contentは別の書き方です$this->placeholder('Zend_Layout')->content
  • このクラスには、格納されたデータをプレースホルダー クラスにプロキシZend_Layoutするマジック メソッドもあります。__set()呼び出し$layout->footer = 'foo'と同じです$this->placeholder('Zend_Layout')->footer = 'foo' in the view

それを念頭に置いて:

ナビゲーション、コンテンツ、サイドバーのセグメントがレイアウト変数として取得されるのはなぜですか?

これらはZend_Layoutのプレースホルダーに保存されているデータにアクセスしているためです。使用することもできます$this->placeholder('Zend_Layout')->content

しかし、HeadTitle、HeadScript、HeadStylesheet は View から直接取得されますか?

これらはビュー ヘルパーです。

また、ヘッダーとフッターがビューの一部のメソッドからのものであり、レイアウトのプロパティではないのはなぜですか?

これは、他のテンプレートからコンテンツにアクセスする標準的な方法です。

一般に、ビュー オブジェクトを使用することがデータにアクセスする正しい方法であると想定します。データがレイアウト プレースホルダーにあることがわかっている場合にのみ、レイアウト オブジェクト/ヘルパーを使用します。

パーシャルよりもプレースホルダーを使用する利点は、ビュー自体を含むいくつかの異なる場所でプレースホルダーにアクセスして変更できることです。たとえば、パーシャルに保存されているサイドバーがあるとします。これを代わりに Zend_Layout プレースホルダー (コントローラー プラグインなど) に格納する場合は、コントローラーの特定のアクションに対してこれをオーバーライドできます。

public function someAction()
{
    $this->view->layout()->sidebar = 'Some other sidebar content';
}

またはビュースクリプト自体で:

<?php $this->layout()->sidebar = 'Content for this page only'; ?>
于 2012-07-09T16:52:52.287 に答える