Обновление макета: невозможно добавить дочерний блок в XML макета по ссылке

8

У меня проблема, когда я не могу добавить дочерний блок в XML-файл макета. Что я делаю не так в mylayout.xmlтом, что не могу загрузить abc? У меня есть следующие файлы.

onestepcheckout.xml

<onestepcheckout_index_index>
    ...
    <reference name="content">
        <block type="onestepcheckout/checkout" name="onestepcheckout.checkout" template="onestepcheckout/checkout.phtml">
            ...
            <!-- this child block can be loaded -->
             <block type="block/class" template="path/to/template/template.phtml" name="qwe" as="qwe" />
            ...
        </block>
    </reference>
    ...
</onestepcheckout_index_index>

mylayout.xml

<onestepcheckout_index_index>
    <reference name="onestepcheckout.checkout">
        <!-- this child block can not be loaded -->
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>

checkout.phtml

...
<?php echo $this->getChildHtml('abc') // doesn't work ?>
<?php echo $this->getChildHtml('qwer') // works ?>
...
musicliftsme
источник

Ответы:

8

Если это проблема загрузки модуля, я думаю, вы должны добавить тег в файл объявления модуля. как ниже

<depends> <companyname_modulename/> </depends>

Это гарантирует, что ваш модуль будет загружен после companyname_modulename

Дханпат Саран
источник
4

Я узнал почему. Сначала загружается мое расширение, а после моего загружается расширение, которое загружает onestepcheckout_index_index. Поэтому мое обновление макета ссылается на дескриптор, который еще не существует ..

musicliftsme
источник
4

Просто чтобы уточнить это. Несколько шагов было необходимо. Сначала объявите блок как дочерний блок.

<action method="setChild"><alias>my_name</alias><child>my.name</child></action>

Затем добавьте зависимость в файл объявления вашего модуля. В моем случае это былоIdev_OneStepCheckout

<depends>
    <Idev_OneStepCheckout />
</depends>

Наконец, в шаблоне он будет работать только при использовании псевдонима.

echo $this->getChildHtml('my_name')
Майкл Тессел
источник
2

Не уверен, почему это тоже не работает. Вы пытались явно объявить блок как ребенка?

<onestepcheckout_index_index>
    <reference name="onestepcheckout.checkout">
        <!-- this child block can not be loaded -->
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
        <action method="setChild"><child>abc</child><alias>abc</alias></action>
    </reference>
</onestepcheckout_index_index>
дон
источник
Я попробовал, но это все еще не работает. Странно то, что у меня есть другие обновления, в my layout.xmlкоторых используется тот же метод, и все они работают.
musicliftsme
1
Я узнал почему. Сначала загружается мое расширение, а загружаемое расширение onestepcheckout_index_indexзагружается после моего. Поэтому в моем обновлении макета использовался дескриптор, которого еще не существует.
musicliftsme
@laketuna, это очень интересно, у меня недавно была похожая проблема и я просто использовал наблюдателя, но этот вопрос снова вызвал мое любопытство, спасибо
pzirkind
1

Если вы хотите добавить новый блок, вы должны ссылаться на структурные блоки, а не на блоки контента. Попробуйте что-то вроде этого:

<onestepcheckout_index_index>
    <reference name="content">
        <block type="block/class" template="path/to/template/template.phtml" name="abc" as="abc" />
    </reference>
</onestepcheckout_index_index>
без промедления
источник
1
Что касается contentзагрузки моего блока, но я не могу контролировать, где размещается блок, если я ссылаюсь на `content.
musicliftsme
Он размещен<?php echo $this->getChildHtml('abc') ?>
Pronto
Мне нужно разместить этот блок в определенном месте. Насколько я знаю, ссылка contentразмещает блок автоматически и не echo $this->getChildHtml('abc')имеет никакого эффекта. Поправьте меня если я ошибаюсь.
musicliftsme