Як замінити / переписати блок-клас у Magento 1?


12

Примітка. Це розроблено як канонічне запитання, яке повністю пояснює, як працює перезаписування блоку та чи може бути використане як дублікат цілі для більш конкретних питань "Як перекрити блок X" або "Чому моя перезапис не працює".

Дивіться також: Шукаєте канонічні питання щодо переосмислення Magento 1

Скажімо, я повинен внести зміни до класу основного блоку у спеціальному модулі (змінити методи або додати методи). Як це зробити, крок за кроком?

Відповіді:


23

Кожен блок або група блоків оголошується у config.xmlфайлі такого модуля (всередині <global>тегу).
Ось приклад із модуля каталогу

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

Це означає, що блок можна екземплярувати, використовуючи псевдонім, catalog/class_name_hereде class_name_hereзнаходиться решта шляху до класу, починаючи з префікса.
Це означає catalog/class_name_here, що за замовчуванням буде відображено до Mage_Catalog_Block_Class_Name_Here.

Щоб переписати блок, вам потрібно створити модуль, який залежить від модуля, який ви намагаєтесь змінити ( Magento_Catalog) у моєму прикладі.
І вам потрібно додати це в тезі config.xmlпід <global>тегом.

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

Потім створіть клас YourNamespace_YourModule_Block_Your_New_Class_Here(слідуючи структурі папок ZF) і зробіть цей клас розширенням початкового класу.

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

Коли ви закінчите, відключіть компіляцію та ввімкніть її знову (за потреби) та очистіть кеш.

Це не працюватиме для абстрактних блоків.
Він працює лише для класів, які отримують інстанціювання.

Приклад

Припустимо, що ви хочете переписати файл- додаток \ код \ core \ Mage \ Каталог \ Блок \ Продукт \ Перегляд \ Опції \ Тип \ Тип \ Select.php, який має клас Mage_Catalog_Block_Product_View_Options_Type_Selectу власному модулі Marius_Test .

Тоді вам знадобиться цей запис у вашому config.xml:

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

додаток \ код \ локальний \ Маріус \ Тест \ Блок \ Каталог \ Продукт \ Вид \ Параметри \ Тип \ Виберіть.php :

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}

Не працює. Я намагаюся перезаписати клас Mage_Catalog_Block_Product_View_Options_Type_Selectу додаток \ код \ локальний \ WR \ EPO \ Блок \ Каталог \ Блок \ Продукт \ Перегляд \ Параметри \ Тип \ Вибрати.php . Я спробував це так: codepen.io/anon/pen/WYOqBr
Чорний

І якщо це не працює, ти вважаєш, що моя відповідь неправильна, тому ти спростовуєш її, а не думаєш, що, можливо, ти робиш щось не так. У всякому разі ... замінити це <Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select>з <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>і переконайтеся , що немає простору всерединіproduct_view_options_type_select
Marius

Я заявив, що ваша відповідь не була точною і, хоча я дотримувався її крок за кроком, не дав правильного результату. Ви писали, що ми повинні використовувати ім’я класу, тому я його використав, і це не спрацювало. Ми повинні використовувати product_view_options_type_selectзамість справжнього імені класу Mage_Catalog_Block_Product_View_Options_Type_Select. Якщо ви відповідним чином зміните свою відповідь, то я висловлюсь на користь.
Чорний

Якщо ви читаєте його крок за кроком, ви пропустили крок. Той, де я пояснюю, що таке псевдонім класу. Якщо ви просто скопіюєте заміну пасти, ви працюєте. 17 людей зрозуміли. Я думаю, що я це правильно пояснив
Маріус

Так, але хорошого прикладу немає, тому ми можемо запевнити, що ми правильно зрозуміли вашу теорію
Чорний

4

З моєї точки зору переосмислити і переписати ці дві різні речі,

Заміна:

Коли ми використовуємо конструктивний механізм резервного копіювання, ми робимо переоцінку

Перепишіть:

Коли ми переписуємо класи класу Magento Core у нашому класі, ми робимо перезапис.

1) Приклад перевизначення:

Якщо мені потрібно перезаписати app/code/core/Mage/Catalog/Block/Product/List.phpфайл, то я копіюю в свій локальний модуль тим самим контуром, показаним нижчеapp/code/local/Mage/Catalog/Block/Product/List.php

Це не рекомендується magento Але ви можете зробити так.

2) Приклад переписування:

Якщо я хочу переписати цей блок-клас, Mage_Adminhtml_Block_Sales_Order_Createто я кодую в своєму модулі config.xml, як нижче

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

І в моєму класі Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

Я кодуюсь як нижче

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}

2

Тут важливо додати, що блокування перезаписів (як і всі інші переписування модулів Magento) передбачає більш високі зусилля щодо обслуговування, і тому слід розглядати як останній шанс розширити функціональність після маніпуляцій з налаштуваннями, подій та налаштування тем.

Потенційна проблема 1: Перезаписаний шаблон не буде оновлюватися, коли ви або інший обслуговувач оновить вихідні файли Magento. Значить, виправлення або покращення безпеки не застосовуватимуться до вашого коду. Те саме стосується інших перезаписаних класів, включаючи Блоки, але залежить від того, скільки перезаписів було виконано (див. Нижче).

Потенційна проблема 2: Можливо, здається, що перезаписаний блок (або інший клас) буде переписаний іншим розширенням, яке ви або інший обслуговувач намагатиметься встановити. Тоді вам доведеться вирішити цей конфлікт.

Альтернатива 1: Використовуйте події, тобто виконайте код, який ви збираєтеся переписати і перевірити, чи є події, які можуть бути використані для досягнення потрібної функціональності.

Альтернатива 2: Перезапишіть смарт, тобто огляньтесь: можливо, перевірте місце, де клас, який ви збираєтеся переписати, ініційований, і перевірте, чи можете ви впливати, який клас вибирається через конфігурацію чи події; можливо, існує клас, навколо якого ви можете змінити 3-рядковий метод заміни імені класу замість копіювання методу 30 рядків з оригінального класу в переписаний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.