1

同じカスタム ブロックを同じページで 2 回使用する必要がありますが、データベースから異なる値が読み込まれます。

したがって、各ブロックがデータベースからロードするデータを認識できるように、構成値 (ここでは SimpleMenuInstanceRef と呼ばれます) を page.xml ファイルからブロック/モデルに転送する必要があります。

私はこのブロックでそれをやっています:

    <block template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label">
        <label>Left menu header</label>
        <action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action>
        </block>

そして、これはちょっとうまくいきます。私の leftMenuTemplate.phtml で、私は

echo $this->getSimpleMenuInstanceRef()

これにより、構成からの値が表示されます。

しかし、値に応じてデータをロードできるように、ブロックの _construct メソッドに値が必要です。しかし、_construct で $this->getSimpleMenuInstanceRef を実行しても、何も返されません。では、どうすればブロック コードで値を取得できますか、または別の方法で値を転送する必要がありますか?

編集: 実際のコードと一致するように __construct を _construct に変更しました。

4

2 に答える 2

4

更新:関数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) を使用する必要があります。

しばらく前に、すべてのイベント ライフサイクル メソッドをカバーする記事を書きました。役に立つかもしれません。

于 2012-05-12T19:43:33.220 に答える
1

はい、必要です。ブロックを次のように宣言してみてください。

<block instance="4" template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label">
    <label>Left menu header</label>
</block>

これを行った後、「インスタンス」変数に簡単にアクセスできます。

protected function _construct() {
    parent::_construct();
    echo $this->getData('instance');
}
于 2012-05-12T18:38:49.650 に答える