Comment écraser des fichiers de modèles principaux à partir d'un module personnalisé?

10

Je veux écraser deux fichiers. A savoir le view.phtmlet print.phtmldes commandes clients.
(chemin: app/design/frontend/base/default/template/sales/order/)

Je crée un module dans lequel je veux créer un chemin app/design/frontend/base/default/template/<My Module Name>/sales/order/afin que le noyau view.phtmlet les print.phtmlfichiers ne soient pas écrasés.

Alors s'il vous plaît, guidez-moi comment accomplir cette tâche.

Rajan Faldu
la source

Réponses:

13

Vous pouvez le faire avec un fichier XML de mise en page à l'intérieur de votre module. Vous devez avoir une section dans votre module config.xmlcomme celle-ci pour permettre à Magento de charger la mise en page XML de votre module (chemin:) 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>

Dans ce fichier XML de présentation, vous pouvez référencer les blocs spécifiques et modifier leur modèle.

<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
la source
@ 7ochem, comment y parvenir dans magento2?
prasad maganti
Vous devriez poser cette question comme une nouvelle question car elle est trop large pour la mettre dans un commentaire ici et n'est pas ce que le PO demande
7ochem
3

Supposons que notre nom de module «CustomSales» et notre nom de package «Exercise».

Étape 1: créer un fichier de configuration de module dans l'application / etc / modules / Exercise_CustomSales.xml

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

Étape 2: Créez un fichier de configuration sous 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>

Étape 3: Créez un fichier php qui remplace le fichier view.phtml réel, app / code / local / Exercise / CustomSales / Block / Sales / Order / View.php

classe Exercise_CustomSales_Block_Sales_Order_View étend Mage_Sales_Block_Order_View
{
    fonction protégée _construct ()
    {
        parent :: _ construct ();
        $ this-> setTemplate ('Customsales / sales / order / view.phtml');
    }
}

Étape 4: vous devez créer un fichier local.xml dans le dossier de mise en page (chemin possible: app / design / frontend / package / theme / layout). C'est pour print.phtml.

par exemple (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>

Déplacez le fichier view.phtml et print.phtml dans "app / design / frontend / package / theme / template / douanales / sales / order".

Vider le cache magento.

Sohel Rana
la source
Il n'est pas nécessaire de réécrire tout le bloc. Dans ma réponse, le constructeur de Mage_Sales_Block_Order_Viewget est appelé en premier et définit le modèle, puis setTemplateget est appelé initié par la disposition XML de mon exemple et définit le modèle personnalisé. Je voudrais opter pour des solutions qui n'utilisent pas de réécritures car elles peuvent potentiellement provoquer des conflits.
7ochem
7ochem a raison. Pas besoin de mettre le modèle en bloc. La solution de 7ochem est bonne et cela a fonctionné pour moi.
Rajan Faldu
Cela dépend de vous. Si vous écrasez ou ajoutez une méthode php, vous devez écraser le bloc, sinon vous changez simplement le modèle via module.xml ou local.xml. Ma solution n'affecte aucune version de magento, je suppose.
Sohel Rana