Меню навигации:page.xml не вызывает переопределенный класс (topmenu.php)
-
12-12-2019 - |
Вопрос
РЕДАКТИРОВАТЬ :решен Джонатаном Хасси.См. в конце сообщения (или ниже) еще один вопрос, если вы хотите помочь мне с переопределением шаблона и макета :)
дополнительный вопрос :Могу ли я переопределить файлы page.xml, topmenu.phtml и renderer.phtml в моем модуле или мне придется заменять их вручную в папках тем?Если да, не могли бы вы привести меня к уроку или быстро объяснить?Кажется, мне было нелегко найти учебник, подходящий для моего случая...
Я хотел бы переопределить topmenu.phtml, renderer.phtml и шаблон page.xml, внутри моего модуля, если возможно.
Спасибо за дополнительную помощь :)
Я новый разработчик Magento, поэтому пытаюсь делать простые вещи, и мое понимание Magento ограничено...
Я хочу отобразить меню навигации (вверху) другим способом (раскрывающийся список на панели), создав свой собственный модуль.Я посмотрел, где было определено/вызвано текущее меню, и нашел файл design/frontend/{mytheme}/default/layout/page.xml
который выглядит так:
<default translate="label" module="page">
<block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">
<block type="page/html_header" name="header" as="header">
<block type="core/text_list" name="top.menu" as="topMenu" translate="label">
<label>Navigation Bar</label>
<block type="page/html_topmenu" name="catalog.topnav" template="page/html/topmenu.phtml">
<block type="page/html_topmenu_renderer" name="catalog.topnav.renderer" template="page/html/topmenu/renderer.phtml"/>
</block>
</block>
</block>
</block>
</default>
(со многими другими вещами, но это важно)
<block type="page/html_topmenu" name="catalog.topnav" template="page/html/topmenu.phtml">
<block type="page/html_topmenu_renderer" name="catalog.topnav.renderer" template="page/html/topmenu/renderer.phtml"/>
</block>
Эти строки указывают на то, что нам нужен класс Mage_Page_Block_Html_Topmenu
, который отображается в файле шаблона design/frontend/{mytheme}/default/template/page/html/topmenu.phtml
, который содержит :
<nav id="nav">
<div class="nav-megadropdown col6">
<?php echo $this->getHtml('level-top'); // $this is the a Topmenu object ?>
</div>
<div style="clear:both"></div>
</nav>
Метод getHtml
достигает дочернего блока catalog.topnav.renderer
и получает свой класс (Mage_Page_Block_Html_Topmenu_Renderer
и вызывает метод рендеринга с помощью шаблона design/frontend/{mytheme}/default/template/page/html/topmenu/renderer.phtml
который содержит сложное, но рабочее меню (Я попробовал это, изменив классы Mage и файлы phtml темы, и это сработало.).
Но теперь я хочу сделать это правильно, переопределив классы внутри моего модуля (который активен и выглядит как Fqu_Supergroup
).Итак, я начал с config.xml:
<config>
<modules>
<Fqu_Supergroup>
<version>0.1.0</version>
</Fqu_Supergroup>
</modules>
<global>
<blocks>
<Page>
<rewrite>
<html_topmenu>Fqu_Supergroup_Block_Html_Topmenu</html_topmenu>
</rewrite>
</Page>
</blocks>
</global>
</config>
И мой класс(Fqu_Supergroup_Block_Html_Topmenu
) в моем модуле (local/Fqu/Supergroup/Block/Html/Topmenu.php
) содержит только переопределенные методы (_getRenderedMenuItemAttributes и _getMenuItemClasses)
Итак, когда я пробую свой код, на странице отображается неработающее меню, потому что он не использовал мой класс (я var_dump создал класс (get_class($this)
) он использовался для рендеринга меню и возвращался Mage_Page_Block_Html_Topmenu
);И когда я var_dump включаемые файлы (get_included_files()
) Я вообще не вижу ссылки на мой модуль (хотя он активирован в админке)...
Извините за длинный пост, но спасибо за внимание и любую помощь!
дополнительный вопрос :Могу ли я переопределить файлы page.xml, topmenu.phtml и renderer.phtml в моем модуле или мне придется заменять их вручную в папках тем?
Решение
Хотя я не анализировал ваш пост подробно, первое, что я заметил, просматривая вышеизложенное, это то, что вы неправильно заявляете, что переписываете, Page
вместо этого должно быть page
.Эта строка не соответствует имени модуля, т.е.тот Page
в Mage_Page
, вместо этого он соответствует строке, используемой при объявлении ресурса в переписываемом модуле, поэтому в этом случае в config.xml
для Mage_Page
основной модуль:
...
<blocks>
<page> <!-- this is the string to match -->
<class>Mage_Page_Block</class>
</page>
</blocks>
...
Ссылаясь page
матч против модуля Mage_Page
определяется путем проверки глобальной конфигурации (которая по сути представляет собой один массивный XML-файл, содержащий все config.xml
файлы для всех модулей).Остальная часть строки определяется в соответствии с именем класса, поэтому html_topmenu
карты в класс Mage_Page_Block_Html_Topmenu
это класс, к которому будет применяться перезапись.
По вашему дополнительному вопросу: да, вы можете переопределить любой файл макета или шаблон, объявив файл макета для вашего модуля.Внутри вы можете объявить любые изменения макета, которые хотите, включая изменение шаблонов для блоков, и эти изменения будут иметь приоритет над основными файлами макета, поскольку ваш модуль всегда загружается после всех основных модулей.