本当に迅速で簡単な質問ですが、これに対するまともな答えが見つかりません-データをコントローラーからMagentoのブロックに渡す最良の方法は何ですか?.
違いが生じる場合は、次のようにレイアウトをロードしています。
$this->loadLayout(array('default', 'myModule_default'));
$this->_initLayoutMessages('customer/session')
->_initLayoutMessages('catalog/session')
->renderLayout();
次のようにレジストリを使用していることを追加する必要があります。
コントローラー内:
Mage::register('data', $data);
ブロック内:
$data = Mage::registry('data');
ただし、これが最善の方法であるかどうかはわかりません。
あなたはしません。
MagentoのMVCアプローチでは、ビューの変数を設定することはコントローラーの責任ではありません(Magentoの場合、ビューはレイアウトとブロックです)。コントローラーはモデルに値を設定し、次にそれらの同じモデルからブロックを読み取ります。 Magentoの世界観では、特定の処理を行うコントローラーに依存するブロックを持つことは密結合であり、避けるべきです。
コントローラーの仕事は、モデルに対して特定のことを行い、システムにレイアウトレンダリング時間を伝えることです。それでおしまい。システムのモデルの状態に応じて特定の方法でHTMLページを表示するのは、レイアウト/ブロックジョブです。
したがって、従来のPHP MVCの動作をエミュレートしたい場合
_Varien_Object
_から継承する単純なModelクラスを作成します
コントローラーで、Mage::getSingleton('foo/bar')
を使用してそのオブジェクトをインスタンス化します
マジックゲッター/セッター(_Varien_Object
_から継承するオブジェクトで取得)またはsetData
などを使用して、モデルに値を設定します。
ブロックで、Mage::getSingleton('foo/bar')
を使用してモデルを再度インスタンス化し、値を読み戻します。
Mage::getSingleton(...)
でモデルをインスタンス化すると、Magentoはオブジェクトをインスタンス化しますシングルトンとして。したがって、オブジェクトを再度インスタンス化すると(再びMage::getSingleton('foo/bar')
を使用して)同じオブジェクトが返されます。
_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()
)で開始する規則の理由でもあるため、割り当てられた変数と区別できます。
私のために働いたのは、以下を行うことでコントローラーに変数を設定することです:
Mage::register('variable', 'value');
次に、ビューで次のコードを使用して値を取得します。
$variable = $this->getVariable();
@Drew JavaServer Facesのバックグラウンドがいくらかあり、PHP/Magentoのかなり新しいものです。
「PHPの「何も共有しない」アーキテクチャ」、
PHPはJavaではありません:Session Management Whitepaper " を参照してください。PHPのスコープはすべて" request "であるという事実につながります。
私がアランズポイントを得た場合、彼は使用することをお勧めします
そして MTool のようなツールは新しいモデルを作成する時間を短縮するので、これは本当に理にかなっているようです。
一部の値にはsetData/getDataのペアを使用できます。コントローラでsetDataを使用し、ブロックでgetDataを使用しました。