39

私のプロジェクトには、すべてのページに一貫して存在するいくつかの動的要素があります。これらをlayout.phtmlに入れました

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

コントローラから送信したい場合は、次を使用できます。

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

そして、ビューでそれを受け取ります

echo $this->whatever;

自分のレイアウトで同じことを行う方法がわかりません。おそらく、問題を回避するためのより良い方法がありますか?

4

8 に答える 8

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());

于 2009-10-08T13:47:52.233 に答える
43

ヘルパーやプラグインを使用せずに:

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

この後、レイアウトで以下を使用できます。

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

これにより、「foo」が出力されます。

于 2010-08-10T17:46:32.870 に答える
7

他のすべてのコントローラーが拡張するベースコントローラーを実装しました。

だから私はコントローラーを持っています...

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

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

<?= $this->foo ?>
于 2009-10-08T14:15:34.067 に答える
3

MVC内でレイアウトを使用する場合は、標準のビュー変数を使用できます。ブートストラップファイルに、これを含めます。

Zend_Layout::startMvc();

次に、使用するレイアウトを各コントローラー(または、複数の異なるレイアウトをきめ細かく制御したい場合は各アクション)に指示する必要があります。私は各コントローラーのinit()に私のものを入れました。レイアウトファイルの名前がlayout.phtmlの場合の例を次に示します。

$this->_helper->layout->setLayout('layout');
于 2012-09-25T14:45:56.930 に答える
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;
}
于 2013-02-21T02:35:44.713 に答える
1

ビューヘルパーを作成することで別の解決策が得られると思います。application/views/ helperにファイルを作成し、好きな名前をabc.php付けて、そこに次のコードを配置します。

class Zend_View_helper_abc {

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

したがって、このヘルパーを次のようなレイアウトで使用できます。

<?= $this->abc() ?>
于 2011-10-13T06:12:25.630 に答える
0

補足として、アプリのある時点でjsonを送信する場合は、グローバルビュー変数が応答とともに送信されないように注意してください。

于 2012-04-16T10:27:57.630 に答える
0

ビューヘルパーも良い考えです。私はeコマースのWebサイトを持っていました。これには、データベースから取得する必要のあるカテゴリとサブカテゴリのメニューを含む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[]=

ビュー/ヘルパーに、Menusというファイルがありました。

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();

レイアウトをレンダリングするためにデータベースからデータを取得する必要がある人に役立つことを願っています。

于 2013-11-05T22:01:05.987 に答える