/**
  * @param array                 $values
  * @param ContextInterface      $context
  * @param DataAccessorInterface $data
  * @param bool                  $evaluate
  * @param string                $encoding
  */
 public function processExpressions(array &$values, ContextInterface $context, DataAccessorInterface $data, $evaluate, $encoding)
 {
     if (!$evaluate && $encoding === null) {
         return;
     }
     foreach ($values as $key => &$value) {
         if (is_array($value)) {
             if (!empty($value)) {
                 switch ($this->checkArrayValue($value)) {
                     case self::ARRAY_IS_REGULAR:
                         $this->processExpressions($value, $context, $data, $evaluate, $encoding);
                         break;
                     case self::ARRAY_IS_EXPRESSION:
                         $value = $this->processExpression($this->expressionAssembler->assemble($value), $context, $data, $evaluate, $encoding);
                         break;
                     case self::ARRAY_IS_EXPRESSION_STARTED_WITH_BACKSLASH:
                         // the backslash (\) at the begin of the array key should be removed
                         $value = [substr(key($value), 1) => reset($value)];
                         break;
                 }
             }
         } elseif ($value instanceof OptionValueBag) {
             foreach ($value->all() as $action) {
                 $args = $action->getArguments();
                 $this->processExpressions($args, $context, $data, $evaluate, $encoding);
                 foreach ($args as $index => $arg) {
                     $action->setArgument($index, $arg);
                 }
             }
         } elseif ($value instanceof ExpressionInterface) {
             $value = $this->processExpression($value, $context, $data, $evaluate, $encoding);
         }
     }
 }
 /**
  * @param array                 $values
  * @param ContextInterface      $context
  * @param DataAccessorInterface $data
  * @param bool                  $evaluate
  * @param string                $encoding
  */
 protected function processExpressions(array &$values, ContextInterface $context, DataAccessorInterface $data, $evaluate, $encoding)
 {
     foreach ($values as $key => &$value) {
         if (is_array($value)) {
             if (!empty($value)) {
                 switch ($this->checkArrayValue($value)) {
                     case 0:
                         $this->processExpressions($value, $context, $data, $evaluate, $encoding);
                         break;
                     case 1:
                         $value = $this->processExpression($this->expressionAssembler->assemble($value), $context, $data, $evaluate, $encoding);
                         break;
                     case -1:
                         // the backslash (\) at the begin of the array key should be removed
                         $value = [substr(key($value), 1) => reset($value)];
                         break;
                 }
             }
         } elseif ($value instanceof ExpressionInterface) {
             $value = $this->processExpression($value, $context, $data, $evaluate, $encoding);
         } elseif ($value instanceof OptionValueBag) {
             foreach ($value->all() as $action) {
                 $args = $action->getArguments();
                 $this->processExpressions($args, $context, $data, $evaluate, $encoding);
                 foreach ($args as $index => $arg) {
                     $action->setArgument($index, $arg);
                 }
             }
         }
     }
 }
示例#3
0
 /**
  * @return AssemblerInterface
  */
 public function getAssembler()
 {
     if (!$this->assembler) {
         $this->assembler = new ExpressionAssembler($this->getFactory());
         $this->assembler->addConfigurationPass(new ReplacePropertyPath());
     }
     return $this->assembler;
 }
 /**
  * {@inheritdoc}
  */
 public function prepare(array $source, VisitorCollection $visitorCollection)
 {
     // prepare condition collection
     if (!empty($source[self::NODE_CONDITIONS])) {
         try {
             $expr = $this->expressionAssembler->assemble($source[self::NODE_CONDITIONS]);
             if ($expr) {
                 $visitorCollection->append(new ConfigExpressionConditionVisitor($expr));
             }
         } catch (\Exception $e) {
             throw new SyntaxException('invalid conditions. ' . $e->getMessage(), $source[self::NODE_CONDITIONS], self::NODE_CONDITIONS);
         }
     }
 }
 public function testProcessExpressionsEncodesAllExpressions()
 {
     $context = new LayoutContext();
     $context->set('expressions_evaluate_deferred', true);
     $data = $this->getMock('Oro\\Component\\Layout\\DataAccessorInterface');
     $expr = $this->getMock('Oro\\Component\\ConfigExpression\\ExpressionInterface');
     $expr->expects($this->once())->method('toArray')->will($this->returnValue(['@true' => null]));
     $classExpr = new Func\GetValue();
     $classExpr->initialize([new PropertyPath('context.css_class')]);
     $classAttr = new OptionValueBag();
     $classAttr->add(['@value' => ['$context.css_class']]);
     $expectedClassAttr = new OptionValueBag();
     $expectedClassAttr->add('{"@value":{"parameters":["$context.css_class"]}}');
     $values['expr_object'] = $expr;
     $values['expr_array'] = ['@true' => null];
     $values['not_expr_array'] = ['\\@true' => null];
     $values['scalar'] = 123;
     $values['attr']['enabled'] = ['@true' => null];
     $values['attr']['class'] = $classAttr;
     $values['label_attr']['enabled'] = ['@true' => null];
     $this->expressionAssembler->expects($this->exactly(4))->method('assemble')->will($this->returnValueMap([[['@true' => null], new Condition\True()], [['@value' => ['$context.css_class']], $classExpr]]));
     $this->processor->processExpressions($values, $context, $data, false, 'json');
     $this->assertSame('{"@true":null}', $values['expr_object'], 'Failed asserting that an expression is encoded');
     $this->assertSame('{"@true":null}', $values['expr_array'], 'Failed asserting that an expression is assembled and encoded');
     $this->assertSame(['@true' => null], $values['not_expr_array'], 'Failed asserting that a backslash at the begin of the array key is removed');
     $this->assertSame(123, $values['scalar'], 'Failed asserting that a scalar value is not changed');
     $this->assertSame('{"@true":null}', $values['attr']['enabled'], 'Failed asserting that an expression in "attr" is assembled and encoded');
     $this->assertEquals($expectedClassAttr, $values['attr']['class'], 'Failed asserting that "attr.class" is assembled and encoded');
     $this->assertSame('{"@true":null}', $values['label_attr']['enabled'], 'Failed asserting that an expression in "label_attr" is assembled and encoded');
 }