¿Cómo reescribir una clase que ya ha sido reescrita?

15

Actualización: descubrí que la clase que realmente necesito reescribir es SMDesign_SMDZoom_Block_Product_View_Mediay no SMDesign_ColorswatchProductView_Block_Product_View_Mediacomo pensaba originalmente. Sin embargo, se sigue aplicando exactamente el mismo problema.

La extensión SMDesign SMDZoom reescribe la clase de bloque 'catalog / product_view_media'. El xml para eso se ve así:

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

Quiero reescribir esta clase nuevamente. Quiero reescribir la clase catalog / product_view_media que este módulo smdzoom está reescribiendo. Se puede hacer esto? ¿Cómo se vería la configuración xml en mi módulo para hacer esto?

Actualmente este es mi módulo init xml file:

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

y el archivo del módulo 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>

Mi nueva clase simplemente se ve así para las pruebas:

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

Estoy probando esto mostrando sugerencias de ruta de plantilla, y veo que el bloque SMDesign todavía se usa en la página de vista del producto. ¿Qué estoy haciendo mal?

Nick Rolando
fuente

Respuestas:

13

Puse el <depends>nodo en la ubicación incorrecta en el archivo init xml de mi módulo. Debe estar anidado dentro del nodo del nombre del módulo, así:

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

Esta parte aquí:

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

solo lo ayudará si la instancia original se realiza a través de createBlock('colorswatchproductview/product_view_media)
esto es poco probable ya que la primera extensión está usando una reescritura, es decir, quieren mostrarse en cualquier lugar donde
createBlock('catalog/product_view_media')se use

Una opción sería usar una reescritura para el mismo bloque

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

y luego en su clase de bloque extienda el otro bloque de extensión

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Para que esto funcione, su extensión debe cargarse después de la primera. Durante mis pruebas aquí http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ Me di cuenta de que el orden de carga se basa en el orden alfabético de sus archivos de aplicaciones / etc / modules / xml . Alternativamente, este orden puede verse influenciado mediante el uso de un nodo Depends (SMDesign_ColorswatchProductView).

Usted está viendo el mensaje de error ya que está intentando renderizar el bloque de forma aislada pero necesita un producto, que carga desde su bloque padre:

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 en Fooman
fuente
Seguí tus instrucciones y no puedo reescribir la clase, incluso con el nodo dependiente.
Nick Rolando
Intente renombrar el archivo xml init de su módulo a z.xml seguido de una actualización de caché.
Kristof en Fooman
Lo siento, no he vuelto a esto en un tiempo. ¡Cambié el nombre del archivo xml init a zzz.xml y la reescritura funcionó! Así que supongo que necesito averiguar por qué el <depends>nodo no funciona ...
Nick Rolando
I +1 gracias por la ayuda y me llevó a la respuesta :)
Nick Rolando
3

Es por eso que reescribir las clases principales apesta.

Disparo desde allí, pero creo que su mejor opción sería extender la implementación de la muestra de color Mage_Catalog_Blog_Product_View_Mediay luego hacer que su módulo dependa del módulo de muestra de color.

Alan Storm respondió una pregunta similar aquí .

Aún mejor sería tratar de hacer lo que sea que intentes hacer a través de un observador.

wlvrn
fuente