/
QueryParameterContentViewQueryTypeMapper.php
85 lines (73 loc) · 2.54 KB
/
QueryParameterContentViewQueryTypeMapper.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
/**
* @copyright Copyright (C) eZ Systems AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
namespace eZ\Publish\Core\QueryType;
use eZ\Publish\Core\MVC\Symfony\View\ContentView;
use InvalidArgumentException;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
/**
* Maps a ContentView to a QueryType using the 'query' parameter from the view configuration.
*/
class QueryParameterContentViewQueryTypeMapper implements ContentViewQueryTypeMapper
{
/**
* @var QueryTypeRegistry
*/
private $queryTypeRegistry;
public function __construct(QueryTypeRegistry $queryTypeRegistry)
{
$this->queryTypeRegistry = $queryTypeRegistry;
}
public function map(ContentView $contentView)
{
if (!$contentView instanceof ContentView) {
throw new InvalidArgumentException('ContentView expected');
}
if (!$contentView->hasParameter('query')) {
throw new InvalidArgumentException('query', "Missing required 'query' view parameter");
}
$queryOptions = $contentView->getParameter('query');
$queryType = $this->queryTypeRegistry->getQueryType($queryOptions['query_type']);
return $queryType->getQuery($this->extractParameters($contentView));
}
/**
* @param ContentView $contentView
*
* @return array
*/
private function extractParameters(ContentView $contentView)
{
$queryParameters = [];
$queryOptions = $contentView->getParameter('query');
if (isset($queryOptions['parameters'])) {
foreach ($queryOptions['parameters'] as $name => $value) {
$queryParameters[$name] = $this->evaluateExpression($contentView, $value);
}
}
return $queryParameters;
}
/**
* @param ContentView $contentView
* @param string $queryParameterValue
*
* @return mixed
*/
private function evaluateExpression(ContentView $contentView, $queryParameterValue)
{
if (substr($queryParameterValue, 0, 2) === '@=') {
$language = new ExpressionLanguage();
return $language->evaluate(
substr($queryParameterValue, 2),
[
'view' => $contentView,
'location' => $contentView->getLocation(),
'content' => $contentView->getContent(),
]
);
} else {
return $queryParameterValue;
}
}
}