farklı modüllerde bir magento blok geçersiz (ve nasıl diğerlerini görmezden)

3 Cevap php

Magento Eğer (Magento Adminhtml modülden en yaygın) başka birine bir modül bir blok (veya yardımcı veya model, vs) kılabilirsiniz. Şimdi ben zaten başka bir uzantı ile değiştirileceğini bir blok geçersiz kılmak istiyorsanız sorun var. Düzeni güncellemeleri <remove> etiketi similary diğer bazı modülü yapılandırmasında <rewrite> etiketini görmezden magento anlatmak için herhangi bir yolu var mı?

Burada, diğer uzantısının yapılandırması:

    <blocks>
        <adminhtml>
            <rewrite>
                    <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid>
            </rewrite>
        </adminhtml>
    </blocks>

Benim uzatma İşte yapılandırma:

    <blocks>
        <adminhtml>
            <rewrite>
                    <catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid>
            </rewrite>
        </adminhtml>
    </blocks>

Ben kendi bloğu içine Symmetrics_DeliveryTime adlı bloğun işlevselliği entegre ve şimdi ben magento modülden blok geçersiz kılma göz ardı etmek istiyorum.

Bunu yapmak için herhangi bir magento yolu var mı veya daha sonra bu modülü güncelleme sırasında tüm güçlük dahil (ben şimdi ne yaptım ki) konfigürasyonunu Yorumlamak için tek yoldur?

3 Cevap

Eğer ayrıca bir yeniden yazma yapıyor birinde 'bağlı' olarak modülü ayarlarsanız, config son okunacak ve yeniden yazma olması gereken app / etc / modules içinde uygun dosyasında, sopa olmalıdır:

<config>
  <modules>
    <Your_Module>
      <active>true</active>
      <codePool>local</codePool>
      <depends>
        <Other_Module/>
      </depends>
    </Your_Module>
  <modules>
<config>

Ben sınıf yüklemenin bir göz attım ve temiz bir çözümü var gibi görünmüyor. İlgili classname yükleme kodu şudur:

    if (isset($this->_classNameCache[$groupRootNode][$group][$class])) {
        return $this->_classNameCache[$groupRootNode][$group][$class];
    }

    ...

    if (isset($config->rewrite->$class)) {
        $className = (string)$config->rewrite->$class;

Bir yeniden yazıldı-yeniden yazmak gibi bir şey var gibi Yani görünüyor. Yapılandırma diziye koymak alır biri istendiği gibi sadece geri alır yüklenir, ve bir kez önbelleğe alır biridir. Ben de, önbellek kesmek için kolay bir yol görmüyorum. Sen (alfabetik, sanıyorum adlandırarak) sizin modül için öncelik almak için deneyebilirsiniz, ama bu toplam kesmek ve daha sonra gizemli başarısız olasıdır. Bu yapılandırma olanaklarını öldürür.

Ayrıca iğrenç: Magento sadece Mage_Adminhtml_Block_Catalog_Product (kolayca geçersiz olabilir) içinde, iki yerlerde bu ızgara ister, ama aynı zamanda Mage_Adminhtml_Catalog_ProductController (! D'oh) gibi görünüyor. Kullanımı durumda bağlı olarak, katalog ürün blok geçersiz kılma ve kendi ile _prepareLayout() işlevini yerine düşünün. Siz de denetleyici geçersiz kılmak istiyorsanız, (Mage_Adminhtml_Catalog_ProductController iner) kendi denetleyicisi oluşturmak ve admin/catalog/product/grid sizin eylem yönlendirmek için yapılandırma içinde bir yeniden yazma tanımlamak isteyeceksiniz . Bir ağrı, ama en azından hedefe gerçekleştirir.

, Umut olur

Joe

Yerine catalog_product_grid yeniden, neden Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid üzerinde uzatmak değil? Bu şekilde Symmetrics modülü tüm bu kadar işlevleri tutacak ve kendininkini ekleyebilirsiniz.

Yani yerine:

<blocks>
    <adminhtml>
        <rewrite>
                <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid>
        </rewrite>
    </adminhtml>
</blocks>

Bu do:

<blocks>
    <adminhtml>
        <rewrite>
                <deliverytime_catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</deliverytime_catalog_product_grid>
        </rewrite>
    </adminhtml>
</blocks>

Tabii ki daha bir app bağlı / etc / modules dosyası uygun olacaktır.