Jak przepisać klasę, która już została przepisana?

15

Update: Znalazłem, że klasa I rzeczywiście trzeba przepisać to SMDesign_SMDZoom_Block_Product_View_Media, a nie SMDesign_ColorswatchProductView_Block_Product_View_Mediajak pierwotnie sądzono. Jednak dokładnie ten sam problem nadal obowiązuje.

Rozszerzenie SMDesign SMDZoom przepisuje blokową klasę „catalog / product_view_media”. Plik XML wygląda tak:

       <global>
    ...         
       <blocks>
        <smdzoom>
            <class>SMDesign_SMDZoom_Block</class>
        </smdzoom>
    </blocks>
    <blocks>
        <catalog>
            <rewrite>
                <product_view_media>SMDesign_SMDZoom_Block_Product_View_Media</product_view_media>
            </rewrite>
        </catalog>
    </blocks>
           ....
       </global>

Chcę ponownie napisać tę klasę. Chcę przepisać klasę katalog / product_view_media, którą ten moduł smdzoom przepisuje. Czy można to zrobić? Jak wyglądałby config xml w moim module, aby to zrobić?

Obecnie jest to plik xml init modułu:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
        </Goorin_SMDZoom>
        <depends>
            <Mage_Catalog />
            <SMDesign_SMDZoom />
        </depends>
    </modules>
</config>

i plik config.xml modułu:

<global>
        <blocks>
            <gbismdzoom>
                <class>Goorin_SMDZoom_Block</class>
            </gbismdzoom>
            <catalog>
                <rewrite>
                    <product_view_media>Goorin_SMDZoom_Block_Product_View_Media</product_view_media>
                </rewrite>
            </catalog>
        </blocks>
    </global>

Moja nowa klasa wygląda tak po prostu do testowania:

class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
    public function _construct() {
        parent::_construct();
    }
}

Testuję to, wyświetlając wskazówki dotyczące ścieżki szablonu i widzę, że blok SMDesign jest nadal używany na stronie widoku produktu. Co ja robię źle?

Nick Rolando
źródło

Odpowiedzi:

13

Umieściłem <depends>węzeł w niewłaściwej lokalizacji w pliku xml init modułu. Musi być zagnieżdżony w węźle nazwy modułu, tak jak poniżej:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
Nick Rolando
źródło
10

Ta część tutaj:

        <colorswatchproductview>
            <rewrite>
                <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
            </rewrite>
        </colorswatchproductview>

pomoże tylko wtedy, gdy oryginalna instancja zostanie wykonana za pomocą createBlock('colorswatchproductview/product_view_media)
tego, jest mało prawdopodobne, ponieważ pierwsze rozszerzenie korzysta z przepisywania, tzn. chcą być wyświetlane w dowolnym miejscu, w którym
createBlock('catalog/product_view_media')jest używane

Jedną z opcji byłoby użycie przepisania tego samego bloku

  <catalog>
    <rewrite>
      <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
    </rewrite>
  </catalog>

a następnie w klasie bloków przedłuż drugi blok rozszerzeń

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Aby to zadziałało, twoje rozszerzenie musi zostać załadowane po pierwszym. Podczas moich testów tutaj http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ ustaliłem, że kolejność ładowania jest oparta na kolejności alfabetycznej plików aplikacji / etc / modules / xml . Alternatywnie na kolejność można wpływać za pomocą węzła Depends (SMDesign_ColorswatchProductView).

Widzisz komunikat o błędzie, ponieważ próbujesz renderować blok w izolacji, ale potrzebuje on produktu, który ładuje z bloku nadrzędnego:

abstract class Mage_Catalog_Block_Product_View_Abstract extends Mage_Catalog_Block_Product_Abstract
{
    /**
     * Retrive product
     *
     * @return Mage_Catalog_Model_Product
     */
    public function getProduct()
    {
        $product = parent::getProduct();
        if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
            $product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
        }

        return $product;
    }
Kristof w Fooman
źródło
Poszedłem od twoich instrukcji i nie mogę przepisać klasy, nawet z zależnym węzłem.
Nick Rolando
Spróbuj zmienić nazwę pliku inicjującego moduł xml na z.xml, a następnie odśwież pamięć podręczną.
Kristof at Fooman
Przepraszam, że nie wróciłem do tego przez jakiś czas. Zmieniłem nazwę pliku init xml na zzz.xml i przepisanie działało! Myślę, że muszę dowiedzieć się, dlaczego <depends>węzeł nie działa.
Nick Rolando,
Daję +1 dzięki za pomoc i prowadząc mnie do odpowiedzi :)
Nick Rolando
3

Dlatego przepisywanie podstawowych klas jest do bani.

Strzelanie stamtąd tutaj, ale myślę, że najlepszym rozwiązaniem byłoby rozszerzenie implementacji próbki koloru, Mage_Catalog_Blog_Product_View_Mediaa następnie uzależnienie modułu od modułu próbki koloru.

Alan Storm odpowiedział na podobne pytanie tutaj .

Jeszcze lepiej byłoby spróbować zrobić wszystko, co próbujesz zrobić przez obserwatora.

wlvrn
źródło