Почему мой блок расширения дублирует содержимое 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()..
Заранее спасибо!
4 answers
Причина, по которой вы получаете все дважды, заключается в том, что теперь в вашем макете есть два головных блока: основной и ваш новый. Мои предложения были бы следующими.
- Если вы просто хотите изменить метод
getCssJsHtml
, то я бы предложил переписать блок в вашем config.xml вместо того, чтобы пытаться изменить макет. - Если вы просто хотите добавить новые js и css, просто используйте
<reference name="head"><action method="addJs"><script>new/file.js</script></action></reference>
Вы добавляете свой блок здесь:
<default>
<reference name="head">
<block type="mr_global/head" name="mr.head.scripts"></block>
</reference>
</default>
Но вы удалили другую?
Похоже, что у вас есть страница/html_head, а затем ваш блок. Таким образом, происходит дублирование. Вам нужна инструкция по удалению в другом блоке?
Я думаю, что это связано с расширением блока вместо переопределения. При упоминании
<block type="mr_global/head" name="mr.head.scripts"></block>
Он может вызывать некоторые функции по умолчанию в родительском классе.
Измените тип блока на type="mr_global"
, который использует тип заголовка по умолчанию в XML-файлах.
Спасибо,
Нанду1
ОТВЕТ:
// In my Head block:
protected function _construct()
{
$this->setTemplate('mr/global/head.phtml');
}
Файл шаблона:
<?php echo $this->getCssJsHtml() ?>
<?php echo $this->getChildHtml() ?>
Извините за беспокойство и еще раз спасибо всем вам за помощь! Это было слишком просто для меня, чтобы понять...:)
(кстати: я бы поддержал всех вас, ребята, но не могу из-за моей низкой репутации..)