Magento: блок page / html_wrapper пуст - PullRequest
1 голос
/ 20 февраля 2012

Небольшая часть Page.xml:

<layout version="0.1.0">
     ....
      <default translate="label" module="page">
        <label>All Pages</label>
        <block type="page/html" name="root" output="toHtml" template="page/2columns-left.phtml">
             <block type="page/html_header" name="header" as="header" /> <!-- work -->
             <block type="page/html_wrapper" name="u.Top.Menu" as="u_Top_Menu" translate="label"> <!-- doesn't work -->
                    <label>top menu</label>
                    <action method="setElementTagName"><value>div</value></action>
                    <action method="setElementClass"><value>sub-menu</value></action>
             </block>
         ...
         </block>
....

И в 2columns-left.phtml выведите его:

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

Но он всегда возвращает пустое значениеЯ немного запутался здесь.Что я тут не так делаю?

Ответы [ 3 ]

4 голосов
/ 20 февраля 2012

Это то, что происходит, когда вы забыли добавить дочерний блок в блок обертки html.Посмотрите на этот исходный код класса блока:

class Mage_Page_Block_Html_Wrapper extends Mage_Core_Block_Abstract
{
    /**
     * Whether block should render its content if there are no children (no)
     * @var bool
     */
    protected $_dependsOnChildren = true;

    /**
     * Render the wrapper element html
     * Supports different optional parameters, set in data by keys:
     * - element_tag_name (div by default)
     * - element_id
     * - element_class
     * - element_other_attributes
     *
     * Renders all children inside the element.
     *
     * @return string
     */
    protected function _toHtml()
    {
        $html = empty($this->_children) ? '' : trim($this->getChildHtml('', true, true));
        if ($this->_dependsOnChildren && empty($html)) {
            return '';
        }

...

1 голос
/ 20 февраля 2012

Насколько я могу судить, вы все делаете правильно. Проблема, которая обычно сбивает людей с толку - это проблема as против name, при которой блок упоминается в xml через name, а в шаблонах через as. Похоже, вы не попали в эту ловушку, поэтому я думаю, что ваш кэш не был очищен. Надеемся, что rm -rf var/cache/mage-* должен решить эту проблему.

0 голосов
/ 03 апреля 2015

Зява верна, но у меня есть обходной путь!

Если вы не хотите добавлять дочерние элементы в блок, но по-прежнему нуждаетесь в его рендеринге, есть функция класса (depenonChildren), которая позволяет вам установить этот флаг _dependsOnChildren из XML-разметки следующим образом:

<block type="page/html_wrapper" name="u.Top.Menu" as="u_Top_Menu" translate="label"> <!-- doesn't work -->
    <label>top menu</label>
    <action method="setElementTagName"><value>div</value></action>
    <action method="setElementClass"><value>sub-menu</value></action>
    <!-- This will tell PhP to call $blockClass->dependsOnChildren(0); before rendering. -->
    <action method="dependsOnChildren"><value>0</value></action>
</block>

Вот эта функция (для справки)

app / code / core / Mage / Page / Block / Html / Wrapper.php @ Line 80

/**
 * Setter whether this block depends on children
 * @param $depends
 * @return Mage_Page_Block_Html_Wrapper
 */
public function dependsOnChildren($depends = '0')
{
    $this->_dependsOnChildren = (bool)(int)$depends;
    return $this;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...