Правила корзины покупок делают наоборот - PullRequest
1 голос
/ 09 февраля 2012

Мы добавили атрибут продукта «да / нет» с надписью: «Разрешить этому продукту применять купоны?»со значением по умолчанию "yes".

Причина этого в том, что мы никогда не хотим, чтобы отдел продаж давал скидки на определенные основные продукты из тысяч доступных.

Мы могли бы добавитьэти продукты в качестве SKU для каждой из тысячи созданных купонов, но затем они могут быть случайно изменены или неправильно перечислены торговой командой, создавшей купоны.

Поэтому мы попросили их добавить это правило в своиновые купоны, чтобы исключить эти продукты.Мы также обновили все остальные купоны с помощью кода, чтобы включить это правило.

enter image description here

Когда я проверяю правило на Magento 1.5, выпуск Community, оно делает в точности противоположное тому, чтосостояние говорит.

Когда я тестирую то же правило на нашем другом корпоративном решении (magento 1.9), оно фактически делает то, что должно.

Когда у меня есть один продукт в корзине, являющийся продуктомдля этого атрибута установлено значение «Нет», и я применяю код купона, он принимает код купона.В другой системе (Enterprise) она отклоняет его, как и должно.

Кто-нибудь еще сталкивался с этим?

ОБНОВЛЕНИЕ: Хорошо, это стало еще интереснее.Когда я прошел через классы Rule, продукт был пропущен, но атрибут product не прошел.Область действия установлена ​​на веб-сайте, и я проверил, сохраняется ли она под этой областью в серверной части.

Это действительно странно ...

В корпоративной системе атрибут продукта, с той же конфигурацией и данными.

Я даже пытался не иметь двойных негативов с другим новым атрибутом, чтобы убедиться.При нарушении следующего правила купон отклоняется: «Код купона недействителен».Это правильно, так как продукт установлен как «Можно использовать купон? = Нет».

enter image description here

Но проблема в том, что я не хочу проверять вседругие продукты, а не те, которые помечены как «Нет».

В любом случае это не будет работать для нас, так как мы не хотим применять купон, если есть какой-либо продукт вкорзина со значением «Нет» для атрибута «Можно использовать купон?».

Это правило двойного отрицания, независимо от того, как вы на него смотрите.

Я прошел через /app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php через функцию validate (), при добавлении продукта во второй раз, и данные отображаются в атрибутах, но когда я иду и повторно применяю купон и снова выполняю эту функцию, эти значения исчезают.это странно.

При добавлении нового товара в корзину: before Adding Coupon

При повторном применении кода купона: after re-applying coupon

Где, черт возьми, сделалописание и некоторые другие атрибуты исчезают с?

ОБНОВЛЕНИЕ ПРИМЕЧАНИЕ Я немного ближе.Когда я изменяю следующую функцию validate () в "/app/code/core/Mage/SalesRule/Model/Rule/Condition/Product.php" из следующего:

public function validate(Varien_Object $object)
{
    $product = false;
    if ($object->getProduct() instanceof Mage_Catalog_Model_Product) {
        $product = $object->getProduct();
    } else {
        $product = Mage::getModel('catalog/product')
            ->load($object->getProductId());
    }

    $product
        ->setQuoteItemQty($object->getQty())
        ->setQuoteItemPrice($object->getPrice())
        ->setQuoteItemRowTotal($object->getBaseRowTotal());

    return parent::validate($product);
}

На это:

public function validate(Varien_Object $object)
{
    $product = false;
    $product = Mage::getModel('catalog/product')
        ->load($object->getProductId());

    $product
        ->setQuoteItemQty($object->getQty())
        ->setQuoteItemPrice($object->getPrice())
        ->setQuoteItemRowTotal($object->getBaseRowTotal());

    return parent::validate($product);
}

Тогда все отлично работает!

Ответы [ 2 ]

6 голосов
/ 10 февраля 2012

Обнаружил реальную проблему, и вот что я сделал для решения:

Следующий бит получает данные о продукте для правил цен в корзине:

        if ($object->getProduct() instanceof Mage_Catalog_Model_Product) {
            $product = $object->getProduct();
        } else {
            $product = Mage::getModel('catalog/product')
                ->load($object->getProductId());
        }

Виновникэта строка: $ product = $ object-> getProduct ();

, которая вызывает строку из "Quote / Item / Abstract.php", которая выглядит так: $ product = $ this -> _ getData ('product');

Он просто получит кэшированные данные из системы, и он состоит из следующего выбора:

$productCollection = Mage::getModel('catalog/product')->getCollection()
    ->setStoreId($this->getStoreId())
    ->addIdFilter($this->_productIds)
    ->addAttributeToSelect(Mage::getSingleton('sales/quote_config')->getProductAttributes())
    ->addOptionsToResult()
    ->addStoreFilter()
    ->addUrlRewrite()
    ->addTierPriceData();

Проблема с этим заключается в следующей строке:

->addAttributeToSelect(Mage::getSingleton('sales/quote_config')->getProductAttributes())

При этом будут получены только атрибуты, определенные в Config.xml для элементов цитаты:

    <quote>
        <item>
            <product_attributes>
                <sku/>
                <type_id/>
                <name/>
                <status/>
                <visibility/>
                <price/>
                <weight/>
                <url_path/>
                <url_key/>
                <thumbnail/>
                <small_image/>
                <tax_class_id/>
                <special_from_date/>
                <special_to_date/>
                <special_price/>
                <cost/>
                <is_recurring/><!-- for totals calculation, placing and processing order -->
                <recurring_profile/><!-- for placing order -->
                <gift_message_available/>
            </product_attributes>
        </item>
    </quote>

Это не приведет к получению нового пользовательского атрибута, который я хочу, и правило никогда не будетвозможность правильно сравнить данные с ожидаемым значением.

Добавление следующего xml в мой пользовательский модуль продаж config.xml, в котором есть некоторые наблюдатели для других вещей, решает проблему.

<sales>
    <quote>
        <item>
            <product_attributes>
                <exclude_from_coupon/>
            </product_attributes>
        </item>
    </quote>                
</sales>

Тогда все это работает!

Почему это работает в корпоративной версии magento

Не совсем знаю.Я думаю, что Enterprise, возможно, ищет настройки фактического определения атрибута и включает его в список атрибутов для сбора, а затем возвращает данные для него, я думаю.Я изучу это и обновлю здесь.

По крайней мере, теперь я знаю, в чем заключается настоящая проблема и почему не удалось выполнить условие правила для корзины покупок (купон).

Благодарявсе те, кто помог мне с некоторыми хорошими вопросами и предложениями.

Еще один день мудрее с пурпурным ...

0 голосов
/ 09 февраля 2012

Я проверил это с помощью Magento CE 1.5.1.0 и не могу воспроизвести вашу проблему. Для меня это работает.

Пожалуйста, перепроверьте следующее для вашей установки CE:

  • Вы устанавливаете значение атрибута по умолчанию равным "да"
  • Вы переиндексировали индексы по мере необходимости.
  • Вы отредактировали один тестовый продукт и явно установили значение атрибута на «нет».
  • (просто чтобы быть уверенным) Вы обновили кэши.
  • Вы устанавливаете правило цены корзины покупок в точности так, как описано выше (применяется, если условия ЛОЖЬ и значение разрешения установлено на НЕТ).

Если у вас нет какого-либо пользовательского кода, это должно работать. Это происходит при установке по умолчанию.

Если это все еще не работает:

  • Что произойдет, если перефразировать условие, чтобы оно применялось только в том случае, если все условия имеют значение ИСТИНА, а для разрешения установлено значение ИСТИНА (удаляет ли двойной отрицательный, что более сложно)?
  • Пожалуйста, опубликуйте скриншоты внутренних форм для правила цены корзины покупок, атрибута товара и товара.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...