プログラムによるブロック引数の設定と取得


8

レイアウトでは、ブロックを作成するときにカスタム引数を設定できます。次に例を示します。

<block class="Company\Module\Block\Hello" name="block_name" template="test.phtml">
    <arguments>
        <argument name="my_arg" xsi:type="string">testvalue</argument>
    </arguments>
</block>

後でブロック内でこのような引数を取得できます。

$arg = $this->getMyArg();

プログラムでブロックを作成すると(このメソッドに従って:link)、次のようにカスタム引数を設定できます。

$block = $this->frameworkViewLayout
    ->createBlock(
        "Company\Module\Block\Hello",
        "block_name",
        ['my_arg' => 'testvalue']
    )
    ->setData('area', 'frontend')
    ->setTemplate($template)
    ->toHtml();

ブロックは正しく作成され、完全に機能します。しかし、後でブロックのクラス内の引数取得する方法がわかりません。私はこのようにしてみました:

$arg = $this->getMyArg();

または

$arg = $this->getData('my_arg');

しかし、それは何も返しません。私は何を取りこぼしたか?

回答:


17

さらにコードの\Magento\Framework\View\Layout\Generator\Blockクラスを見ると、createBlock関数は$arguements['data']要素からのデータのみを追加します。したがって、コードを次のように変更する必要があると思います。

$block = $this->frameworkViewLayout
    ->createBlock(
        "Company\Module\Block\Hello",
        "block_name",
        [
            'data' => [
                'my_arg' => 'testvalue'
            ]
        ]
    )
    ->setData('area', 'frontend')
    ->setTemplate($template)
    ->toHtml();

次に、getMyArg()またはを使用できますgetData('my_arg')


引数が配列にある場合引数が<block class = "Company \ Module \ Block \ Hello"のような配列にある場合の変換方法name = "block_name" template = "test.phtml"> <arguments> <argument name = "jsLayout" xsi:type = "array"> <item name = "components" xsi:type = "array"> <item name = "msp-recaptcha" xsi:type = "array"> <item name = "component" xsi:type = "string"> MSP_ReCaptcha / js / reCaptcha </ item> <item name = "zone" xsi:type = "string"> create </ item> </ item> </ item> </ argument> </ arguments>
paras sakariya

私はあなたのコードを使用しましたが、ヘッダーとフッターの呼び出しではなく、本体部分のみを取得しています
Jinesh

2

次のような変数を直接割り当てることができます。

$block = $this->_layout
    ->createBlock('Magento\Framework\View\Element\Template')
    ->setTemplate('Company_Namespace::index.phtml')
    ->setResponse('response')
    ->toHtml();
return $block;

テンプレートファイルで変数値を取得するには、

echo $block->getResponse();

1

ここでジャッキーによって言及されたような引数を持つ「データ」配列を送信するときの注意:

$block = $this->frameworkViewLayout
->createBlock(
    "Company\Module\Block\Hello",
    "block_name",
    [
        'data' => [
            'my_arg' => 'testvalue'
        ]
    ]
)
->setData('area', 'frontend')
->setTemplate($template)
->toHtml();

$ data変数をブロック定義に挿入しないようにします(__constructメソッド)


すみませんが、どういう意味かわかりません。説明できる?
zitix 2017年

0

私はMagento 2を初めて使用しますが、$my_argまたはを使用してみてください$block->getMyArg()

の使用は避け$this、を使用してください$block

呼び出す$this$blockクラスのプロキシメソッドがアクティブになりますが、ゲッターのような魔法のメソッドで問題が発生しました。


ブロッククラス(Company\Module\Block\Hello.php)内で使用しているので、使用する必要があります$this。変数$blockが存在しないため、使用しようとするとエラーが発生しますNotice: Undefined variable: block
zitix 2016年

ああ、申し訳ありませんが、テンプレートファイルで使用していたことを理解しました。
Phoenix128_RiccardoT 2016年

$ my_argをコンストラクターのパラメーターとして使用して確認しましたか?
Phoenix128_RiccardoT 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.