Меню навигации:page.xml не вызывает переопределенный класс (topmenu.php)

magento.stackexchange https://magento.stackexchange.com//questions/48751

Вопрос

РЕДАКТИРОВАТЬ :решен Джонатаном Хасси.См. в конце сообщения (или ниже) еще один вопрос, если вы хотите помочь мне с переопределением шаблона и макета :)

дополнительный вопрос :Могу ли я переопределить файлы 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 это класс, к которому будет применяться перезапись.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top