2009-10-08 3 views
38

私のプロジェクトでは、すべてのページに一貫していくつかの動的要素があります。私はこれらをlayout.phtmlに入れましたZend Frameworkのレイアウトへの変数の送信

私のコントローラからレイアウトに変数を送るにはどうすればいいですか?

私は使用することができます私のコントローラから物事を送信する場合:

$this->view->whatever = "foo"; 

そして

echo $this->whatever; 

とビューでそれを受け取り、私は私のレイアウトで同じことを行う方法を見つけ出すことはできません。おそらく問題の周りには良い方法がありますか?

答えて

47

レイアウトです。したがって、変数を割り当てる方法は同じです。あなたの例では、あなたが$ this->何をあなたのレイアウトにエコーするのであれば、同じ出力を見るはずです。

一般的な問題の1つは、すべてのページで使用する変数をレイアウトに割り当てる方法です。すべてのコントローラアクションでコードを複製する必要がないためです。これを解決する1つの方法は、レイアウトがレンダリングされる前にこのデータを割り当てるプラグインを作成することです。たとえば、

<?php 

class My_Layout_Plugin extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $layout = Zend_Layout::getMvcInstance(); 
     $view = $layout->getView(); 

     $view->whatever = 'foo'; 
    } 
} 

このプラグインをフロントコントローラに登録します(例:

Zend_Controller_Front::getInstance()->registerPlugin(new My_Layout_Plugin());

+0

私はこのプラグイン(どこのフォルダ?)をどこに置くのですか?他の人のリファレンスのために私が今投稿する別の解決策があります。 – sfusion

+4

Zend_Controller_Front :: getInstance() - > registerPlugin(new My_Layout_Plugin()); '? –

+1

その行はどこでも動作しますが、これを行う通常の場所はブートストラップクラスです –

7

は、私は他のすべてのコントローラが拡張ベースコントローラを実装しています。

<?php 
class BaseController extends Zend_Controller_Action 
{ 
    public function init() 
    { 
    $this->view->foo = "bar"; 
    } 
} 

、レイアウトおよび/またはビュー内の

<?= $this->foo ?> 
+1

これは機能しますか? – Andrew

+0

私はこのアイデアが好きですが、私は助けることはできませんが、ビューヘルパーが良いアイデアだったと思います。 – azz0r

+1

ベースコントローラーは、ほとんど常に非常に悪い考えです。コントローラープラグインとコントローラーヘルパーは、ベースコントローラーの柔軟性に対処するために特別に作成されました(継承上の合成として要約できます)。したがって、すべての意味を理解していない限り、カスタムベースコントローラには決して依存しません。 –

43

ヘルパーやプラグインを使用せずに、だから私は、コントローラを持って

は...実行します。この後

Zend_Layout::getMvcInstance()->assign('whatever', 'foo'); 

あなたのレイアウトでは以下を使用できます:

<?php echo $this->layout()->whatever; ?> 

"foo"と表示されます。

+4

簡単な割り当ての場合、これは完全にエレガントなソリューションです!大好きです。 1 + –

+0

この方法で配列を割り当てることもできます – 10us

+0

チップをありがとう。その最初の行に余分なカッコがあります。 – getWeberForStackExchange

1

あなたはビューヘルパーを作成することで、別の解決策を得ることができます。アプリケーション/ビュー/ヘルパーでファイルを作成し、これまでに何を望んでいたかを指定してください。abc.php次にその上に次のコードを挿入します。アプリの中でいくつかの点でJSONを送信する場合

class Zend_View_helper_abc { 

    static public function abc() { 
     $html = 'YOUR HTML'; 
     return $html; 
    } 
} 

だから、グローバルビュー変数がに送信されないように注意してください、注意点として..レイアウトなどに

<?= $this->abc() ?> 
0

をこのヘルパーを使用することができますレスポンス。

3

標準ビュー変数は、MVC内のレイアウトを使用する場合に使用できます。

Zend_Layout::startMvc(); 

(あなたは、いくつかの異なるレイアウトをきめ細かく制御したい場合、あるいは各アクション)あなたは、各コントローラを伝える必要があり、使用するレイアウト:ブートストラップファイルでは、これは含まれています。私は各コントローラのinit()に私のものを置いています。ここでは例があります、あなたのレイアウトファイルの名前がlayout.phtml:

$this->_helper->layout->setLayout('layout'); 
1
class IndexController extends Zend_Controller_Action 
{ 

    public function init() 
    { 
     $this->_layout = $this->_helper->layout->getLayoutInstance(); 
     $this->_layout->whatever = $this->view->render('test.phtml); 
    } 
} 

レイアウトファイルで場合は、そのセクションをしたくない場合は、いくつかのアクションで

<p><?php echo $this->layout()->whatever ?> 

を呼び出すことができます次に:

public function viewAction() 
{ 
    $this->_layout->whatever = null; 
} 
0

ヘルプヘルパーも良いアイデアです。私は電子商取引のウェブサイトを持っていました。これにはデータベースから持ってくる必要があるカテゴリとサブカテゴリを持つメニューがあるlayout.phtmlがありました。このため

は、私は次のようでした:

bootstrap.phpの:

protected function _initHelperPath() 
{ 

    $view = $this->bootstrap('view')->getResource('view'); 

    $view->setHelperPath(APPLICATION_PATH . '/views/helpers', 'View_Helper'); 

} 

のapplication.ini:

ビュー/ヘルパーで
resources.view[]= 

、私はメニューと呼ばれるファイルを持っていました:

class View_Helper_Menus extends Zend_View_Helper_Abstract { 

    public function categories(){ 

     $categories = new Application_Model_DbTable_Categories(); 

     return $categories->fetchAll(); 

    } 

    public function subCategories(){ 

     $subCategories = new Application_Model_DbTable_SubCategories(); 

     return $subCategories->fetchAll(); 

    } 

} 

layout.phtmlでは、私は特定のヘルパーを呼び出し、そこからメソッドを呼び出す必要がありました:

$menu = $this->getHelper('Menus'); 
$categories = $menu->categories(); 
$subCategories = $menu->subCategories(); 

は、レイアウトをレンダリングするために、データベースからのデータを持参する必要が誰かに役立ちます願っています。

関連する問題