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

8

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

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

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

<deprecatedNode>catalog_resource_eav_mysql4</deprecatedNode>

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

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

Фабиан Шменглер
источник

Ответы:

5

Если вы разрабатываете расширение для личного использования, которое должно работать только для вашего проекта, построенного на 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
{
}

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

Мариус
источник
7

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*классы только там для обеспечения обратной совместимости для существующих реализаций , которые уже протяженных их. Т.е. классы оболочки, чтобы не заставлять существующий код обновлять расширения на всем, чтобы продолжать работать.

Дмитрий Завалкин
источник