/** * @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); } } } } }
/** * @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'); }