Подтвердить что ты не робот

Magento XML, использующий до/после размещения блоков, вряд ли когда-либо работает

Я ведущий разработчик Magento, создал несколько моих собственных тем, и я хочу лучше понять расположение блоков XML Magento...

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

<cms_index_index>
   <reference name="root">
      <block type="core/template" name="example_block" as="exampleBlock" template="page/html/example-block.phtml"/>
   </reference>
</cms_index_index>

Это создаст блок на домашней странице (cms_index_index), и поскольку блок создается на одном уровне в root, я бы обычно вызывал блок, добавляя:

<?php echo $this->getChildHtml('exampleBlock') ?>

... до 1column.phtml (или 2columns-left/right.phtml, 3columns.phtml и т.д.). Блок можно поместить на любую страницу, заменив cms_index_index на соответствующий тег страницы.

Я вижу такие вещи, как следующие в основных файлах XML, и в учебниках:

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

content - это блок, который является частью общей структуры страниц magento, и, насколько я понимаю, before="content" должен размещать его там, где вы ожидаете, без использования getChildHtml('exampleBlock'), пока что так хорошо.. однако, до/после почти никогда не работает для меня, и я часто нахожу, что прибегаю к методу getChildHtml как резервное копирование, что не всегда идеально, и означает редактирование больше .phtml файлов, чем это необходимо.

Я пробовал:

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

Ничего не появляется...

<reference name="root">
   <block type="core/template" name="example_block" after="header" template="page/html/example-block.phtml"/>
</reference>

Все еще ничего.... Я также знаю, что я использовал before="-" или after="-", чтобы поместить что-то перед всем внутри него родительским блоком. Мне иногда повезло с этим, но, как правило, просто путайте и расстраивайтесь.

Я искал по всему миру "magento xml до/после того, как не работал", и начал задаваться вопросом, может ли это просто меня это случилось... может кто-нибудь объяснить, когда я могу и не могу использовать до/после, чтобы позиционные блоки? Что не так с приведенными выше примерами?

Я в magento 1.7.0.2 (последний доступен во время публикации)

Основная мотивация для этого - уменьшить количество основных .phtml файлов, которые мне нужно изменить, просто добавив getChildHtml(), поэтому, если есть другой (XML) способ обойти это, мне было бы интересно узнать...

4b9b3361

Ответ 1

Атрибуты before и after работают только в одном из двух случаев:

  • Когда вы вставляете в блок core/text_list
  • Когда ваш шаблонный блок вызывает getChildHtml без каких-либо параметров

Когда вы говорите

<reference name="root">
   <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/>
</reference>

вы говорите Magento

Привет, Magento, поставьте example_block внутри блока root.

Когда вы помещаете несколько разных блоков внутри родителя, эти блоки имеют неявный порядок. Для блоков шаблонов этот порядок не имеет значения, поскольку эти блоки явно отображаются.

<?php echo $this->getChildHtml('example_block') ?>

Однако есть два случая, когда порядок имеет значение. Во-первых, если вы вызываете

<?php echo $this->getChildHtml() ?>

из шаблона, Magento будет отображать все дочерние блоки в порядке.

Во-вторых, существует специальный тип блока, называемый "текстовым списком" (core/text_list/Mage_Core_Block_Text_List). Эти блоки делают все свои дети автоматически, снова в порядке. Блок content является примером этого

<block type="core/text_list" name="content"/>

Вот почему вы можете вставлять блоки в content, и они автоматически отображаются.

Итак, в приведенном выше примере вы вставляете блоки в блок root. Блок root является блоком шаблона, в phtml-шаблоне которого используются вызовы getChildHtml с явными параметрами. Поэтому атрибуты before и after не делают то, что вы (и многие другие, включая меня), хотели бы, чтобы они это сделали.