示例#1
0
 /**
  * Return whether the product fits the rule
  *
  * @param Mage_CatalogRule_Model_Rule $rule
  * @param Varien_Object $product
  * @param array $websiteIds
  * @return bool
  */
 public function validateProduct(Mage_CatalogRule_Model_Rule $rule, Varien_Object $product, $websiteIds = array())
 {
     /** @var $helper Mage_Catalog_Helper_Product_Flat */
     $helper = $this->_factory->getHelper('catalog/product_flat');
     if ($helper->isEnabled() && $helper->isBuiltAllStores()) {
         /** @var $store Mage_Core_Model_Store */
         foreach ($this->_app->getStores(false) as $store) {
             if (count($websiteIds) == 0 || in_array($store->getWebsiteId(), $websiteIds)) {
                 /** @var $selectByStore Varien_Db_Select */
                 $selectByStore = $rule->getProductFlatSelect($store->getId());
                 $selectByStore->where('p.entity_id = ?', $product->getId());
                 $selectByStore->limit(1);
                 if ($this->_getReadAdapter()->fetchOne($selectByStore)) {
                     return true;
                 }
             }
         }
         return false;
     } else {
         return $rule->getConditions()->validate($product);
     }
 }
示例#2
0
 /**
  * Apply catalog rule to product
  *
  * @param Mage_CatalogRule_Model_Rule $rule
  * @param Mage_Catalog_Model_Product $product
  * @param array $websiteIds
  *
  * @return Mage_CatalogRule_Model_Resource_Rule
  */
 public function applyToProduct($rule, $product, $websiteIds)
 {
     if (!$rule->getIsActive()) {
         return $this;
     }
     $ruleId = $rule->getId();
     $productId = $product->getId();
     $write = $this->_getWriteAdapter();
     $write->beginTransaction();
     $write->delete($this->getTable('catalogrule/rule_product'), array($write->quoteInto('rule_id=?', $ruleId), $write->quoteInto('product_id=?', $productId)));
     if (!$rule->getConditions()->validate($product)) {
         $write->delete($this->getTable('catalogrule/rule_product_price'), array($write->quoteInto('product_id=?', $productId)));
         $write->commit();
         return $this;
     }
     $customerGroupIds = $rule->getCustomerGroupIds();
     $fromTime = strtotime($rule->getFromDate());
     $toTime = strtotime($rule->getToDate());
     $toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;
     $sortOrder = (int) $rule->getSortOrder();
     $actionOperator = $rule->getSimpleAction();
     $actionAmount = $rule->getDiscountAmount();
     $actionStop = $rule->getStopRulesProcessing();
     $subActionOperator = $rule->getSubIsEnable() ? $rule->getSubSimpleAction() : '';
     $subActionAmount = $rule->getSubDiscountAmount();
     $rows = array();
     try {
         foreach ($websiteIds as $websiteId) {
             foreach ($customerGroupIds as $customerGroupId) {
                 $rows[] = array('rule_id' => $ruleId, 'from_time' => $fromTime, 'to_time' => $toTime, 'website_id' => $websiteId, 'customer_group_id' => $customerGroupId, 'product_id' => $productId, 'action_operator' => $actionOperator, 'action_amount' => $actionAmount, 'action_stop' => $actionStop, 'sort_order' => $sortOrder, 'sub_simple_action' => $subActionOperator, 'sub_discount_amount' => $subActionAmount);
                 if (count($rows) == 1000) {
                     $write->insertMultiple($this->getTable('catalogrule/rule_product'), $rows);
                     $rows = array();
                 }
             }
         }
         if (!empty($rows)) {
             $write->insertMultiple($this->getTable('catalogrule/rule_product'), $rows);
         }
     } catch (Exception $e) {
         $write->rollback();
         throw $e;
     }
     $this->applyAllRulesForDateRange(null, null, $product);
     $write->commit();
     return $this;
 }
示例#3
0
 /**
  * Apply catalog rule to product
  *
  * @param   Mage_CatalogRule_Model_Rule $rule
  * @param   Mage_Catalog_Model_Product $product
  * @param   array $websiteIds
  * @return  Mage_CatalogRule_Model_Mysql4_Rule
  */
 public function applyToProduct($rule, $product, $websiteIds)
 {
     if (!$rule->getIsActive()) {
         return $this;
     }
     $ruleId = $rule->getId();
     $productId = $product->getId();
     $write = $this->_getWriteAdapter();
     $write->beginTransaction();
     $write->delete($this->getTable('catalogrule/rule_product'), array($write->quoteInto('rule_id=?', $ruleId), $write->quoteInto('product_id=?', $productId)));
     if (!$rule->getConditions()->validate($product)) {
         $write->delete($this->getTable('catalogrule/rule_product_price'), array($write->quoteInto('product_id=?', $productId)));
         $write->commit();
         return $this;
     }
     $customerGroupIds = $rule->getCustomerGroupIds();
     $fromTime = strtotime($rule->getFromDate());
     $toTime = strtotime($rule->getToDate());
     $toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;
     $sortOrder = (int) $rule->getSortOrder();
     $actionOperator = $rule->getSimpleAction();
     $actionAmount = $rule->getDiscountAmount();
     $actionStop = $rule->getStopRulesProcessing();
     $rows = array();
     $header = 'replace into ' . $this->getTable('catalogrule/rule_product') . ' (
             rule_id,
             from_time,
             to_time,
             website_id,
             customer_group_id,
             product_id,
             action_operator,
             action_amount,
             action_stop,
             sort_order
         ) values ';
     try {
         foreach ($websiteIds as $websiteId) {
             foreach ($customerGroupIds as $customerGroupId) {
                 $rows[] = "(\n                        '{$ruleId}',\n                        '{$fromTime}',\n                        '{$toTime}',\n                        '{$websiteId}',\n                        '{$customerGroupId}',\n                        '{$productId}',\n                        '{$actionOperator}',\n                        '{$actionAmount}',\n                        '{$actionStop}',\n                        '{$sortOrder}'\n                    )";
                 if (sizeof($rows) == 100) {
                     $sql = $header . join(',', $rows);
                     $write->query($sql);
                     $rows = array();
                 }
             }
         }
         if (!empty($rows)) {
             $sql = $header . join(',', $rows);
             $write->query($sql);
         }
     } catch (Exception $e) {
         $write->rollback();
         throw $e;
     }
     $this->applyAllRulesForDateRange(null, null, $product);
     $write->commit();
     return $this;
 }
示例#4
0
 /**
  * Apply catalog rule to product
  * 
  * @param Mage_CatalogRule_Model_Rule $rule
  * @param Mage_Catalog_Model_Product $product
  * @param array $websiteIds
  * @param array $storeIds
  * 
  * @return Mage_CatalogRule_Model_Resource_Rule
  */
 public function applyToProduct2($rule, $product, $websiteIds, $storeIds)
 {
     if (!$rule->getIsActive()) {
         return $this;
     }
     $helper = $this->getStorePricingHelper();
     $ruleId = $rule->getId();
     $productId = $product->getId();
     $write = $this->_getWriteAdapter();
     $write->beginTransaction();
     $write->delete($this->getTable('catalogrule/rule_product'), array($write->quoteInto('rule_id=?', $ruleId), $write->quoteInto('product_id=?', $productId)));
     if (!$rule->getConditions()->validate($product)) {
         $write->delete($this->getTable('catalogrule/rule_product_price'), array($write->quoteInto('product_id=?', $productId)));
         $write->commit();
         return $this;
     }
     $customerGroupIds = $rule->getCustomerGroupIds();
     $fromTime = strtotime($rule->getFromDate());
     $toTime = strtotime($rule->getToDate());
     $toTime = $toTime ? $toTime + self::SECONDS_IN_DAY - 1 : 0;
     $sortOrder = (int) $rule->getSortOrder();
     $actionOperator = $rule->getSimpleAction();
     $actionStop = $rule->getStopRulesProcessing();
     if ($this->getVersionHelper()->isGe1700()) {
         $subActionOperator = $rule->getSubIsEnable() ? $rule->getSubSimpleAction() : '';
     }
     $rows = array();
     if (!$this->getVersionHelper()->isGe1600()) {
         $header = 'replace into ' . $this->getTable('catalogrule/rule_product') . ' (
             rule_id,
             from_time,
             to_time,
             website_id,
             store_id,
             customer_group_id,
             product_id,
             action_operator,
             action_amount,
             action_stop,
             sort_order
         ) values ';
     }
     try {
         foreach ($websiteIds as $websiteId) {
             foreach ($helper->getStoreIdsByWebsiteId($websiteId) as $storeId) {
                 if (in_array($storeId, $storeIds)) {
                     foreach ($customerGroupIds as $customerGroupId) {
                         $discountAmount = $rule->getDiscountAmount();
                         if ($this->getVersionHelper()->isGe1600()) {
                             $row = array('rule_id' => $ruleId, 'from_time' => $fromTime, 'to_time' => $toTime, 'website_id' => $websiteId, 'store_id' => $storeId, 'customer_group_id' => $customerGroupId, 'product_id' => $productId, 'action_operator' => $actionOperator, 'action_amount' => $discountAmount, 'action_stop' => $actionStop, 'sort_order' => $sortOrder);
                             if ($this->getVersionHelper()->isGe1700()) {
                                 $subDiscountAmount = $rule->getSubDiscountAmount();
                                 $row['sub_simple_action'] = $subActionOperator;
                                 $row['sub_discount_amount'] = $subDiscountAmount;
                             }
                             $rows[] = $row;
                             if (count($rows) == 1000) {
                                 $write->insertMultiple($this->getTable('catalogrule/rule_product'), $rows);
                                 $rows = array();
                             }
                         } else {
                             $rows[] = "(\n                                    '{$ruleId}',\n                                    '{$fromTime}',\n                                    '{$toTime}',\n                                    '{$websiteId}',\n                                    '{$storeId}',\n                                    '{$customerGroupId}',\n                                    '{$productId}',\n                                    '{$actionOperator}',\n                                    '{$discountAmount}',\n                                    '{$actionStop}',\n                                    '{$sortOrder}'\n                                )";
                             if (sizeof($rows) == 100) {
                                 $sql = $header . join(',', $rows);
                                 $write->query($sql);
                                 $rows = array();
                             }
                         }
                     }
                 }
             }
         }
         if ($this->getVersionHelper()->isGe1600()) {
             if (!empty($rows)) {
                 $write->insertMultiple($this->getTable('catalogrule/rule_product'), $rows);
             }
         } else {
             if (!empty($rows)) {
                 $sql = $header . join(',', $rows);
                 $write->query($sql);
             }
         }
     } catch (Exception $e) {
         $write->rollback();
         throw $e;
     }
     $this->applyAllRulesForDateRange(null, null, $product);
     $write->commit();
     return $this;
 }