Почему Magento использовал терпку устаревшего анонса в объявлении моделей ресурсов в списке желаний

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

Вопрос

Я видел интересную вещь в конфигурации модели в config.xml. Я был неизвестен по тегам <deprecatedNode> в объявлении класса модельного класса и хочу знать об этих тегах.

В пользовательском расширении нам просто нужен этот тип модельного класса.

 <models>
            <[module]>
                <class>[Namespace]_[Module]_Model</class>
                <resourceModel>[module]_mysql4</resourceModel>
            </[module]>
            <[module]_mysql4>
                <class>[Namespace]_[Module]_Model_Mysql4</class>
                <entities>
                    <[module]>
                        <table>[module]</table>
                    </[module]>
                </entities>
            </[module]_mysql4>
        </models>

Ссылка -http://www.magentocommerce.com/wiki/5_-_modules_and_development/0_-_module_development_in_magento/custom_module_with_custom_database_table

But in magento existing modules как Wishlist 's config.xml Определите модель с помощью TemprecatedNode и ResourceModel объявить с помощью этого шаблона

<wishlist>
                <class>Mage_Wishlist_Model</class>
                <resourceModel>wishlist_resource</resourceModel>
            </wishlist>
<wishlist_resource>

    <class>Mage_Wishlist_Model_Resource</class>
                <deprecatedNode>wishlist_mysql4</deprecatedNode>
                <entities>
                    <wishlist>
                        <table>wishlist</table>
                    </wishlist>
                    <item>
                        <table>wishlist_item</table>
                    </item>
                    <item>
                        <table>wishlist_item</table>
                    </item>
                    <item_option><table>wishlist_item_option</table></item_option>
                </entities>
            </wishlist_resource>

Почему этот тип кода, используемый в Magento

 <resourceModel>wishlist_resource</resourceModel>
                </wishlist>

                <wishlist_resource>

                    <class>Mage_Wishlist_Model_Resource</class>
                    <deprecatedNode>wishlist_mysql4</deprecatedNode>
Это было полезно?

Решение

В версиях до 1.6 <resourceModel> Узел обычно имел это имя: [module]_mysql4.
Начиная с версии 1.6 Magento поддерживает (в теории) другие типы баз данных, а не только MySQL. Итак, имя модели ресурса изменилось на wishlist_resource.
Но для того, чтобы сделать старые расширения, которые могут переписать некоторую модель ресурсов, все еще работает, это deprecatedNode был представлен.
Если модель или модель ресурса не найдены с помощью [module]_resource Tag затем Magento ищет его, используя deprecatedNode ценность.
Взгляните на эти методы:
Mage_Core_Model_Resource::getEntity

public function getEntity($model, $entity)
{
    $modelsNode = Mage::getConfig()->getNode()->global->models;
    $entityConfig = $modelsNode->$model->entities->{$entity};

    /**
     * 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.
     */
    if (isset($modelsNode->$model->deprecatedNode)) {
        $deprecatedNode = $modelsNode->$model->deprecatedNode;
        if (isset($modelsNode->$deprecatedNode->entities->$entity)) {
            $entityConfig = $modelsNode->$deprecatedNode->entities->$entity;
        }
    }

    return $entityConfig;
}

а также Mage_Core_Model_Config::getGroupedClassName

public function getGroupedClassName($groupType, $classId, $groupRootNode=null)
{
    ....
    $className = null;
    if (isset($config->rewrite->$class)) {
        $className = (string)$config->rewrite->$class;
    } else {
        /**
         * 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.
         */
        if ($config->deprecatedNode) {
            $deprecatedNode = $config->deprecatedNode;
            $configOld = $this->_xml->global->{$groupType.'s'}->$deprecatedNode;
            if (isset($configOld->rewrite->$class)) {
                $className = (string) $configOld->rewrite->$class;
            }
        }
    }
    ....
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top