Как справиться с устаревшими классами «mysql4» при переписывании моделей ресурсов

magento.stackexchange https://magento.stackexchange.com/questions/3786

Вопрос

Я должен переписать Mage_Catalog_Model_Resource_Category_Flat.

Старый класс ресурсов Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flat все еще там в Magento 1.7 для обратной совместимости и расширяет новый.

Поиск в кодовой базе для полного псевдоним модели resource_eav_mysql4_category_flat не дал никакого результата. Но config.xml mage_catalog содержит эту строку:

<deprecatedNode>catalog_resource_eav_mysql4</deprecatedNode>

И я не знаю, где и как deprecatedNode используется.

Какие трудности ожидать при переписке такой модели ресурсов? Стоит ли переписать оба класса? Или я могу безопасно игнорировать класс MySQL4?

Это было полезно?

Решение

Если вы разрабатываете расширение для личного использования, которое должно работать только для вашего проекта Build на Magento 1.6+, то нет никаких забот. Вы должны только отменить Mage_Catalog_Model_Resource_Category_Flat добавив это в config.xml Файл вашего расширения:

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

Если вы создаете расширение и хотите, чтобы оно работало над версией до 1.6, вам нужно переопределить Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flat класс также. В этом случае ваш config.xml Раздел должен выглядеть так:

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

Вы должны вложить всю свою логику Namespace_Module_Model_Resource_Category_Flat и класс для версий до 1.6 должен выглядеть так:

class Namespace_Module_Model_Resource_Eav_Mysql4_Category_Flat extends Namespace_Module_Model_Resource_Category_Flat
{
}

Таким образом, обе версии используют один и тот же код.

Другие советы

deprecatedNode используется Magento, чтобы попытаться загрузить mysql4* модель ресурса, если resource*не было найдено. Ссылаться на комментарии от Mage_Core_Model_Config::getGroupedClassName а также 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.
 */

Если там есть resource* модель, которую вы должны переписать, в противном случае переписать mysql4* один. Пример переписывания mysql4* модель ресурса:

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

А mysql4* Классы представляются только для обратной совместимости для существующих реализаций, которые уже расширили их. Т.е. классы оболочки, чтобы избежать принуждения существующего кода, обновлять расширение всего, чтобы продолжать работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top