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


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

Расширение Smdesign smdzoom перезаписывает класс блоков "каталог/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. Можно ли это сделать? Что будет ли xml-файл конфигурации выглядеть так, как в моем модуле, чтобы сделать это?

В настоящее время это мой 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 все еще используется на странице просмотра продукта. Что я делаю не так?

Author: Nick Rolando, 2013-06-25

3 answers

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

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
 13
Author: Nick Rolando, 2013-09-11 17:47:56

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

        <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. В качестве альтернативы на этот порядок можно повлиять с помощью узла Depends (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;
    }
 10
Author: Kristof at Fooman, 2013-06-26 00:15:54

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

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

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

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

 3
Author: wlvrn, 2017-05-23 12:37:14