コード例 #1
0
ファイル: RuleAction.php プロジェクト: saiber/livecart
 public static function createFromArray(array $array)
 {
     ActiveRecordModel::getApplication()->loadPluginClass('application.model.businessrule.action', $array['actionClass']);
     $inst = new $array['actionClass']();
     if (!empty($array['condition'])) {
         $condition = isset($array['instance']) ? $array['instance'] : RuleCondition::createFromArray($array['condition'], true);
         $inst->setCondition($condition);
     }
     unset($array['condition']);
     $inst->setParams($array);
     return $inst;
 }
コード例 #2
0
 public function testIsProductMatching()
 {
     $condition = DiscountCondition::getNewInstance();
     $condition->isEnabled->set(true);
     $condition->conditionClass->set('RuleConditionContainsProduct');
     $condition->save();
     $record = DiscountConditionRecord::getNewInstance($condition, $this->product1);
     $record->save();
     $condition->loadAll();
     $ruleCondition = RuleCondition::createFromArray($condition->toArray());
     $this->assertFalse($ruleCondition->isProductMatching($this->product2));
     $this->assertTrue($ruleCondition->isProductMatching($this->product1));
     // check matching by manufacturer
     $manufacturer = Manufacturer::getNewInstance('testing');
     $manufacturer->save();
     $this->product2->manufacturer->set($manufacturer);
     $record = DiscountConditionRecord::getNewInstance($condition, $manufacturer);
     $record->save();
     $condition->loadAll();
     $ruleCondition = RuleCondition::createFromArray($condition->toArray());
     $this->assertTrue($ruleCondition->isProductMatching($this->product2));
     // check matching by category
     $newCategory = Category::getNewInstance(Category::getRootNode());
     $newCategory->save();
     $newSubCategory = Category::getNewInstance($newCategory);
     $newSubCategory->save();
     $newProduct = Product::getNewInstance($newSubCategory);
     $newProduct->save();
     $newProduct->reload();
     $record = DiscountConditionRecord::getNewInstance($condition, $newCategory);
     $record->save();
     $this->assertFalse($ruleCondition->isProductMatching($newProduct));
     $condition->loadAll();
     $ruleCondition = RuleCondition::createFromArray($condition->toArray());
     $this->assertTrue($ruleCondition->isProductMatching($newProduct));
     // sub-condition
     $sub = DiscountCondition::getNewInstance($condition);
     $sub->isEnabled->set(true);
     $sub->conditionClass->set('RuleConditionContainsProduct');
     $sub->save();
     $condition->isAllSubconditions->set(true);
     $condition->save();
     $condition->loadAll();
     $manufacturer = Manufacturer::getNewInstance('new one');
     $manufacturer->save();
     $record = DiscountConditionRecord::getNewInstance($sub, $manufacturer);
     $record->save();
     $sub->loadAll();
     $subCondition = RuleCondition::createFromArray($sub->toArray());
     $this->assertFalse($subCondition->isProductMatching($newProduct));
     $ruleCondition = RuleCondition::createFromArray($condition->toArray());
     $this->assertFalse($ruleCondition->isProductMatching($newProduct));
     $newProduct->manufacturer->set($manufacturer);
     $newProduct->save();
     $this->assertTrue($ruleCondition->isProductMatching($newProduct));
     // sub-sub condition
     $sub->isAllSubconditions->set(false);
     $sub->save();
     for ($k = 1; $k <= 2; $k++) {
         $subs[$k] = DiscountCondition::getNewInstance($sub);
         $subs[$k]->isEnabled->set(true);
         $subs[$k]->conditionClass->set('RuleConditionContainsProduct');
     }
     // false
     $subs[1]->save();
     $someManufacturer = Manufacturer::getNewInstance('Manufacturer without products');
     $someManufacturer->save();
     $record = DiscountConditionRecord::getNewInstance($subs[1], $someManufacturer);
     $record->save();
     $subs[1]->loadAll();
     $sub->loadAll();
     $condition->loadAll();
     $this->assertFalse(RuleCondition::create($subs[1])->isProductMatching($newProduct));
     $this->assertFalse(RuleCondition::create($condition)->isProductMatching($newProduct));
     // true
     $subs[2]->save();
     $record = DiscountConditionRecord::getNewInstance($subs[2], $newProduct);
     $record->save();
     $subs[2]->loadAll();
     $sub->loadAll();
     $condition->loadAll();
     $this->assertTrue(RuleCondition::create($condition)->isProductMatching($newProduct));
 }
コード例 #3
0
ファイル: BusinessRuleController.php プロジェクト: saiber/www
 private function updateRuleCache()
 {
     $paths = array();
     $app = ActiveRecordModel::getApplication();
     foreach (array('condition', 'action') as $type) {
         $path = 'application.model.businessrule.' . $type;
         foreach ($app->getPluginClasses($path) as $class) {
             $paths[$class] = $app->getPluginClassPath($path, $class);
         }
     }
     $f = select(eq('DiscountCondition.isEnabled', true));
     $f->setOrder(f('DiscountCondition.position'));
     $conditions = ActiveRecord::getRecordSetArray('DiscountCondition', $f);
     $idMap = array();
     foreach ($conditions as &$condition) {
         $idMap[$condition['ID']] =& $condition;
     }
     // get condition records
     foreach (ActiveRecord::getRecordSetArray('DiscountConditionRecord', select(), array('Category')) as $record) {
         $idMap[$record['conditionID']]['records'][] = $record;
     }
     // get actions
     $f = select();
     $f->setOrder(f('DiscountAction.position'));
     foreach (ActiveRecord::getRecordSetArray('DiscountAction', $f) as $action) {
         if (!empty($action['actionConditionID'])) {
             $action['condition'] =& $idMap[$action['actionConditionID']];
         }
         $idMap[$action['conditionID']]['actions'][] = $action;
     }
     foreach ($conditions as &$condition) {
         if (!$condition['parentNodeID'] || !isset($idMap[$condition['parentNodeID']]) || !empty($condition['isActionCondition'])) {
             continue;
         }
         $idMap[$condition['parentNodeID']]['sub'][] =& $condition;
     }
     $rootCond = RuleCondition::createFromArray($idMap[DiscountCondition::ROOT_ID]);
     file_put_contents(self::getRuleFile(), '<?php $paths = ' . var_export($paths, true) . '; foreach ($paths as $path) { include_once($path); } return ' . var_export(serialize($rootCond->getConditions()), true) . '; ?>');
 }