Como reescrever uma classe que já foi reescrita?

15

Atualização: descobri que a classe que realmente preciso reescrever é SMDesign_SMDZoom_Block_Product_View_Mediae não SMDesign_ColorswatchProductView_Block_Product_View_Mediacomo eu pensava originalmente. No entanto, o mesmo problema exato ainda se aplica.

A extensão SMDesign SMDZoom reescreve a classe de bloco 'catalog / product_view_media'. O xml para isso é assim:

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

Eu quero reescrever esta classe novamente. Quero reescrever a classe catalog / product_view_media que este módulo smdzoom está reescrevendo. Isso pode ser feito? Como seria o xml de configuração no meu módulo para fazer isso?

Atualmente, este é o meu arquivo xml init do módulo:

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

e o arquivo config.xml do módulo:

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

Minha nova classe simplesmente se parece com isso para testes:

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

Estou testando isso exibindo dicas de caminho do modelo e vendo o bloco SMDesign ainda sendo usado na página de visualização do produto. O que estou fazendo de errado?

Nick Rolando
fonte

Respostas:

13

Coloquei o <depends>nó no local errado no arquivo init xml do meu módulo. Ele deve ser aninhado no nó do nome do módulo, da seguinte maneira:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>
Nick Rolando
fonte
10

Esta parte aqui:

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

ajudará você apenas se a instanciação original for feita via createBlock('colorswatchproductview/product_view_media)
isso é improvável, pois a primeira extensão está usando uma reescrita, ou seja, eles querem ser mostrados em qualquer lugar onde
createBlock('catalog/product_view_media')é usado

Uma opção seria usar uma reescrita para o mesmo bloco

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

e depois na sua classe de bloco estenda o outro bloco de extensão

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Para que isso funcione, sua extensão precisa ser carregada após a primeira. Durante meus testes aqui, http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ Descobri que a ordem de carregamento é baseada na ordem alfabética dos arquivos app / etc / modules / xml . Como alternativa, esse pedido pode ser influenciado usando um nó Depends (SMDesign_ColorswatchProductView).

Você está vendo a mensagem de erro desde que está tentando renderizar o bloco isoladamente, mas ele precisa de um produto, que é carregado do seu bloco pai:

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 na Fooman
fonte
Eu segui suas instruções e não consigo reescrever a classe, mesmo com o nó depende.
Nick Rolando
Tente renomear o arquivo init xml do módulo para z.xml, seguido de uma atualização de cache.
Kristof at Fooman
Desculpe, eu não volto a isso há algum tempo. Renomeei o arquivo init xml para zzz.xml e a reescrita funcionou! Então eu acho que eu preciso para descobrir por que o <depends>nó não está funcionando ..
Nick Rolando
I +1 obrigado pela ajuda e me levando à resposta :)
Nick Rolando
3

É por isso que reescrever as classes principais é uma porcaria.

Filmando a partir daqui, aqui, mas acho que sua melhor aposta seria estender a implementação de amostras de cores Mage_Catalog_Blog_Product_View_Mediae fazer com que seu módulo dependa do módulo de amostras de cores.

Alan Storm respondeu a uma pergunta semelhante aqui .

Melhor ainda seria tentar fazer o que você está tentando fazer através de um observador.

wlvrn
fonte