web-dev-qa-db-ja.com

Zend Frameworkのレイアウトに変数を送信する

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

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

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

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

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

echo $this->whatever;

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

38
user138095

レイアウトisビューであるため、変数を割り当てる方法は同じです。この例では、レイアウトで$ this-> whateverをエコーすると、同じ出力が表示されます。

一般的な問題の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());

46
Tim Fountain

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

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

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

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

これは「foo」を出力します。

43
10us

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

コントローラーがあります...

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

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

<?= $this->foo ?>
7
user138095

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

Zend_Layout::startMvc();

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

$this->_helper->layout->setLayout('layout');
3
jMo

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

class Zend_View_helper_abc {

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

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

<?= $this->abc() ?>
1
Haroon
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;
}
1
kaushik

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

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

0
Bruce

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

0
conradfr