Każdy blok lub grupa bloków jest zadeklarowana w config.xml
pliku modułu takiego jak ten (wewnątrz <global>
znacznika).
Oto przykład z modułu katalogu
<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>
Oznacza to, że blok może zostać utworzony za pomocą aliasu, w catalog/class_name_here
którym class_name_here
reszta ścieżki klasy zaczyna się od prefiksu.
Oznacza to catalog/class_name_here
, że domyślnie zostanie zamapowany na Mage_Catalog_Block_Class_Name_Here
.
Aby przepisać blok, musisz utworzyć moduł, który zależy od modułu, który próbujesz zmienić ( Magento_Catalog
) w moim przykładzie.
I musisz dodać to config.xml
pod <global>
tagiem.
<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>
Następnie utwórz klasę YourNamespace_YourModule_Block_Your_New_Class_Here
(zgodnie ze strukturą folderów ZF) i spraw, aby ta klasa rozszerzyła klasę oryginalną.
class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
//your awesome code here
}
Po zakończeniu wyłącz kompilację i włącz ją ponownie (w razie potrzeby) i wyczyść pamięć podręczną.
To nie zadziała dla bloków abstrakcyjnych.
Działa tylko w przypadku klas, które są tworzone.
Przykład
Załóżmy, że chcesz przepisać plik app \ code \ core \ Mage \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php, który ma klasę Mage_Catalog_Block_Product_View_Options_Type_Select
we własnym module Marius_Test .
Następnie potrzebujesz tego wpisu w 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>
app \ code \ local \ Marius \ Test \ Block \ Catalog \ Product \ View \ Options \ Type \ Select.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
w app \ code \ local \ WR \ EPO \ Block \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php . Próbowałem tak: 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>
z<product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
i upewnij się, że nie istnieją przestrzenie wewnątrzproduct_view_options_type_select
product_view_options_type_select
zamiast prawdziwej nazwy klasyMage_Catalog_Block_Product_View_Options_Type_Select
. Jeśli odpowiednio zmienisz swoją odpowiedź, będę głosować.Dla mojego punktu widzenia zastąpienie i przepisanie tych dwóch różnych rzeczy,
Nadpisanie:
Przepisać:
1) Przykład zastąpienia:
Jeśli muszę przesłonić
app/code/core/Mage/Catalog/Block/Product/List.php
plik, kopiuję do modułu lokalnego tą samą ścieżką, jak pokazano poniżejapp/code/local/Mage/Catalog/Block/Product/List.php
To nie jest sugerowane przez magento Ale możesz to zrobić w ten sposób.
2) Przykład przepisywania:
Jeśli chcę przepisać tę klasę bloku,
Mage_Adminhtml_Block_Sales_Order_Create
to koduję w moim module config.xml jak poniżejI w mojej klasie
Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create
Koduję jak poniżej
źródło
Ważne jest, aby dodać tutaj, że przepisywanie bloków (podobnie jak wszystkie inne przepisywania modułów Magento) implikuje większy wysiłek konserwacyjny i dlatego powinno być traktowane jako ostatnia szansa na rozszerzenie funkcjonalności po manipulacji konfiguracją, zdarzeniach i dostosowaniu motywu.
Potencjalny problem 1: Przepisany szablon nie zostanie zaktualizowany, gdy Ty lub inny opiekun zaktualizujesz pliki źródłowe Magento. Oznacza, że poprawka zabezpieczeń lub ulepszenia nie zostaną zastosowane w kodzie. To samo dotyczy innych przepisanych klas, w tym bloków, ale zależy od tego, ile przeróbek zostało zrobionych (patrz poniżej).
Potencjalny problem 2: Przepisany blok (lub inna klasa) może wydawać się przepisany przez inne rozszerzenie, które Ty lub inny opiekun będzie próbował zainstalować. Następnie będziesz musiał rozwiązać ten konflikt.
Alternatywa 1: Użyj zdarzeń, tj. Przekop kod, który właśnie chcesz przepisać, i sprawdź, czy istnieją zdarzenia, które mogą być wykorzystane do osiągnięcia pożądanej funkcjonalności.
Alternatywa 2: Przepisz inteligentnie, tzn. Rozejrzyj się: może sprawdź miejsce, w którym tworzona jest instancja klasy, którą zamierzasz przepisać i sprawdź, czy możesz wpłynąć na to, która klasa zostanie wybrana przez konfigurację lub zdarzenia; być może istnieje klasa, która pozwala zastąpić 3-liniową metodę, aby zastąpić nazwę klasy, zamiast kopiować 30-liniową metodę z oryginalnej klasy do przepisanej.
źródło