Magento 1'de bir blok sınıfını nasıl geçersiz kılar / yeniden yazarım?


12

Not: Bu, blok yeniden yazma işlemlerinin nasıl çalıştığını tam olarak açıklayan ve daha spesifik "X bloğunu nasıl geçersiz kılabilirim" veya "Yeniden yazım neden çalışmıyor?" Soruları için yinelenen hedef olarak kullanılabilecek standart bir soru olarak tasarlanmıştır.

Ayrıca bakınız: Magento 1 geçersiz kılmaları hakkında kanonik sorular mı arıyorsunuz?

Diyelim ki, özel bir modülde çekirdek blok sınıfında değişiklikler yapmam gerekiyor (yöntemleri değiştir veya yöntemler ekle). Bunu nasıl adım adım yapabilirim?

Yanıtlar:


23

Her blok veya blok grubu, config.xmlböyle bir modülün dosyasında ( <global>etiketin içinde ) bildirilir.
İşte katalog modülünden bir örnek

    <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>

Bir blok diğer adı ile örneklenebilmektedir Bu demektir önek başlayarak sınıf yolu geri kalanı. Bu , varsayılan olarak ile eşleneceği anlamına gelir . catalog/class_name_hereclass_name_here
catalog/class_name_hereMage_Catalog_Block_Class_Name_Here

Bir bloğu yeniden yazmak için örneğimde değiştirmeye çalıştığınız modüle bağlı bir modül oluşturmanız gerekir Magento_Catalog.
Ve bunu etiketin config.xmlaltına eklemeniz gerekir <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>

Daha sonra sınıfı YourNamespace_YourModule_Block_Your_New_Class_Here(ZF klasör yapısını izleyerek) oluşturun ve bu sınıfın orijinal sınıfı genişletmesini sağlayın.

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

İşiniz bittiğinde, derlemeyi devre dışı bırakın ve tekrar etkinleştirin (gerekirse) ve önbelleği temizleyin.

Bu soyut bloklar için çalışmaz.
Yalnızca somutlaştırılan sınıflar için çalışır.

Misal

Kendi modülünüzde sınıf olan Marius_Test \ app \ code \ core \ Mage \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php dosyasını yeniden yazmak istediğinizi varsayalım .Mage_Catalog_Block_Product_View_Options_Type_Select

O zaman bu girişe ihtiyacınız olacak 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
}

Çalışmıyor. Bu sınıfı üzerine yazmak deneyin Mage_Catalog_Block_Product_View_Options_Type_Selectiçinde \ kod \ yerel \ WR \ EPO \ Block'un \ Katalog \ Blok \ Ürün \ Görünüm \ Seçenekler \ Tür \ Select.php app . Ben böyle denedim: codepen.io/anon/pen/WYOqBr
Siyah

Ve eğer işe yaramazsa, cevabımın yanlış olduğunu düşünüyorsunuz, bu yüzden belki de yanlış bir şey yaptığınızı düşünmek yerine onu aşağı inersiniz. Her neyse ... bunu <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>onunla değiştir <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>ve içinde boşluk olmadığından emin olproduct_view_options_type_select
Marius

Cevabınızı kesinleştirmedim çünkü cevabınız kesin değildi ve adım adım takip etsem de doğru sonucu vermedim. Sınıf adını kullanmamız gerektiğini yazdınız, bu yüzden kullandım ve işe yaramadı. product_view_options_type_selectGerçek sınıf adı yerine kullanmak zorundayız Mage_Catalog_Block_Product_View_Options_Type_Select. Eğer cevabınızı buna göre değiştirirseniz o zaman ben oylarım.
Siyah

Adım adım okursanız, bir adımı kaçırdınız. Sınıf takma adının ne olduğunu açıkladığım. Yapıştır kopyasını değiştirirseniz, çalıştıracaksınız. 17 kişi anladı. Ben doğru açıkladı düşünüyorum
Marius

Evet, ancak iyi bir örnek eksik, bu nedenle teorinizi doğru bir şekilde anladığımızdan emin olabiliriz
Black

4

Benim bakış açım geçersiz kılmak ve yeniden yazmak için bu ikisi farklı şeylerdir,

Geçersiz Kıl:

Tasarım yedek mekanizmasını kullandığımızda geçersiz kılma yapıyoruz

Yeniden yazmak:

Sınıfımızda magento Core sınıflarını yeniden yazdığımızda yeniden yazma yapıyoruz.

1) Geçersiz Kılma Örneği:

app/code/core/Mage/Catalog/Block/Product/List.phpDosyayı geçersiz kılmam gerekirse, aşağıda gösterilen aynı yolla yerel modülüme kopyalarımapp/code/local/Mage/Catalog/Block/Product/List.php

Magento Tarafından Önerilmiyor Ama Bunu bu şekilde yapabilirsiniz.

2) Yeniden Yazım Örneği:

Bu blok sınıfını yeniden yazmak istersem, Mage_Adminhtml_Block_Sales_Order_Createconfig.xml modülümde aşağıdaki gibi kod yazarım

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

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

Ve benim sınıfımda Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

Aşağıdaki gibi kod

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

Burada eklenecek önemli olan, blok yeniden yazmaların (ve diğer tüm Magento modüllerinin yeniden yazmalarının) daha yüksek bakım çabası anlamına gelmesidir ve bu nedenle yapılandırma manipülasyonu, etkinlikler ve tema özelleştirmesinden sonra işlevselliği genişletmek için son bir şans olarak görülmelidir.

Olası sorun 1: Siz veya başka bir destekçi Magento'nun kaynak dosyalarını güncellediğinde yeniden yazılan şablon güncellenmez. Güvenlik düzeltmesi veya iyileştirmesinin kodunuza uygulanmayacağı anlamına gelir. Aynı şey Bloklar da dahil olmak üzere diğer yeniden yazılmış sınıflar için de geçerlidir, ancak ne kadar yeniden yazma yapıldığına bağlıdır (aşağıya bakınız).

Olası sorun 2: Yeniden Yazılan Blok (veya başka bir sınıf), sizin veya başka bir bakımcının yüklemeye çalışacağı başka bir uzantı tarafından yeniden yazılmış gibi görünebilir. O zaman bu çatışmayı çözmeniz gerekecek.

Alternatif 1: Olayları kullanın, yani yeniden yazmak üzere olduğunuz kodu inceleyin ve istenen işlevselliği elde etmek için kullanılabilecek olaylar olup olmadığını kontrol edin.

Alternatif 2: Akıllı yeniden yazın, yani etrafına bakın: belki yeniden yazacağınız sınıfın örneklendirildiği yeri kontrol edin ve config veya olaylar aracılığıyla hangi sınıfın seçildiğini etkileyip etkilemediğinizi kontrol edin; belki 30 sınıf yöntemini orijinal sınıftan yeniden yazılana kopyalamak yerine sınıf adını değiştirmek için 3 satırlık bir yöntemi geçersiz kılmanıza izin veren bir sınıf vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.