Как переписать класс, который уже был переписан?

15

Обновление: я обнаружил, что класс, который мне действительно нужно переписать, - это SMDesign_SMDZoom_Block_Product_View_Mediaне то, SMDesign_ColorswatchProductView_Block_Product_View_Mediaчто я изначально думал. Тем не менее, точно такая же проблема все еще применяется.

Расширение SMDesign SMDZoom переписывает класс блока 'catalog / product_view_media'. XML для этого выглядит так:

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

Я хочу переписать этот класс еще раз. Я хочу переписать класс catalog / product_view_media, который переписывает этот модуль smdzoom. Можно ли это сделать? Как будет выглядеть config xml в моем модуле?

В настоящее время это мой модуль init xml файл:

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

и файл модуля config.xml:

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

Мой новый класс просто выглядит так для тестирования:

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

Я тестирую это, отображая подсказки к шаблонам, и вижу, что блок SMDesign все еще используется на странице просмотра продукта. Что я делаю неправильно?

Ник Роландо
источник

Ответы:

13

Я поместил <depends>узел в неправильном месте в файле инициализации моего модуля XML. Он должен быть вложен в узел имени модуля, например:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
Ник Роландо
источник
10

Эта часть здесь:

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

поможет вам только в том случае, если первоначальное создание экземпляра выполняется с помощью createBlock('colorswatchproductview/product_view_media)
этого, что маловероятно, поскольку первое расширение использует перезапись, т. е. они хотят быть показаны везде, где
createBlock('catalog/product_view_media')используются

Один вариант будет использовать переписать для того же блока

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

а затем в вашем классе блока расширить другой блок расширения

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Для этого ваше расширение должно быть загружено после первого. Во время моих тестов здесь http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ я выяснил, что порядок загрузки основан на алфавитном порядке файлов вашего приложения / etc / modules / xml , В качестве альтернативы на этот порядок можно повлиять с помощью узла Зависит (SMDesign_ColorswatchProductView).

Вы видите сообщение об ошибке, так как вы пытаетесь визуализировать блок изолированно, но ему нужен продукт, который он загружает из родительского блока:

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;
    }
Кристоф в Фуман
источник
Я отказался от ваших инструкций и не могу переписать класс, даже с узлом зависимости.
Ник Роландо
Попробуйте переименовать файл модуля init xml в z.xml с последующим обновлением кэша.
Кристоф в Фуман
Извините, я не вернулся к этому в течение некоторого времени. Я переименовал файл init xml в zzz.xml, и перезапись сработала! Итак, я думаю, мне нужно выяснить, почему <depends>узел не работает ..
Ник Роландо
Я благодарю +1 за помощь и веду меня к ответу :)
Ник Роландо
3

Вот почему переписывание базовых классов - отстой.

Съемка оттуда, но я думаю, что вам лучше всего расширить реализацию образца цвета, Mage_Catalog_Blog_Product_View_Mediaа затем заставить свой модуль зависеть от модуля выбора цвета.

Алан Сторм ответил на аналогичный вопрос здесь .

Еще лучше было бы попытаться сделать то, что вы пытаетесь сделать через наблюдателя.

wlvrn
источник