Skip to content

Commit

Permalink
Merge e03bd15 into 6501329
Browse files Browse the repository at this point in the history
  • Loading branch information
einorler committed Aug 2, 2016
2 parents 6501329 + e03bd15 commit 6d4a396
Show file tree
Hide file tree
Showing 4 changed files with 284 additions and 0 deletions.
10 changes: 10 additions & 0 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ function ($v) {
->append($this->buildFilterTree('date_range'))
->append($this->buildFilterTree('field_value'))
->append($this->buildFilterTree('document_value'))
->append($this->buildFilterTree('dynamic'))
->end()
->end()
->end();
Expand Down Expand Up @@ -310,6 +311,15 @@ function ($v) {
->isRequired()
->end();
break;
case 'dynamic':
$node
->children()
->arrayNode('filters')
->info('Filter names to include in dynamic filter.')
->prototype('scalar')->end()
->end()
->end();
break;
default:
// Default config is enough.
break;
Expand Down
52 changes: 52 additions & 0 deletions DependencyInjection/Filter/DynamicFilterFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php

/*
* This file is part of the ONGR package.
*
* (c) NFQ Technologies UAB <info@nfq.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace ONGR\FilterManagerBundle\DependencyInjection\Filter;

use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Reference;

/**
* Factory for dynamic filter.
*/
class DynamicFilterFactory extends AbstractFilterFactory
{
/**
* {@inheritdoc}
*/
public function configure(Definition $definition, array $configuration)
{
parent::configure($definition, $configuration);
$filters = [];

foreach ($configuration['filters'] as $filter) {
$filters[$filter] = new Reference('ongr_filter_manager.filter.'.$filter);
}

$definition->addMethodCall('setFilters', [$filters]);
}

/**
* {@inheritdoc}
*/
protected function getNamespace()
{
return 'ONGR\FilterManagerBundle\Filter\Widget\Dynamic\Dynamic';
}

/**
* {@inheritdoc}
*/
public function getName()
{
return 'dynamic';
}
}
220 changes: 220 additions & 0 deletions Filter/Widget/Dynamic/Dynamic.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
<?php

/*
* This file is part of the ONGR package.
*
* (c) NFQ Technologies UAB <info@nfq.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace ONGR\FilterManagerBundle\Filter\Widget\Dynamic;

use ONGR\ElasticsearchBundle\Result\DocumentIterator;
use ONGR\ElasticsearchDSL\Search;
use ONGR\FilterManagerBundle\Filter\FilterInterface;
use ONGR\FilterManagerBundle\Filter\FilterState;
use ONGR\FilterManagerBundle\Filter\Helper\ViewDataFactoryInterface;
use ONGR\FilterManagerBundle\Filter\Relation\RelationAwareTrait;
use ONGR\FilterManagerBundle\Filter\ViewData;
use ONGR\FilterManagerBundle\Filter\ViewData\ChoicesAwareViewData;
use ONGR\FilterManagerBundle\Search\SearchRequest;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;

/**
* This class a dynamic filter that can change the filter, field and value per request
*/
class Dynamic implements FilterInterface, ViewDataFactoryInterface
{
use RelationAwareTrait;

/**
* @var string
*/
private $requestField;

/**
* @var FilterInterface
*/
private $filter;

/**
* @var FilterInterface[]
*/
private $filters;

/**
* @var array
*/
private $urlParameters;

/**
* @var array
*/
private $tags = [];

/**
* {@inheritdoc}
*/
public function getState(Request $request)
{
$state = new FilterState();
$value = $request->get($this->getRequestField());
$this->urlParameters[$this->getRequestField()] = $value;

if (isset($value) && is_array($value)) {
if (!isset($value['field']) || !isset($value['filter'])) {
throw new BadRequestHttpException(
'`field` and `filter` values must be provided to the dynamic filter'
);
}

if (isset($this->filters[$value['filter']])) {
$this->filter = clone $this->filters[$value['filter']];
} else {
throw new InvalidConfigurationException(
sprintf('Filter `%s`, requested in dynamic filter is not defined', $value['filter'])
);
}

$this->filter->setRequestField($this->getRequestField());
$this->filter->setField($value['field']);
$requestValue = [];

if (isset($value['value'])) {
$requestValue = [
$this->getRequestField() => $this->urlParameters[$this->getRequestField()]['value']
];
}

$request = new Request($requestValue);
$state = $this->filter->getState($request);
}

return $state;
}

/**
* {@inheritdoc}
*/
public function modifySearch(Search $search, FilterState $state = null, SearchRequest $request = null)
{
if ($state && $state->isActive()) {
$this->filter->modifySearch($search, $state, $request);
}
}

/**
* {@inheritdoc}
*/
public function preProcessSearch(Search $search, Search $relatedSearch, FilterState $state = null)
{
$out = null;

if ($this->filter) {
$out = $this->filter->preProcessSearch($search, $relatedSearch, $state);
$state->setUrlParameters($this->urlParameters);
}

return $out;
}

/**
* {@inheritdoc}
*/
public function getViewData(DocumentIterator $result, ViewData $data)
{
if ($this->filter) {
$data = $this->filter->getViewData($result, $data);

if ($data instanceof ChoicesAwareViewData) {
$choices = [];
$resetUrlParameters = $data->getResetUrlParameters();
$resetUrlParameters[$this->getRequestField()] = $this->urlParameters[$this->getRequestField()];
unset($resetUrlParameters[$this->getRequestField()]['value']);
$data->setResetUrlParameters($resetUrlParameters);

foreach ($data->getChoices() as $choice) {
if (isset($choice->getUrlParameters()[$this->getRequestField()])) {
$choiceParameters = $choice->getUrlParameters();
$choiceParameters[$this->getRequestField()] = $this->urlParameters[$this->getRequestField()];
$choiceParameters[$this->getRequestField()]['value'] =
$choice->getUrlParameters()[$this->getRequestField()];
$choice->setUrlParameters($choiceParameters);
}

$choices[] = $choice;
}

$data->setChoices($choices);
}
}

return $data;
}

/**
* {@inheritdoc}
*/
public function createViewData()
{
if ($this->filter and $this->filter instanceof ViewDataFactoryInterface) {
$data = $this->filter->createViewData();
} else {
$data = new ViewData();
}

return $data;
}

/**
* {@inheritdoc}
*/
public function getTags()
{
return $this->tags;
}

/**
* @param array $tags
*/
public function setTags(array $tags)
{
$this->tags = $tags;
}

/**
* @return mixed
*/
public function getRequestField()
{
return $this->requestField;
}

/**
* @param mixed $requestField
*/
public function setRequestField($requestField)
{
$this->requestField = $requestField;
}

/**
* @return FilterInterface[]
*/
public function getFilters()
{
return $this->filters;
}

/**
* @param FilterInterface[] $filters
*/
public function setFilters($filters)
{
$this->filters = $filters;
}
}
2 changes: 2 additions & 0 deletions ONGRFilterManagerBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use ONGR\FilterManagerBundle\DependencyInjection\Filter\ChoiceFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\DateRangeFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\DocumentValueFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\DynamicFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\FieldValueFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\FuzzyFilterFactory;
use ONGR\FilterManagerBundle\DependencyInjection\Filter\MatchFilterFactory;
Expand Down Expand Up @@ -50,6 +51,7 @@ public function build(ContainerBuilder $container)
$extension->addFilterFactory(new DateRangeFilterFactory());
$extension->addFilterFactory(new FieldValueFactory());
$extension->addFilterFactory(new DocumentValueFactory());
$extension->addFilterFactory(new DynamicFilterFactory());

$container->addCompilerPass(new FilterPass());
}
Expand Down

0 comments on commit 6d4a396

Please sign in to comment.