Como lidar com classes "Mysql4" obsoletas ao reescrever modelos de recursos

8

Eu tenho que reescrever Mage_Catalog_Model_Resource_Category_Flat.

A antiga classe de recurso Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flatainda está lá no Magento 1.7 para compatibilidade com versões anteriores e estende a nova.

Uma pesquisa na base de código para o alias do modelo completo resource_eav_mysql4_category_flatnão produziu nenhum resultado. Mas o config.xmlde Mage_Catalog contém esta linha:

<deprecatedNode>catalog_resource_eav_mysql4</deprecatedNode>

E não sei onde e como deprecatedNodeé usado.

Que dificuldades se pode esperar ao reescrever esse modelo de recursos? Devo reescrever as duas classes? Ou posso ignorar com segurança a classe mysql4?

Fabian Schmengler
fonte

Respostas:

5

Se você desenvolver uma extensão para uso pessoal que funcione apenas para o projeto desenvolvido no Magento 1.6+, não haverá preocupações. Você deve substituir apenas Mage_Catalog_Model_Resource_Category_Flatadicionando isso no config.xmlarquivo da sua extensão:

<models>
    <catalog_resource>
        <rewrite>
            <category_flat>Namespace_Module_Model_Resource_Category_Flat</category_flat>
        </rewrite>
    </catalog_resource>
</models>

Se você está construindo uma extensão e deseja que ela funcione na versão anterior à 1.6, você precisa substituir a Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flatclasse também. Nesse caso, sua config.xmlseção deve ficar assim:

<models>
    <catalog_resource><!--used for 1.6+ -->
        <rewrite>
            <category_flat>Namespace_Module_Model_Resource_Category_Flat</category_flat>
        </rewrite>
    </catalog_resource>
    <catalog_resource_eav_mysql4><!-- used for versions before 1.6 -->
        <rewrite>
            <category_flat>Namespace_Module_Model_Resource_Eav_Mysql4_Category_Flat</category_flat>
        </rewrite>
    </catalog_resource_eav_mysql4>
</models>

Você deve colocar toda a sua lógica Namespace_Module_Model_Resource_Category_Flate a classe para versões anteriores à 1.6 deve ficar assim:

class Namespace_Module_Model_Resource_Eav_Mysql4_Category_Flat extends Namespace_Module_Model_Resource_Category_Flat
{
}

Dessa forma, ambas as versões usam o mesmo código.

Marius
fonte
7

deprecatedNodeé usado pelo Magento para tentar carregar o mysql4*modelo de recursos, se resource* não foi encontrado. Faça referência aos comentários Mage_Core_Model_Config::getGroupedClassNamee Mage_Core_Model_Resource::getEntity:

/**
 * Backwards compatibility for pre-MMDB extensions.
 * In MMDB release resource nodes <..._mysql4> were renamed to <..._resource>. So <deprecatedNode> is left
 * to keep name of previously used nodes, that still may be used by non-updated extensions.
 */

Se houver um resource*modelo, você deve reescrevê-lo, caso contrário, reescreva mysql4*um. Exemplo de reescrita do mysql4*modelo de recursos:

<config>
    <global>
        <models>
            <review_mysql4>
                <rewrite>
                    <review_collection>AW_AdvancedReviews_Model_Mysql4_Review_Collection</review_collection>
                    <review>AW_AdvancedReviews_Model_Mysql4_Review</review>
                </rewrite>
            </review_mysql4>
        </models>
    </global>
</config>

As mysql4*classes existem apenas para compatibilidade com versões anteriores das implementações existentes que já as estenderam. Ou seja, classes de shell para evitar forçar o código existente a atualizar as extensões em tudo para continuar funcionando.

Dmytro Zavalkin
fonte