Як переписати клас, який вже був переписаний?


15

Оновлення: я виявив, що клас, який я насправді потрібно переписати, є таким, який 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>

Я хочу ще раз переписати цей клас. Я хочу переписати каталог / product_view_media клас, який цей модуль smdzoom переписує. Це можна зробити? Як виглядатиме конфігураційний 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>вузол у неправильному місці у файлі init 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 / module / 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;
    }

Я відмовився від ваших інструкцій і не можу переписати клас, навіть із вузлом залежності.
Нік Роландо

Спробуйте перейменувати ваш файл init xml у модуль z.xml з подальшим оновленням кешу.
Крістоф у Фомані

Вибачте, я не повернувся до цього за деякий час. Я перейменував файл init xml у zzz.xml і перезапис працював! Тож я думаю, мені потрібно з’ясувати, чому <depends>вузол не працює ..
Нік Роландо

Я +1 дякую за допомогу та веде мене до відповіді :)
Нік Роландо

3

Ось чому переписування основних класів відстійне.

Зйомка звідти стегна тут, але я думаю, що найкращим варіантом буде розширити реалізацію кольорового зразка, Mage_Catalog_Blog_Product_View_Mediaа потім зробити ваш модуль залежним від модуля кольорового зразка.

Алан Сторм відповів на таке запитання тут .

Ще краще було б спробувати зробити все, що ви намагаєтесь зробити через спостерігача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.