Как перезаписать файлы основных шаблонов из пользовательского модуля?

10

Я хочу перезаписать два файла. А именно view.phtmlи print.phtmlзаказов на продажу.
(путь: app/design/frontend/base/default/template/sales/order/)

Я создаю модуль, в котором я хочу создать путь, app/design/frontend/base/default/template/<My Module Name>/sales/order/чтобы ядро view.phtmlи print.phtmlфайлы не перезаписывались.

Поэтому, пожалуйста, объясните мне, как решить эту задачу.

Раджан Фалду
источник

Ответы:

13

Вы можете сделать это с помощью XML-файла макета внутри вашего модуля. В вашем модуле должен быть раздел, config.xmlподобный этому, чтобы позволить Magento загружать XML-код вашего модуля (path:) app/design/frontend/base/default/layout/mymodulename.xml:

<config>
    [...]
    <frontend>
        [...]
        <layout>
            <updates>
                <mymodulename_layout module="MyModuleName">
                    <file>mymodulename.xml</file>
                </mymodulename_layout>
            </updates>
        </layout>
    </frontend>

В этом XML-файле макета вы можете ссылаться на конкретные блоки и изменять их шаблон.

<layout>
    <sales_order_view>
        <reference name="sales.order.view">
            <action method="setTemplate">
                <template>mymodulename/sales/order/view.phtml</template>
            </action>
        </reference>
    </sales_order_view>
    <sales_order_print>
        <reference name="sales.order.print">
            <action method="setTemplate">
                <template>mymodulename/sales/order/print.phtml</template>
            </action>
        </reference>
    </sales_order_print>
</layout>
7ochem
источник
@ 7очем, как добиться того же в magento2?
Прасад Маганти
Вы должны задать это как новый вопрос, так как он слишком широк, чтобы поместить его в комментарий здесь, и это не то, о чем спрашивает ОП
7ochem
3

Предположим, что наше имя модуля «CustomSales» и имя пакета «Exercise».

Шаг 1: Создайте файл конфигурации модуля в app / etc / modules / Exercise_CustomSales.xml

<config>
<modules>
    <Exercise_CustomSales>
        <active>true</active>
        <codePool>local</codePool>
    </Exercise_CustomSales>
</modules>

Шаг 2: Создайте файл конфигурации в app / code / local / Exercise / CustomSales / etc / config.xml

<config>
<modules>
    <Exercise_CustomSales>
        <version>1.7.0.2</version>
    </Exercise_CustomSales>
</modules>
<global>
    <blocks>
        <customsales>
            <class>Exercise_CustomSales_Block</class>
        </customsales>
        <sales>
            <rewrite>
                <order_view>Exercise_CustomSales_Block_Sales_Order_View</order_view>
            </rewrite>
        </sales>
    </blocks>
</global>

Шаг 3: Создайте php-файл, который перезаписывает фактический файл view.phtml, app / code / local / Exercise / CustomSales / Block / Sales / Order / View.php

Класс Exercise_CustomSales_Block_Sales_Order_View extends Mage_Sales_Block_Order_View
{
    защищенная функция _construct ()
    {
        Родитель :: _ конструкт ();
        $ This-> setTemplate ( 'customsales / продажи / заказ / view.phtml');
    }
}

Шаг 4: вам нужно создать файл local.xml внутри папки макета (возможный путь: app / design / frontend / package / theme / layout). Это для print.phtml.

например (app / design / frontend / rwd / default / layout / local.xml)

<layout>
<sales_order_print>
    <reference name="sales.order.print">
        <action method="setTemplate">
            <template>customsales/sales/order/print.phtml</template>
        </action>
    </reference>
</sales_order_print>

Переместите файл view.phtml и print.phtml в папку «app / design / frontend / package / theme / template / customsales / sales / order».

Очистить кэш magento.

Сохель Рана
источник
Нет необходимости переписывать весь блок. В моем ответе конструктор Mage_Sales_Block_Order_Viewget сначала вызывается и устанавливает шаблон, затем setTemplateвызывается get, инициируемый компоновочным XML из моего примера, и устанавливает пользовательский шаблон. Я хотел бы пойти на решения, которые не используют переписывания, поскольку они могут вызвать конфликты.
7очев
7очем верно. Нет необходимости устанавливать шаблон в блоке. Решение 7ochem хорошо, и оно сработало для меня.
Раджан Фалду
Это зависит от вас. Если вы перезаписываете или добавляете какой-либо метод php, вам нужно перезаписать блок, иначе вы просто измените шаблон через module.xml или local.xml. Полагаю, мое решение не влияет на версию magento.
Сохель Рана