Example #1
0
 /**
  * {@inheritDoc}
  */
 public function isEnabled()
 {
     if (null === $this->rule) {
         throw new FeatureException('No Rule has been set');
     }
     if (null === $this->context) {
         $this->context = new Context();
     }
     return $this->rule->evaluate($this->context);
 }
Example #2
0
 protected function executeSetRule($types, $discountPercent)
 {
     $contextOptions['true'] = true;
     $andOperators = [];
     $orOperators = [];
     $trueVar = new Variable('true');
     foreach ($types as $type) {
         if (is_array($type)) {
             foreach ($type as $t) {
                 $contextOptions['contains' . $t . 'Products'] = $this->containsProductWithType($t);
                 $orOperators[] = new EqualTo(new Variable('contains' . $t . 'Products'), $trueVar);
             }
             $andOperators[] = new LogicalOr($orOperators);
         } else {
             $contextOptions['contains' . $type . 'Products'] = $this->containsProductWithType($type);
             $var = new Variable('contains' . $type . 'Products');
             $andOperators[] = new EqualTo($var, $trueVar);
         }
     }
     $context = new Context($contextOptions);
     $rule = new Rule(new LogicalAnd($andOperators), function () use($types, $discountPercent) {
         $discount = 0;
         foreach ($types as $type) {
             if (!is_array($type)) {
                 $extractTypes[] = $type;
             }
         }
         while (true) {
             $tuple = $this->extractProductsTuple($extractTypes);
             if (empty($tuple)) {
                 break;
             }
             foreach ($tuple as $product) {
                 $discount += $product['price'] * $discountPercent / 100;
             }
         }
         $this->discount += $discount;
     });
     $rule->execute($context);
 }
Example #3
0
 /**
  * evaluateRule 
  * 
  * @param RankRule $rule 
  * @param Context $ctx 
  * @access private
  * @return void
  */
 private function evaluateRule(RankRule $rule, Context $ctx)
 {
     $propositionClass = sprintf("Ruler\\Operator\\%s", ucfirst($rule->getComparator()));
     if (!class_exists($propositionClass)) {
         throw new \Exception("Class {$propositionClass} does not exist");
     }
     // If fact is a date, we must convert value to unix timestamp
     // to do comparison
     if (preg_match('/date/i', $rule->getFact()->getName())) {
         $date = new \DateTime($rule->getValue());
         $value = $date->getTimestamp();
     } else {
         $value = $rule->getValue();
     }
     $proposition = new $propositionClass(new Variable($rule->getFact()->getName()), new Variable('x' . $rule->getFact()->getName(), $value));
     // add x value to context
     $myRule = new Rule($proposition, function () {
     });
     if ($myRule->evaluate($ctx)) {
         if ($this->debug) {
             print "<h2>rule passed!</h2>";
         }
         return true;
     } else {
         if ($this->debug) {
             print "<h2>rule failed</h2>";
         }
         return false;
     }
 }
Example #4
0
 /**
  * @expectedException \LogicException
  */
 public function testNonCallableActionsWillThrowAnException()
 {
     $context = new Context();
     $rule = new Rule(new TrueProposition(), 'this is not callable');
     $rule->execute($context);
 }