Magento 2 - Blockname vs als Name

10

Ich habe in Magento 2 gearbeitet und einige von mir installierte Module (im Frontend) überschrieben.

Heute bin ich jedoch auf etwas gestoßen, das mir noch nie begegnet ist. Das Modul, das ich verwendet habe, enthält einen Block, der Folgendes enthält:

<referenceBlock name="product.info.details">
    <block class="Vender\Module\Block\Catalog\Related" name="posts.tab" as="blog.posts"
               template="Vender_Module::catalog/posts.phtml" group="detailed_info">
    </block>
</referenceBlock>

Es setzt seinen Namen:

posts.tab

und verwendet dann das as , um den Aufruf über zu ermöglichen:

as = "blog.posts"

Als ich versuchte, den zu entfernenden Block mit dem Namen as zu referenzieren, bemerkte ich, dass er nicht von der Seite entfernt wurde:

<referenceBlock name="product.info.details">
    <referenceBlock as="blog.posts" remove="true"/>
</referenceBlock>

Also habe ich nachgesehen, wie die Seite im Frontend tatsächlich aufgerufen wurde (nur für den Fall, dass sie an einer anderen Stelle umbenannt wurde oder nicht den Namen posts.tab verwendet). Der Blockname wird mit posts.tab aufgerufen , was in Ordnung ist da ich nur auf diesen Block verweisen kann, um ihn zu entfernen. Das hat gut funktioniert.

Aber meine Frage ist, warum wird der Block nicht mit as durchgezogen und stattdessen mit dem Namen durchgezogen .

Zweitens, worum geht es im as , denn offensichtlich können Blöcke ohnehin keine widersprüchlichen Namen haben und sollten eindeutig sein - aber ich könnte völlig falsch liegen.

Andy Jones
quelle

Antworten:

2

In diesem Fall scheint das as-Attribut nutzlos zu sein (es sei denn, es wird an anderer Stelle verwendet). Ich denke, es macht keinen Unterschied, ob es über den Namen oder den Alias ​​aufgerufen wird. Es liegt also beim Entwickler, zu entscheiden, was verwendet werden soll - beachten Sie dies einfach Wenn ein Alias ​​festgelegt ist, müssen Sie diesen beim Aufrufen verwenden getChildHtml.

Persönlich verwende ich Alias ​​nur, um einen langen Blocknamen zu verkürzen und / oder um ihn beim Rendern über eine Vorlage leicht lesbar zu machen. Wenn beispielsweise verwendet werden checkout.header.logo.textmuss logo.textund header.logo.textbereits verwendet wird, können Sie den Alias logoTextfür alle Blöcke verwenden. Dies würde sich nicht auf das Rendern der anderen Blöcke mit demselben Alias ​​auswirken, es sei denn, sie sind im selben Layout-Handle und derselben Referenz festgelegt.

TL: DR Es macht keinen großen Unterschied, es ist eher für die Lesbarkeit / Verkürzung von Namen.

Anmerkungen

Diese M1-Frage enthält etwas mehr Informationen zu - Wann 'Name' und wann 'Als' zu verwenden ist.

Ich bin nicht sicher, ob dies für M2 gilt, aber in M1 wurde mindestens ein Argument aufgerufen alias, das das asAttribut verwendete. Ich denke, es bezog sich auf das Einfügen oder Deaktivieren von Blöcken.

Laut Fabian Schmengler: "Wenn der Block ohne Definition eines Alias ​​erstellt wurde, wird standardmäßig der Name verwendet." Das bezieht sich auf M1, aber ich nehme an, dass das Gleiche für M2 gilt.

Ben Crook
quelle
Gerade in 2.3.1 konnte ichChildHtml nicht namentlich abrufen, da der Block den Alias ​​"as" hatte. Erst nach dem Löschen des Alias ​​konnte ich den Block in einer Vorlage erhalten.
TheKitMurkit
Guter Punkt @TheKitMurkit - Ich habe meiner Antwort etwas hinzugefügt, das besagt: "Wenn ein Alias ​​festgelegt ist, müssen Sie diesen beim Aufrufen von getChildHtml verwenden." Vielen Dank.
Ben Crook