Blockargumente programmgesteuert setzen und abrufen

8

Wenn ich im Layout einen Block erstelle, kann ich benutzerdefinierte Argumente festlegen, zum Beispiel:

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

Ich kann das Argument später im Block wie folgt abrufen:

$arg = $this->getMyArg();

Wenn ich einen Block programmgesteuert erstelle (gemäß dieser Methode: link ), kann ich benutzerdefinierte Argumente wie folgt festlegen:

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

Der Block ist korrekt erstellt und funktioniert einwandfrei. Ich bin mir jedoch nicht sicher, wie ich das Argument später in der Klasse des Blocks abrufen kann . Ich habe versucht, es so zu machen:

$arg = $this->getMyArg();

oder

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

Aber es gibt nichts zurück. Was habe ich verpasst?

zitix
quelle

Antworten:

17

Wenn Sie im Code in der \Magento\Framework\View\Layout\Generator\BlockKlasse weiter suchen , createBlockfügt die Funktion nur Daten aus dem $arguements['data']Element hinzu. Ich denke, Sie sollten Ihren Code folgendermaßen ändern:

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

Dann könnten Sie getMyArg()oder verwenden getData('my_arg').

Jackie Lowery
quelle
Was ist, wenn Argumente im Array? Konvertieren, wenn das Argument im Array ist wie <block class = "Firma \ Modul \ Block \ Hallo" name = "blockname" template = "test.phtml"> <argumente> <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> </ argument>
Paras Sakariya
Ich habe Ihren Code verwendet, aber ich
bekomme
2

Sie können direkt jede Variable wie zuweisen,

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

und um einen variablen Wert in der Temlate-Datei zu erhalten,

echo $block->getResponse();
Paras Sakariya
quelle
1

Beachten Sie beim Senden eines 'Daten'-Arrays mit Argumenten, wie sie von Jackie hier erwähnt wurden:

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

Vermeiden Sie das Einfügen von $ data-Variablen in die Blockdefinition (__construct-Methode).

jaro
quelle
Es tut mir leid, aber ich verstehe nicht, was du meinst. Können Sie erklären?
Zitix
0

Ich bin ziemlich neu in Magento 2, aber versuche es mit $my_argoder $block->getMyArg().

Sie sollten die Verwendung vermeiden $this, Sie sollten verwenden $block.

Durch das Aufrufen $thiswird eine Proxy-Methode für den $blockUnterricht aktiviert , aber ich hatte Probleme mit magischen Methoden wie Getter.

Phoenix128_RiccardoT
quelle
Ich benutze es in block class ( Company\Module\Block\Hello.php), also muss ich es benutzen $this. Die Variable $blockist dort nicht vorhanden. Wenn ich versuche, sie zu verwenden, wird eine Fehlermeldung angezeigt Notice: Undefined variable: block.
Zitix
Oh, sorry, ich habe verstanden, dass Sie in einer Vorlagendatei verwendet haben.
Phoenix128_RiccardoT
Haben Sie versucht, $ my_arg als Parameter in Ihrem Konstruktor zu verwenden und zu überprüfen?
Phoenix128_RiccardoT