Magento 2 - имя блока против имени

10

Я немного поработал в Magento 2 и переписывал некоторые установленные мной модули (на веб-интерфейсе).

Однако сегодня я только что столкнулся с чем-то, с чем я не сталкивался раньше. Модуль, который я использовал, имеет внутри блок, который имеет следующее:

<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>

Он устанавливает свое имя:

posts.tab

а затем использует as, чтобы разрешить вызов через:

а = "blog.posts"

Когда я попытался сослаться на блок, который нужно удалить, используя имя as, я заметил, что он не удаляет его со страницы:

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

поэтому я посмотрел, что на самом деле вызывается на странице во внешнем интерфейсе (только в том случае, если она была переименована где-то еще или не использовала имя posts.tab) - имя блока вызывается с posts.tab , что хорошо как я могу просто сослаться на этот блок, чтобы удалить его. Это работало нормально.

Но мой вопрос заключается в том, почему блок не проходит через as и вместо этого используется имя .

Во-вторых, какой смысл в as , потому что блоки, очевидно, не могут иметь конфликтующих имен в любом случае и должны быть уникальными - но я могу быть совершенно неправ.

Энди Джонс
источник

Ответы:

2

В этом случае кажется, что атрибут as бесполезен (если он не используется где-либо еще), я не думаю, что это имеет значение, если он вызывается через имя или псевдоним, поэтому разработчик должен сам выбрать, что использовать - просто отметьте, что если установлен псевдоним, вам нужно будет использовать его при вызове getChildHtml.

Лично я буду использовать псевдоним только для того, чтобы сократить длинное имя блока и / или сделать его легко читаемым при рендеринге через шаблон. Например, если checkout.header.logo.textнеобходимо использовать как logo.textи header.logo.textуже используется, вы можете использовать псевдоним logoTextдля всех блоков. Это не повлияет на рендеринг других блоков с использованием того же псевдонима, если они не установлены в том же дескрипторе и ссылке.

TL: DR. Это не имеет большого значения, это больше для удобочитаемости / сокращения имен.

Ноты

Этот вопрос M1 имеет немного больше информации, чтобы - Когда использовать «имя» и когда использовать «как»

Я не уверен, относится ли это к M2, но в M1 был вызван хотя бы один аргумент, aliasкоторый использовал asатрибут, я думаю, это было связано со вставкой или отменой установки блоков.

По словам Фабиана Шменглера: «Если блок был создан без определения псевдонима, псевдоним по умолчанию имеет имя». Это относится к M1, но я предполагаю, что то же самое относится и к M2.

Бен Крук
источник
Только что на 2.3.1 я не смог получить getChildHtml по имени, потому что блок имел псевдоним "as". Только после удаления псевдонима я смог получить блок в шаблоне.
TheKitMurkit
Хороший вопрос @TheKitMurkit - я добавил к своему ответу немного, в котором говорится, что «если задан псевдоним, его нужно использовать при вызове getChildHtml.». Спасибо.
Бен Крук