2012-02-08 2 views
1

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

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

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

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

enter image description here

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

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

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

Неужели кто-то еще сталкивался с этим?

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

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

О системе предприятия, атрибут продукта, с одной и той же конфигурации и данные поступают через.

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

enter image description here

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

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

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

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

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

При Re приложени Купон: 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); 
} 

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

ответ

6

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

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

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

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

Это называет строку «Цитата/Предмет/Реферат».PHP»являются: $ Продукт = $ это -> _ GetData ('продукт');

Это будет просто получить кэшированные данные из системы, и которая состоит из выбора, как это:

$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

Ты просто спас мне жизнь, чувак! –

0

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

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

  • Вы можете установить значение атрибута по умолчанию «да»
  • Вы сделали переиндексации индексов по мере необходимости.
  • Вы отредактировали один тестовый продукт и явно задали значение атрибута «no».
  • (Чтобы быть уверенным) Вы обновили тайники.
  • Правило цены корзины вы устанавливаете точно так, как описано выше (применяются, если условия FALSE и разрешены, установлены на NO).

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

Если он по-прежнему не работает:

  • Что произойдет, если вы перефразировать условие только применяется, если все условия истинны и позволяют установлено значение TRUE (это удалить двойной негатив, который является более сложным) ?
  • Пожалуйста, разместите скриншоты бэкэнд-форм для правила цены корзины покупок, атрибута продукта и продукта.
+0

Я проверил ваши баллы, и все сделано так, как вы предлагали в пунктах. Будет проверять наличие двойного отрицательного значения. – ShaunOReilly

+0

Не имея двойных негативов, но тогда правило никогда не будет работать для нас. Но мне также нужно выяснить, почему я не получаю значение в коде, проходящем через атрибут. Я думаю, что система правил не виновата, но бит, который получает значение для Атрибута: возвращает $ this-> validateAttribute ($ object-> getData ($ this-> getAttribute())); - который возвращает null, даже если установлено значение по умолчанию. – ShaunOReilly

+1

Есть ли разница в свойствах атрибутов в таблицах базы данных 'eav_attribute' или' catalog_eav_attribute' между экземплярами 1,5 и 1,9? – Vinai

Смежные вопросы