Почему мой блок расширения дублирует содержимое Html-заголовка блока страницы Mage?


Я создал модуль с блоком, который расширяет Mage_Page_Block_Html_Head, но когда я добавляю его в исходный головной блок, он дублирует почти каждый мета-тег, такой как <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> и <meta name="robots" content="NOINDEX,NOFOLLOW" /> и так далее.

Я только что добавил элемент через layout.xml к этому блоку и только этот элемент отображается в функции getCssJsHtml моего блока. Но я не хочу, чтобы остальная часть исходного блока головы отображалась дважды.

Может кто-нибудь сказать мне, как я могу избавиться от этого?

Вот мой блок код:

class Mr_Global_Block_Head extends Mage_Page_Block_Html_Head
{
    /*
     * override getCssJsHtml, so it doesn't throw an error when no item is added to the block
     */
    public function getCssJsHtml()
    {
        if (!isset($this->_data['items']) || !count($this->_data['items']))
            return '';
        return parent::getCssJsHtml();
    }
}

Вот исходный xml-блок:

<default>
    <reference name="head">
        <block type="mr_global/head" name="mr.head.scripts"></block>
    </reference>
</default>

И здесь я добавляю некоторый скрипт в блок (в другом xml-файле):

<default>
    <reference name="head">
        <reference name="mr.head.scripts">
            <action method="addItem">
                <type>js</type>
                <name>mediarocks/yags/jquery-yags.js</name>
            </action>
        </reference>
    </reference>
</default>

Моя проблема с источником, которую я хочу решить, заключается в следующем: Я также хочу добавить внешний js с помощью функции addText, для которой требуется отдельный блок, который затем отображается с помощью getChildHtml() из исходного головного блока (как описано здесь: https://stackoverflow.com/questions/4654822/adding-external-javascript-file-to-magento#answer-11674174), который находится после функции getCssJsHtml(). Но я хочу убедиться, что внешние файлы js добавлены до моих внутренних файлов js, поэтому я подумал, что могу просто добавить еще один головной блок в исходный головной блок, который также отображается функцией getChildHtml()..

Заранее спасибо!

Author: Community, 2013-11-15

4 answers

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

  1. Если вы просто хотите изменить метод getCssJsHtml, то я бы предложил переписать блок в вашем config.xml вместо того, чтобы пытаться изменить макет.
  2. Если вы просто хотите добавить новые js и css, просто используйте <reference name="head"><action method="addJs"><script>new/file.js</script></action></reference>
 1
Author: David Manners, 2013-11-18 10:02:06

Вы добавляете свой блок здесь:

<default>
   <reference name="head">
       <block type="mr_global/head" name="mr.head.scripts"></block>
   </reference>
</default>

Но вы удалили другую?

Похоже, что у вас есть страница/html_head, а затем ваш блок. Таким образом, происходит дублирование. Вам нужна инструкция по удалению в другом блоке?

 1
Author: dagfr, 2013-11-19 08:56:58

Я думаю, что это связано с расширением блока вместо переопределения. При упоминании

<block type="mr_global/head" name="mr.head.scripts"></block>

Он может вызывать некоторые функции по умолчанию в родительском классе.

Измените тип блока на type="mr_global", который использует тип заголовка по умолчанию в XML-файлах.

Спасибо,

Нанду1

 0
Author: Narendra Kurapati, 2013-11-18 17:14:35

ОТВЕТ:

// In my Head block:
protected function _construct()
{
    $this->setTemplate('mr/global/head.phtml');
}

Файл шаблона:

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

Извините за беспокойство и еще раз спасибо всем вам за помощь! Это было слишком просто для меня, чтобы понять...:)

(кстати: я бы поддержал всех вас, ребята, но не могу из-за моей низкой репутации..)

 0
Author: Lorenz Haase, 2013-11-20 11:20:24