Модуль переопределения класса правил корзины покупок Magento

В моей установке magento есть правило бесплатной доставки корзины покупок, а также правила купона. При вводе купона бесплатная доставка пропадает. Это нежелательно, но известное условие для Magento: Бесплатная доставка Magento и скидка по купону Примечание. Если кто-то знает, как исправить ЭТУ проблему без переопределения, это было бы предпочтительнее.

Я работал над этим около 3 часов. Я искал SO, Google и другие и не могу найти решение.

Вопрос:
Я пытаюсь написать модуль, который исправляет поведение на основе этого сообщения:
Проблема Magento с ценой корзины

Я пытаюсь переопределить класс Mage_SalesRule_Model_Resource_Rule_Collection
Используя бесплатный инструмент Алана Шторма, я обнаружил, что uri — salesrule/resource_rule_collection,
И, проведя небольшое ручное расследование, мы выяснили, что класс находится здесь:
app/code/core/Mage/SalesRule/Model/Resource/Rule/Collection.php
Здесь ТАКЖЕ есть класс, который расширяет класс из приведенного выше файла:
app/code/core/Mage/SalesRule/Model/Mysql4/Rule/Collection.php
(какой из них я должен переопределить?)

На всю жизнь я не могу найти правильный синтаксис config.xml для переопределения нужного класса.

Мой конфиг сейчас выглядит так:

<config>
    <modules>
        <My_Couponrule>
            <version>1.0.0</version>
        </My_Couponrule>
    </modules>
    <global>
        <models>
            <salesrule>
                <rewrite>
                    <resource_rule_collection>My_Couponrule_Model_Resource_Rule_Collection</resource_rule_collection>
                </rewrite>
            </salesrule>
        </models>
    </global>

However, I have carefully tried every combination I can deduce might be appropriate and none of them have worked:

<salesrule_resource_rule><rewrite><collection>
<salesrule_resource><rewrite><rule_collection>
<salesrule_resource><rewrite><collection>  
<salesrule><rewrite><resource_collection>
<salesrule><rewrite><resource_rule_collection>
<salesrule><rewrite><rule_collection>
<salesrule_mysql4><rewrite><rule_collection>
<salesrule_mysql4_rule><rewrite><collection>

Примечания:
1. Я знаю, что файл конфигурации загружается, я проверил в System->Configuration->Advanced
2. Я также знаю, что файл конфигурации загружается, потому что у меня есть загруженные классы. вывод в браузер, и я пытался переопределить ДРУГИЕ классы и видел, что он успешно выводит правильный класс
3. Я знаю, что каждое сделанное мной изменение было загружено с помощью другой перезаписи, которую я добавил (и изменил каждый раз) просто для проверки изменение было правильно загружено.
3. Да, я очень внимательно следил за тем, чтобы теги были закрыты с помощью соответствующего закрывающего тега
4. Кэширование отключено, поэтому проблема не в том, что файл не загружается

Пожалуйста помоги. У меня осталось не так много волос...


person random_user_name    schedule 19.04.2012    source источник


Ответы (1)


Протестировано с Magento 1.6.1, должно применяться ко всем версиям (хотя соглашения об именах для моделей ресурсов изменились в последних версиях, поэтому действуйте соответственно).

Во-первых, два урока, которые должны помочь вам понять конфигурацию.

Урок 1

В Magento есть модели. Модели имеют модели ресурсов. Модели ресурсов выполняют запросы к базе данных/хранилищу данных, которые загружают объект модели.

Коллекции моделей — это третий тип вещей. Однако, поскольку коллекции моделей запрашивают базу данных, было решено, что коллекция моделей также будет ресурсом модели. Вот почему вы используете

Mage::getResourceModel('salesrule/resource_rule_collection');

для создания экземпляра коллекции. Когда вы используете

Mage::getModel('catalog/product')->getCollection();

Magento действительно звонит

Mage::getResourceModel('catalog/product_collection');

за кулисами.

Урок 2

Вы можете переписывать только модели, помощники и блоки. Вы не можете напрямую переписать модели ресурсов. К счастью, нам не повезло. Еще одна запутанная часть абстракции заключается в том, что модели ресурсов Magento фактически сами являются моделями. Когда вы звоните

Mage::getResourceModel('salesrule/resource_rule_collection');

Magento в конечном итоге звонит

Mage::getModel('salesrule_resource/resource_rule_collection')

для создания экземпляра класса модели ресурсов. Если вы этого не видите, группа моделей ресурсов salesrule преобразуется в группу моделей salesrule_resource. Значение salesrule_resource получается путем поиска узла <resourceModel> в узле моделей <salesrule>.

<salesrule>
    <class>Mage_SalesRule_Model</class>
    <resourceModel>salesrule_resource</resourceModel>
</salesrule>

Итак, это означает, что вам нужно переписать класс model salesrule_resource/resource_rule_collection. Следующий XML должен работать, заменив Packagename_Modulename_Model_Your_Class_Here именем вашего класса.

<config>
    <global>
        <models>
            <salesrule_resource>
                <rewrite>     
                    <rule_collection>Packagename_Modulename_Model_Your_Class_Here</rule_collection>
                </rewrite>
            </salesrule_resource>
        </models> 
    </global>
</config>
person Alan Storm    schedule 18.05.2012