web-dev-qa-db-ja.com

Magento-コントローラーとブロックの間でデータを渡す

本当に迅速で簡単な質問ですが、これに対するまともな答えが見つかりません-データをコントローラーからMagentoのブロックに渡す最良の方法は何ですか?.

違いが生じる場合は、次のようにレイアウトをロードしています。

 $this->loadLayout(array('default', 'myModule_default'));

    $this->_initLayoutMessages('customer/session')
         ->_initLayoutMessages('catalog/session')
         ->renderLayout();

次のようにレジストリを使用していることを追加する必要があります。

コントローラー内:

Mage::register('data', $data);

ブロック内:

$data = Mage::registry('data');

ただし、これが最善の方法であるかどうかはわかりません。

46
Drew Hunter

あなたはしません。

MagentoのMVCアプローチでは、ビューの変数を設定することはコントローラーの責任ではありません(Magentoの場合、ビューはレイアウトとブロックです)。コントローラーはモデルに値を設定し、次にそれらの同じモデルからブロックを読み取ります。 Magentoの世界観では、特定の処理を行うコントローラーに依存するブロックを持つことは密結合であり、避けるべきです。

コントローラーの仕事は、モデルに対して特定のことを行い、システムにレイアウトレンダリング時間を伝えることです。それでおしまい。システムのモデルの状態に応じて特定の方法でHTMLページを表示するのは、レイアウト/ブロックジョブです。

したがって、従来のPHP MVCの動作をエミュレートしたい場合

  1. _Varien_Object_から継承する単純なModelクラスを作成します

  2. コントローラーで、Mage::getSingleton('foo/bar')を使用してそのオブジェクトをインスタンス化します

  3. マジックゲッター/セッター(_Varien_Object_から継承するオブジェクトで取得)またはsetDataなどを使用して、モデルに値を設定します。

  4. ブロックで、Mage::getSingleton('foo/bar')を使用してモデルを再度インスタンス化し、値を読み戻します。

Mage::getSingleton(...)でモデルをインスタンス化すると、Magentoはオブジェクトをインスタンス化しますシングルトンとして。したがって、オブジェクトを再度インスタンス化すると(再びMage::getSingleton('foo/bar')を使用して)同じオブジェクトが返されます。

83
Alan Storm

_Mage_Core_Block_Template_(つまり、テンプレートを使用して表示する)を継承するブロックを使用している場合、assign()メソッドを使用してデータを割り当てることができます、ブロックがloadLayout()によってインスタンス化されると

_$this->loadLayout(array('default', 'myModule_default'));

$this->getLayout()->getBlock('your.block.name.in.the.layout')->assign('data', $data);
_

次に、.phtmlテンプレートで、単に使用できます

_<?php echo $data ?>
_

これはmagentoではあまり使用されませんが、パブリックメソッドとして実装されているため、安定していると宣言されているので、そうするのは問題ないと思います。これは、テンプレートで宣言された変数をアンダースコア(たとえば、$_product = $this->getProduct())で開始する規則の理由でもあるため、割り当てられた変数と区別できます。

35
Vinai

私のために働いたのは、以下を行うことでコントローラーに変数を設定することです:

Mage::register('variable', 'value');

次に、ビューで次のコードを使用して値を取得します。

$variable = $this->getVariable();
4
Josh Pennington

@Drew JavaServer Facesのバックグラウンドがいくらかあり、PHP/Magentoのかなり新しいものです。

「PHPの「何も共有しない」アーキテクチャ」、

PHPはJavaではありません:Session Management Whitepaper " を参照してください。PHPのスコープはすべて" request "であるという事実につながります。

私がアランズポイントを得た場合、彼は使用することをお勧めします

  • データベースに保存されるとは限らないデータを属性に持つ「ステートフル」モデルオブジェクト
  • mage :: getSingletonを使用したシングルトンパターンは、このステートフルモデルを作成します。このステートフルモデルは、コントローラでインスタンス化され、ブロックにアクセスできるため、出力をレンダリングする実際のテンプレートで使用できます。

そして MTool のようなツールは新しいモデルを作成する時間を短縮するので、これは本当に理にかなっているようです。

0
paderEpiktet

一部の値にはsetData/getDataのペアを使用できます。コントローラでsetDataを使用し、ブロックでgetDataを使用しました。

0
Taras