更新:関数createBlock
(in Mage_Core_Mode_Layout
) には$arguments
配列のパラメーターがありますが、ブロック コンストラクター (Magento の最新バージョン) が属性を渡さないことが判明しました。
$block = $this->addBlock($className, $blockName);
...
public function addBlock($block, $blockName)
{
return $this->createBlock($block, $blockName);
}
...
public function createBlock($type, $name='', array $attributes = array())
{
...
$block = $this->_getBlockInstance($type, $attributes);
...
}
したがって、この回答の核心は正しくありません。ただし、他の有用な情報が含まれているため、ここに回答を残します。
これがあなたがやろうとしている問題です。
レイアウト XML の各ノードは、ブロックの生成に使用される PHP コードの行を表します。
あなたが言う時
<block template="simplemenu/leftMenuTemplate.phtml"
舞台裏で何が起こっているかは次のようになります ($attributes
はノードの属性の表現です)
$block = new $block($attributes);
次に、Magento は次の行に遭遇します。
<action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action>
これは次のように翻訳されます
$block->setSimpleMenuInstanceRef('4');
したがって、あなたが直面している問題は、__construct
、_construct
、および_prepareLayout
メソッドが呼び出されたときに、Magento がaction
ノードを処理していないため、値が設定されていないことです。
考えられる解決策の 1 つは、データをブロックの属性として含めることです (my_data_here
以下を参照)。
<block template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label" my_data_here="4">
属性は、ブロックのコンストラクター メソッドに渡されます。基本ブロックには がありませんが、それが拡張__construct
するVarien_Object
クラスにはあります
#File: lib/Varien/Object.php
public function __construct()
{
$args = func_get_args();
if (empty($args[0])) {
$args[0] = array();
}
$this->_data = $args[0];
$this->_construct();
}
このコンストラクターは、最初のコンストラクター引数を取り、それをオブジェクト (この場合、オブジェクトはブロックです) のデータ配列として設定します。これは、そのデータを元に戻すことができることを意味します
$this->getMyDataHere();
$this->getData('my_data_here');
//...
1 つの警告。
これを行いたい場合、ブロック内に独自のコンストラクター メソッドを作成することはできません。これは、Varien_Object コンストラクターが呼び出されないことを意味するためです。そのため、すべてのブロックで単一のアンダースコア コンストラクター (_construct) を使用する必要があります。
しばらく前に、すべてのイベント ライフサイクル メソッドをカバーする記事を書きました。役に立つかもしれません。