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