Magento 2-Vorlagen: Verwenden Sie "$ block" oder "$ this"?

27

In Magento 2 $thisverweist die Variable nicht mehr auf das Blockobjekt einer Vorlage. Es bezieht sich auf eine Vorlagenklasse

 Magento\Framework\View\TemplateEngine\Php

Diese Vorlagenklasse verfügt jedoch über eine Passthrough- __callMethode

#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
    return call_user_func_array([$this->_currentBlock, $method], $args);
}

Damit stellen Sie sicher, dass alle Methodenaufrufe den eigentlichen Block erreichen. Dies erklärt auch, warum Sie geschützte Methoden nicht aus phtmlVorlagen aufrufen können .

Darüber hinaus enthält jede (glaube ich?) Vorlage eine Variable mit dem Namen $blockpopulated, die sich auch auf das übergeordnete Blockobjekt bezieht. Sie können dies in der Listenvorlage von Magento sehen

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

wo die $blockVariable verwendet wird, aber nie explizit definiert.

Gibt es, abgesehen von den oben genannten Unterschieden, einen Unterschied zwischen der Verwendung einer Technik gegenüber der anderen? dh beides $blockund $this->currentBlockauf dasselbe Objekt verweisen?

Alan Storm
quelle

Antworten:

32

In einer Vorlagendatei sind $blockund $this->_currentBlockdasselbe.

Schauen Sie sich die renderMethode in der Php.phpTemplate Engine an.
Vor dem Einfügen der Vorlagendatei geschieht dies: $this->_currentBlock = $block;Dann wird die Vorlagendatei mit einem einfachen Befehl eingefügt include $fileName;.
Dies bedeutet, dass Sie sich in einer Vorlage immer noch in der PhpVorlagen-Engine befinden. Deshalb $thisfunktioniert es, und deshalb $blockist es definiert.

[BEARBEITEN]
Ich habe gerade herausgefunden, dass die Verwendung von $thisinternen Vorlagen nicht empfehlenswert ist.
Der PHP-Sniffer mit den EcgM2-Standards zeigt eine Warnung an, wenn er interne $thisVorlagen verwendet.
Durch Ersetzen $thisdurch $blockwird die Warnung ausgeblendet.

Marius
quelle
Welches ist das Standardobjekt in der .phtml-Datei $ block oder $ this?
Manish Goswami
Was meinst du standardmäßig?
Marius
Welche Standardvariable wird in einer Vorlage verwendet, um auf die Rendering-Klasse der Vorlage zuzugreifen? Gibt es einen Unterschied zwischen diesen beiden Zugriffsfunktionen?
Manish Goswami
Es heißt in jeder Antwort. Beide funktionieren aber es wird empfohlen$block
Marius
5

Soweit ich gesehen habe, sind beide in PHP TemplateEngineInterface fast gleich, aber denken Sie daran, dass Sie in Magento2 benutzerdefinierte Template-Engines erstellen können. Nicht wie Magento1, in dem Sie gerade HTML-Dateien hatten.

Wenn Sie das sehen TemplateEngineInterface, können Sie keinen Verweis auf eine Methode sehen, die das aufruft currentBlock, also denke ich, dass der $this->currentBlockAnsatz PHP-Template-spezifisch ist.

Um aber unabhängig von der Template-Engine zu sein, $blocksollte der richtige Ansatz gewählt werden.

Ich meine, aus theoretischer Sicht könnten Sie eine andere PHP-basierte Engine erstellen, die sich nicht auf PHP-Dateien stützt, sondern auf eine andere PHP-Struktur.

ich nehme an $block als "richtigen" Weg für den "phtml" -Modus an, da er explizit als Kontextvariable übergeben wird.

$blockund $this->currentBlocksind vom technischen Standpunkt aus gleich, aber wenn sie ausdrücklich verwendet werden $block, sollten wir sie meines Erachtens vom Standpunkt des Code-Stils aus verwenden.

Phoenix128_RiccardoT
quelle
Aber auch $ block ist nicht Teil der Schnittstelle. Ich würde sagen, es ist sicher anzunehmen, dass diese Implementierung verwendet wird, wenn Sie in einer HTML-Datei sind. Andere Implementierungen verwenden die HTML-Datei nicht.
Fabian Schmengler
Du hast recht, ich war mir in meiner Antwort nicht klar, was ich meine. Ich habe meinen Beitrag mit mehr Details geändert.
Phoenix128_RiccardoT