создание базового приветствия, которое будет отображаться в заголовке страницы Magento

Я просто осваиваю Magento, и некоторые вещи, которые на первый взгляд кажутся интуитивно понятными, не работают должным образом. Вот очень простой пример шаблона, который я пытаюсь заставить работать на уровне «hello world», прежде чем копать глубже.

В определении блока «заголовок» в моем макете page.xml я включил следующий блок:

<block type="core/text_list" name="helloRob" as="helloRob" template="page/html/hellorob.phtml" />

Затем в моем файле header.phtml я добавил...

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

Содержимое файла hellorob.phtml:

<h1>Hello Rob</h1>

Тем не менее, при отображении страницы я не получаю ожидаемый вывод элемента H1 в заголовке. Если я удалю вызов «getChildHtml» и заменю его фактическим HTML, тогда он отобразит H1. Итак, я знаю, что мой пользовательский файл header.phtml загружается. Я также смог подтвердить, что добавляю свой блок в правильный XML-файл макета, потому что, когда я комментирую другой блок в том же файле, закомментированный блок больше не отображается на моей странице.

Я проверил код в поисках чего-то очевидного, например, опечатки. Я также проверил наличие конфликтов имен — отсюда «helloRob», а не «helloWorld».

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

Буду признателен за любую помощь - с кодом - не с моими очками!

--Роб


person Rob Emenecker    schedule 30.10.2013    source источник


Ответы (1)


Проблема здесь в вашем понимании типов блоков. Блоки в Magento выполняют разные функции, тот, что вы использовали здесь core/text_list, служит определенной цели. Вы можете увидеть, что делает блок, посмотрев его код. Файл блока, core/text_list находится в app/code/core/Mage/Core/Block/Text/List.php.

 protected function _toHtml()
{
    $this->setText('');
    foreach ($this->getSortedChildren() as $name) {
        $block = $this->getLayout()->getBlock($name);
        if (!$block) {
            Mage::throwException(Mage::helper('core')->__('Invalid block: %s', $name));
        }
        $this->addText($block->toHtml());
    }
    return parent::_toHtml();
}

Как видите, его цель — просто распечатать дочерние блоки. Этот тип блока используется для текстовых меню и блоков исключительно в качестве контейнеров для других блоков.

Поскольку вы ищете блок, чтобы просто распечатать содержимое шаблона, поэтому type="core/template" отлично подойдет, это метод _toHtml()

 protected function _toHtml()
{
    if (!$this->getTemplate()) {
        return '';
    }
    $html = $this->renderView();
    return $html;
}
person Luke Collymore    schedule 30.10.2013
comment
Спасибо Люк! Я обнаружил, что есть много случаев, когда я не знаю, чего я не знаю с Magento. Вы правы, мне не хватает понимания ТИПОВ блоков среди многих других аспектов Magento. Моя конечная цель, для которой мой вопрос был отправной точкой, состояла в том, чтобы абстрагировать несколько строк кода, включая загрузку блоков, в дискретный отдельный блок, который администратор сайта мог затем по существу включать/выключать с помощью пользовательского отображения XML страницы CMS. Благодаря вашей информации я смог успешно создать блок среднего уровня в заголовке и сделать так, чтобы он отображался на страницах CMS, как предполагалось. - person Rob Emenecker; 31.10.2013