Где находится содержимое ‹?php echo $this-›getChildHtml('right') ?›

Я пытаюсь реорганизовать правую боковую панель. В шаблоне (2 столбца справа) он вызывает:

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

Где я могу найти содержимое этой переменной?


person Urvisha    schedule 16.04.2013    source источник


Ответы (3)


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

Чтобы определить, где найти этот дочерний блок, нам нужно знать, какой блок вызывает этот метод. Я знаю, что этот конкретный вызов метода getChildHtml() появляется в шаблоне столбца главной страницы, поскольку right является одним из столбцов. Итак, загляните в файл макета page.xml и найдите файл шаблона, внутри которого вы нашли вызов метода, вы найдете что-то вроде этого:

<reference name="root">
    <action method="setTemplate"><template>page/2columns-right.phtml</template></action>
    <!-- Mark root page block that template is applied -->
    <action method="setIsHandle"><applied>1</applied></action>
</reference>

Использование тега <reference> в файле макета позволяет вам изменить целевой блок, а тег <action> позволяет запускать метод блока внутри блока, с которым вы работаете. Таким образом, этот раздел макета устанавливает шаблон внутри блока root. Отсюда мы знаем, что это блок root, вызывающий метод getChildHtml().

Далее давайте посмотрим, где в макете определен блок root, он находится в том же файле макета page.xml и должен быть прямо вверху:

<block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">
    ...
    <block type="core/text_list" name="right" as="right" translate="label">
        <label>Right Column</label>
    </block>
    ...
</block>

В этом блоке определено довольно много, но вы можете видеть, что ему присвоено имя root и определено довольно много дочерних блоков. Один из этих дочерних блоков называется right, и это именно этот блок, HTML-код которого выводится методом getChildHtml(). Важно отметить тип блока — core/text_list. Это особый тип блока, который означает, что при рендеринге HTML для этого блока с использованием метода getChildHtml() дочерние блоки также будут рендериться. Если бы тип блока был page/html, как и в случае с корневым блоком, каждый дочерний блок, добавленный к блоку right, нуждался бы в собственном вызове метода getChildHtml(), используя этот тип блока, вам нужен только вызов getChildHtml('right') и всех дочерних блоков. блоки также будут отображаться.

Как видите, здесь определен блок right, но он пуст. Это связано с тем, что точно так же, как ваш тег ссылается на корневой блок (<reference name="root">), другие файлы макета добавляют дочерние блоки к блоку right, ссылаясь на блок right.

<reference name="right">
    ...
</reference>

Итак, чтобы, наконец, ответить на ваш вопрос (и, надеюсь, немного сообщить по пути), вам нужно искать в файлах макета, отличных от page.xml, ссылки на блок right, здесь вы найдете все дочерние вывод содержимого вызовом метода getChildHtml().

Вы можете изменить то, что добавляется в блок right в вашем собственном файле макета модуля или в файле макета local.xml, если вы не создаете модуль. Я кратко рассказываю о файле макета local.xml в своем ответе здесь с примером синтаксиса для добавления новых блоков и удаления блоков, добавленных в другие файлы макета.

person Jonathan Hussey    schedule 16.04.2013

Вы найдете в своем файле layout.xml, откуда все приходит. В нем будут блоки списка, под которыми вызовите файлы .phtml и данные оттуда. Надеюсь, вы понимаете, что я пытаюсь донести.

person Chiragit007    schedule 16.04.2013
comment
layout.xml == catalog.xml? @chiragit007 - person Urvisha; 16.04.2013

<reference name="right">  
    <block type="yourmodule/yourblock" name="yourblock" as="yourblock" />
 </reference>

Вы можете добавить свои пользовательские блоки вот так.

person Chiragit007    schedule 16.04.2013
comment
у меня тоже проблема с макетом, не могли бы вы помочь мне с этим: <layout version="1.0"> <adminhtml_sales_order_shipment_view> <reference name="content"> <block type="paketid_booking/adminhtml_sales_order_shipment_view_booking" name="paketid_booking" template="paketid/booking.phtml" /> </reference> </adminhtml_sales_order_shipment_view> </layout> мой пользовательский блок не отображается в представлении о доставке? что мне не хватает? для полного вопроса взгляните: stackoverflow. ком/вопросы/39340112/ - person may; 06.09.2016