Skip to content

Commit d134883

Browse files
author
ONGR Team
committed
Initial code dump
0 parents  commit d134883

File tree

72 files changed

+4999
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+4999
-0
lines changed

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/.idea/
2+
.DS_Store
3+
/vendor/
4+
/Tests/app/cache/
5+
/Tests/app/logs/
6+
/Tests/app/build/
7+
/composer.lock
8+
/phpunit.xml

.travis.yml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
language: php
2+
php:
3+
- 5.4
4+
- 5.5
5+
- 5.6
6+
services:
7+
- elasticsearch
8+
before_script:
9+
- echo "USE mysql;\nUPDATE user SET password=PASSWORD('root') WHERE user='root';\nFLUSH PRIVILEGES;\n" | mysql -u root
10+
- composer update --prefer-dist
11+
script:
12+
- vendor/bin/phpunit
13+
- vendor/bin/phpcs -p --standard=PSR2 --ignore=vendor/,Tests/app/ ./

Controller/ManagerController.php

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the ONGR package.
5+
*
6+
* (c) NFQ Technologies UAB <info@nfq.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace ONGR\FilterManagerBundle\Controller;
13+
14+
use ONGR\FilterManagerBundle\Search\SearchResponse;
15+
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
16+
use Symfony\Component\HttpFoundation\Request;
17+
use Symfony\Component\HttpFoundation\Response;
18+
19+
class ManagerController extends Controller
20+
{
21+
/**
22+
* Renders view with filter manager response
23+
*
24+
* @param Request $request
25+
* @param string $managerName
26+
*
27+
* @return Response
28+
*/
29+
public function managerAction(Request $request, $managerName, $template)
30+
{
31+
return $this->render(
32+
$template,
33+
$this->getFilterManagerResponse($request, $managerName)
34+
);
35+
}
36+
37+
/**
38+
* Returns search response results from filter manager
39+
*
40+
* @param Request $request
41+
* @param string $name
42+
*
43+
* @return array
44+
*/
45+
private function getFilterManagerResponse($request, $name)
46+
{
47+
return ['filter_manager' => $this->get(sprintf('ongr_filter_manager.%s', $name))->execute($request)];
48+
}
49+
}

DependencyInjection/Configuration.php

+206
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the ONGR package.
5+
*
6+
* (c) NFQ Technologies UAB <info@nfq.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace ONGR\FilterManagerBundle\DependencyInjection;
13+
14+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15+
use Symfony\Component\Config\Definition\Builder\ParentNodeDefinitionInterface;
16+
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
17+
use Symfony\Component\Config\Definition\ConfigurationInterface;
18+
19+
/**
20+
* This is the class that validates and merges configuration from app/config files
21+
*/
22+
class Configuration implements ConfigurationInterface
23+
{
24+
/**
25+
* {@inheritdoc}
26+
*/
27+
public function getConfigTreeBuilder()
28+
{
29+
$treeBuilder = new TreeBuilder();
30+
$rootNode = $treeBuilder->root('ongr_filter_manager');
31+
32+
$rootNode
33+
->children()
34+
->scalarNode('es_manager')
35+
->defaultValue('default')
36+
->end()
37+
->end();
38+
39+
$this->addManagersSection($rootNode);
40+
$this->addFiltersSection($rootNode);
41+
42+
return $treeBuilder;
43+
}
44+
45+
/**
46+
* @param ArrayNodeDefinition $rootNode
47+
*/
48+
private function addManagersSection(ArrayNodeDefinition $rootNode)
49+
{
50+
$rootNode
51+
->children()
52+
->arrayNode('managers')
53+
->requiresAtLeastOneElement()
54+
->useAttributeAsKey('name')
55+
->isRequired()
56+
->prototype('array')
57+
->children()
58+
->scalarNode('name')->end()
59+
->arrayNode('filters')
60+
->requiresAtLeastOneElement()
61+
->isRequired()
62+
->prototype('scalar')->end()
63+
->end()
64+
->scalarNode('repository')->isRequired()->end()
65+
->end()
66+
->end()
67+
->end()
68+
->end();
69+
}
70+
71+
/**
72+
* @param ArrayNodeDefinition $rootNode
73+
*/
74+
private function addFiltersSection(ArrayNodeDefinition $rootNode)
75+
{
76+
$rootNode
77+
->children()
78+
->arrayNode('filters')
79+
->validate()
80+
->ifTrue(function ($v) {
81+
$v = array_filter($v);
82+
83+
return empty($v);
84+
})
85+
->thenInvalid('At least single filter must be configured.')
86+
->end()
87+
// TODO: validate if filter names are unique
88+
->isRequired()
89+
->append($this->buildFilterTree('choice'))
90+
->append($this->buildFilterTree('match'))
91+
->append($this->buildFilterTree('sort'))
92+
->append($this->buildFilterTree('pager'))
93+
->append($this->buildFilterTree('document_field'))
94+
->append($this->buildFilterTree('range'))
95+
->end()
96+
->end();
97+
}
98+
99+
/**
100+
* Builds filter config tree for given filter name
101+
*
102+
* @param string $filterName
103+
*
104+
* @return ArrayNodeDefinition
105+
*/
106+
private function buildFilterTree($filterName)
107+
{
108+
$filter = new ArrayNodeDefinition($filterName);
109+
110+
/** @var ParentNodeDefinitionInterface $node */
111+
$node = $filter
112+
->requiresAtLeastOneElement()
113+
->useAttributeAsKey('name')
114+
->prototype('array')
115+
->children()
116+
->scalarNode('name')->end()
117+
->arrayNode('relations')
118+
->children()
119+
->append($this->buildRelationsTree('search'))
120+
->append($this->buildRelationsTree('reset'))
121+
->end()
122+
->end()
123+
->scalarNode('request_field')->info('URL parameter name.')->isRequired()->end()
124+
->scalarNode('field')->info('Document field name.')->end()
125+
->end();
126+
127+
switch ($filterName) {
128+
case 'sort':
129+
$node
130+
->children()
131+
->arrayNode('choices')
132+
->prototype('array')
133+
->beforeNormalization()
134+
->ifTrue(function ($v) {
135+
return empty($v['label']);
136+
})
137+
->then(function ($v) {
138+
$v['label'] = $v['field'];
139+
140+
return $v;
141+
})
142+
->end()
143+
->children()
144+
->scalarNode('label')->end()
145+
->scalarNode('field')->isRequired()->end()
146+
->scalarNode('order')->defaultValue('asc')->end()
147+
->scalarNode('key')->info('Custom parameter value')->end()
148+
->booleanNode('default')->defaultFalse()->end()
149+
->end()
150+
->end()
151+
->end()
152+
->end();
153+
break;
154+
case 'pager':
155+
$node
156+
->children()
157+
->integerNode('count_per_page')->info('Item count per page')->defaultValue(10)->end()
158+
->end();
159+
break;
160+
}
161+
162+
return $filter;
163+
}
164+
165+
/**
166+
* Builds relations config tree for given relation name.
167+
*
168+
* @param string $relationType
169+
*
170+
* @return ArrayNodeDefinition
171+
*/
172+
private function buildRelationsTree($relationType)
173+
{
174+
$filter = new ArrayNodeDefinition($relationType);
175+
176+
$filter
177+
->validate()
178+
->ifTrue(function ($v) {
179+
return empty($v['include']) && empty($v['exclude']);
180+
})
181+
->thenInvalid('Relation must have "include" or "exclude" fields specified.')
182+
->end()
183+
->validate()
184+
->ifTrue(function ($v) {
185+
return !empty($v['include']) && !empty($v['exclude']);
186+
})
187+
->thenInvalid('Relation must have only "include" or "exclude" fields specified.')
188+
->end()
189+
->children()
190+
->arrayNode('include')
191+
->beforeNormalization()->ifString()->then(function ($v) {
192+
return array($v);
193+
})->end()
194+
->prototype('scalar')->end()
195+
->end()
196+
->arrayNode('exclude')
197+
->beforeNormalization()->ifString()->then(function ($v) {
198+
return array($v);
199+
})->end()
200+
->prototype('scalar')->end()
201+
->end()
202+
->end();
203+
204+
return $filter;
205+
}
206+
}

0 commit comments

Comments
 (0)