From e68f99f3bf5cbf8fe374f0937a187ac631dcec3c Mon Sep 17 00:00:00 2001 From: Eymen Gunay Date: Sun, 23 Jun 2013 16:31:37 +0200 Subject: [PATCH 1/2] [Minor] Typo fix --- Form/Filter/AbstractFilter.php | 2 +- Form/Filter/CheckboxRelationFieldEntityAbstractFilter.php | 2 +- Form/Filter/ChoiceFieldEntityAbstractFilter.php | 2 +- Form/Filter/EntityAbstractFilter.php | 2 +- Form/Filter/EntityFieldAbstractFilter.php | 2 +- Form/Filter/JoinRelationFieldEntityAbstractFilter.php | 2 +- Form/Filter/MultipleSelectRelationFieldEntityAbstractFilter.php | 2 +- Form/Filter/OrderByEntityAbstractFilter.php | 2 +- Form/Filter/RangeFieldEntityAbstractFilter.php | 2 +- Form/Filter/RelationFieldEntityAbstractFilter.php | 2 +- Form/Filter/SelectRelationFieldEntityAbstractFilter.php | 2 +- Form/Filter/SortFieldEntityAbstractFilter.php | 2 +- Form/Filter/TextFieldEntityAbstractFilter.php | 2 +- Form/FilterManager/AbstractFilterManager.php | 2 +- Form/FilterManager/EntityAbstractFilterManager.php | 2 +- Form/Type/DateRangeType.php | 2 +- Form/Type/OrderByType.php | 2 +- Form/Type/RangeType.php | 2 +- README.md | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Form/Filter/AbstractFilter.php b/Form/Filter/AbstractFilter.php index 6397ad9..4e7dd1e 100755 --- a/Form/Filter/AbstractFilter.php +++ b/Form/Filter/AbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class AbstractFilter diff --git a/Form/Filter/CheckboxRelationFieldEntityAbstractFilter.php b/Form/Filter/CheckboxRelationFieldEntityAbstractFilter.php index bd54e9f..2b1d9de 100644 --- a/Form/Filter/CheckboxRelationFieldEntityAbstractFilter.php +++ b/Form/Filter/CheckboxRelationFieldEntityAbstractFilter.php @@ -8,7 +8,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class CheckboxRelationFieldEntityAbstractFilter extends RelationFieldEntityAbstractFilter diff --git a/Form/Filter/ChoiceFieldEntityAbstractFilter.php b/Form/Filter/ChoiceFieldEntityAbstractFilter.php index a8df714..eb98298 100755 --- a/Form/Filter/ChoiceFieldEntityAbstractFilter.php +++ b/Form/Filter/ChoiceFieldEntityAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class ChoiceFieldEntityAbstractFilter extends EntityFieldAbstractFilter diff --git a/Form/Filter/EntityAbstractFilter.php b/Form/Filter/EntityAbstractFilter.php index d2f486b..7971205 100755 --- a/Form/Filter/EntityAbstractFilter.php +++ b/Form/Filter/EntityAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class EntityAbstractFilter extends AbstractFilter diff --git a/Form/Filter/EntityFieldAbstractFilter.php b/Form/Filter/EntityFieldAbstractFilter.php index befeab5..1e09e22 100644 --- a/Form/Filter/EntityFieldAbstractFilter.php +++ b/Form/Filter/EntityFieldAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class EntityFieldAbstractFilter extends EntityAbstractFilter diff --git a/Form/Filter/JoinRelationFieldEntityAbstractFilter.php b/Form/Filter/JoinRelationFieldEntityAbstractFilter.php index 4960dba..ce0a0d8 100644 --- a/Form/Filter/JoinRelationFieldEntityAbstractFilter.php +++ b/Form/Filter/JoinRelationFieldEntityAbstractFilter.php @@ -8,7 +8,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class JoinRelationFieldEntityAbstractFilter extends RelationFieldEntityAbstractFilter diff --git a/Form/Filter/MultipleSelectRelationFieldEntityAbstractFilter.php b/Form/Filter/MultipleSelectRelationFieldEntityAbstractFilter.php index 87782f8..8dce07b 100644 --- a/Form/Filter/MultipleSelectRelationFieldEntityAbstractFilter.php +++ b/Form/Filter/MultipleSelectRelationFieldEntityAbstractFilter.php @@ -8,7 +8,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class MultipleSelectRelationFieldEntityAbstractFilter extends RelationFieldEntityAbstractFilter diff --git a/Form/Filter/OrderByEntityAbstractFilter.php b/Form/Filter/OrderByEntityAbstractFilter.php index 2fab087..0f777e4 100644 --- a/Form/Filter/OrderByEntityAbstractFilter.php +++ b/Form/Filter/OrderByEntityAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class OrderByEntityAbstractFilter extends EntityAbstractFilter diff --git a/Form/Filter/RangeFieldEntityAbstractFilter.php b/Form/Filter/RangeFieldEntityAbstractFilter.php index 7ec4674..8ad1971 100644 --- a/Form/Filter/RangeFieldEntityAbstractFilter.php +++ b/Form/Filter/RangeFieldEntityAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class RangeFieldEntityAbstractFilter extends EntityAbstractFilter diff --git a/Form/Filter/RelationFieldEntityAbstractFilter.php b/Form/Filter/RelationFieldEntityAbstractFilter.php index 3b97d2b..defd974 100755 --- a/Form/Filter/RelationFieldEntityAbstractFilter.php +++ b/Form/Filter/RelationFieldEntityAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class RelationFieldEntityAbstractFilter extends EntityFieldAbstractFilter diff --git a/Form/Filter/SelectRelationFieldEntityAbstractFilter.php b/Form/Filter/SelectRelationFieldEntityAbstractFilter.php index 274e7ee..e6dddfe 100644 --- a/Form/Filter/SelectRelationFieldEntityAbstractFilter.php +++ b/Form/Filter/SelectRelationFieldEntityAbstractFilter.php @@ -8,7 +8,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class SelectRelationFieldEntityAbstractFilter extends RelationFieldEntityAbstractFilter diff --git a/Form/Filter/SortFieldEntityAbstractFilter.php b/Form/Filter/SortFieldEntityAbstractFilter.php index 5cf9a11..f6a0c84 100644 --- a/Form/Filter/SortFieldEntityAbstractFilter.php +++ b/Form/Filter/SortFieldEntityAbstractFilter.php @@ -7,7 +7,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class SortFieldEntityAbstractFilter extends EntityFieldAbstractFilter diff --git a/Form/Filter/TextFieldEntityAbstractFilter.php b/Form/Filter/TextFieldEntityAbstractFilter.php index 673a87a..2a22ca3 100755 --- a/Form/Filter/TextFieldEntityAbstractFilter.php +++ b/Form/Filter/TextFieldEntityAbstractFilter.php @@ -6,7 +6,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ abstract class TextFieldEntityAbstractFilter extends EntityFieldAbstractFilter diff --git a/Form/FilterManager/AbstractFilterManager.php b/Form/FilterManager/AbstractFilterManager.php index 1be9f17..e0fc779 100755 --- a/Form/FilterManager/AbstractFilterManager.php +++ b/Form/FilterManager/AbstractFilterManager.php @@ -11,7 +11,7 @@ /** * * @author: Gabriel BONDAZ - * @licence: GPL + * @license: GPL * */ abstract class AbstractFilterManager diff --git a/Form/FilterManager/EntityAbstractFilterManager.php b/Form/FilterManager/EntityAbstractFilterManager.php index 5bb3d95..740bd98 100755 --- a/Form/FilterManager/EntityAbstractFilterManager.php +++ b/Form/FilterManager/EntityAbstractFilterManager.php @@ -11,7 +11,7 @@ /** * * @author: Gabriel BONDAZ - * @licence: GPL + * @license: GPL * */ abstract class EntityAbstractFilterManager extends AbstractFilterManager diff --git a/Form/Type/DateRangeType.php b/Form/Type/DateRangeType.php index 1789a6c..e3abcc8 100644 --- a/Form/Type/DateRangeType.php +++ b/Form/Type/DateRangeType.php @@ -8,7 +8,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ class DateRangeType extends RangeType diff --git a/Form/Type/OrderByType.php b/Form/Type/OrderByType.php index 724dad4..fe72279 100644 --- a/Form/Type/OrderByType.php +++ b/Form/Type/OrderByType.php @@ -9,7 +9,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ class OrderByType extends AbstractType diff --git a/Form/Type/RangeType.php b/Form/Type/RangeType.php index 5e69e46..fa14590 100644 --- a/Form/Type/RangeType.php +++ b/Form/Type/RangeType.php @@ -9,7 +9,7 @@ * * @author: Gabriel BONDAZ * @author: Pierre FERROLLIET - * @licence: GPL + * @license: GPL * */ class RangeType extends AbstractType diff --git a/README.md b/README.md index 6f76113..35e81d3 100755 --- a/README.md +++ b/README.md @@ -184,7 +184,7 @@ public function filterAction(Request $request) $filterForm->bindRequest($request); } - $filteredNews = $filterManager->filter(): + $filteredNews = $filterManager->filter(); // let's give all parameters to the view return array( From d67ad6941f4617379d9e9321262901b510b7e363 Mon Sep 17 00:00:00 2001 From: Eymen Gunay Date: Sun, 23 Jun 2013 16:32:00 +0200 Subject: [PATCH 2/2] Doctrine MongoDB classes added --- ...boxRelationFieldDocumentAbstractFilter.php | 25 ++++++ .../ChoiceFieldDocumentAbstractFilter.php | 54 ++++++++++++ Form/Filter/DocumentAbstractFilter.php | 54 ++++++++++++ Form/Filter/DocumentFieldAbstractFilter.php | 16 ++++ ...oinRelationFieldDocumentAbstractFilter.php | 57 ++++++++++++ ...ectRelationFieldDocumentAbstractFilter.php | 25 ++++++ Form/Filter/OrderByDocumentAbstractFilter.php | 42 +++++++++ .../RangeFieldDocumentAbstractFilter.php | 31 +++++++ .../RelationFieldDocumentAbstractFilter.php | 77 ++++++++++++++++ ...ectRelationFieldDocumentAbstractFilter.php | 25 ++++++ .../SortFieldDocumentAbstractFilter.php | 62 +++++++++++++ .../TextFieldDocumentAbstractFilter.php | 29 ++++++ .../DocumentAbstractFilterManager.php | 88 +++++++++++++++++++ 13 files changed, 585 insertions(+) create mode 100644 Form/Filter/CheckboxRelationFieldDocumentAbstractFilter.php create mode 100755 Form/Filter/ChoiceFieldDocumentAbstractFilter.php create mode 100755 Form/Filter/DocumentAbstractFilter.php create mode 100644 Form/Filter/DocumentFieldAbstractFilter.php create mode 100644 Form/Filter/JoinRelationFieldDocumentAbstractFilter.php create mode 100644 Form/Filter/MultipleSelectRelationFieldDocumentAbstractFilter.php create mode 100644 Form/Filter/OrderByDocumentAbstractFilter.php create mode 100644 Form/Filter/RangeFieldDocumentAbstractFilter.php create mode 100755 Form/Filter/RelationFieldDocumentAbstractFilter.php create mode 100644 Form/Filter/SelectRelationFieldDocumentAbstractFilter.php create mode 100644 Form/Filter/SortFieldDocumentAbstractFilter.php create mode 100755 Form/Filter/TextFieldDocumentAbstractFilter.php create mode 100755 Form/FilterManager/DocumentAbstractFilterManager.php diff --git a/Form/Filter/CheckboxRelationFieldDocumentAbstractFilter.php b/Form/Filter/CheckboxRelationFieldDocumentAbstractFilter.php new file mode 100644 index 0000000..c2fbff1 --- /dev/null +++ b/Form/Filter/CheckboxRelationFieldDocumentAbstractFilter.php @@ -0,0 +1,25 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class CheckboxRelationFieldDocumentAbstractFilter extends RelationFieldDocumentAbstractFilter +{ + public function getFilterFormOptions() { + $filterFormOptions = parent::getFilterFormOptions(); + + return array_merge($filterFormOptions, array( + 'multiple' => true, + 'expanded' => true + )); + } +} diff --git a/Form/Filter/ChoiceFieldDocumentAbstractFilter.php b/Form/Filter/ChoiceFieldDocumentAbstractFilter.php new file mode 100755 index 0000000..4818a83 --- /dev/null +++ b/Form/Filter/ChoiceFieldDocumentAbstractFilter.php @@ -0,0 +1,54 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class ChoiceFieldDocumentAbstractFilter extends DocumentFieldAbstractFilter +{ + public function getFilterFormType() + { + return 'choice'; + } + + public function getFilterFormOptions() + { + return array( + 'label' => $this->getFilterFormLabel(), + 'choices' => $this->getDocumentFieldValues(), + 'expanded' => true, + 'multiple' => true + ); + } + + public function getDocumentFieldValues() + { + $qb = $this->getQueryBuilder() + ->select(sprintf('DISTINCT %s', $this->getDocumentFieldName())) + ; + + $ret = array(); + foreach($qb->getQuery()->getResult() as $result) { + $v = $result[$this->getDocumentFieldName()]; + if($v != null) { + $ret[$v] = $v; + } + } + + return $ret; + } + + public function getResultQueryBuilder($data, $qb, $name) + { + $column = sprintf('%s.%s', $name, $this->getDocumentFieldName()); + $qb->andWhere($qb->expr()->in($column, $data)); + + return $qb; + } +} diff --git a/Form/Filter/DocumentAbstractFilter.php b/Form/Filter/DocumentAbstractFilter.php new file mode 100755 index 0000000..e82c1d3 --- /dev/null +++ b/Form/Filter/DocumentAbstractFilter.php @@ -0,0 +1,54 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class DocumentAbstractFilter extends AbstractFilter +{ + public function getFilterFormOptions() + { + return array( + 'label' => $this->getFilterFormLabel(), + ); + } + + public function getRepository() + { + $dm = $this->getContainer()->get("doctrine.odm.mongodb.document_manager"); + + return $dm->getRepository($this->getDocumentClassName()); + } + + public function getQueryBuilder($name = null) + { + return $this->getRepository()->createQueryBuilder($name); + } + + public function getQuery() + { + return $this->getQueryBuilder()->getQuery(); + } + + public function getDefaultDataFilters() + { + return $this->getQuery()->getResult(); + } + + public function filter($data, $params = array()) + { + // TODO: Throw exception if params missing (qb and name) + return $this->getResultQueryBuilder($data, $params['qb'], $params['name']); + } + + abstract public function getResultQueryBuilder($data, $qb, $name); + + abstract public function getFilterFormLabel(); + abstract public function getDocumentClassName(); +} diff --git a/Form/Filter/DocumentFieldAbstractFilter.php b/Form/Filter/DocumentFieldAbstractFilter.php new file mode 100644 index 0000000..c9983ac --- /dev/null +++ b/Form/Filter/DocumentFieldAbstractFilter.php @@ -0,0 +1,16 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class DocumentFieldAbstractFilter extends DocumentAbstractFilter +{ + abstract public function getDocumentFieldName(); +} diff --git a/Form/Filter/JoinRelationFieldDocumentAbstractFilter.php b/Form/Filter/JoinRelationFieldDocumentAbstractFilter.php new file mode 100644 index 0000000..d4a14b4 --- /dev/null +++ b/Form/Filter/JoinRelationFieldDocumentAbstractFilter.php @@ -0,0 +1,57 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class JoinRelationFieldDocumentAbstractFilter extends RelationFieldDocumentAbstractFilter +{ + abstract public function getDocumentJoinFieldName(); + + public function getResultQueryBuilder($data, $qb, $name) + { + $ids = array(); + foreach($data as $object) { + $ids[] = $object->getId(); + } + + $alias1 = $this->generateAlias($name, $this->getDocumentJoinFieldName()); + $qb->leftJoin( + sprintf('%s.%s', $name, $this->getDocumentJoinFieldName()), + $alias1 + ); + + if(is_null($this->getOption("mode")) || $this->getOption("mode") == "or") { + $alias2 = $this->generateAlias($this->getDocumentJoinFieldName(), $this->getDocumentFieldName()); + $qb->leftJoin( + sprintf('%s.%s', $alias1, $this->getDocumentFieldName()), + $alias2 + ); + $column = sprintf('%s.id', $alias2); + $qb->andWhere($qb->expr()->in($column, $ids)); + } elseif($this->getOption("mode") == "and") { + foreach ($ids as $id) { + $alias2 = sprintf("%s%d", + $this->generateAlias($name, $this->getDocumentFieldName()), + $id + ); + $qb->leftJoin( + sprintf('%s.%s', $alias1, $this->getDocumentFieldName()), + $alias2 + ); + $column = sprintf('%s.id', $alias2); + $qb->andWhere($column." = ".$id); + } + } + + return $qb; + } +} diff --git a/Form/Filter/MultipleSelectRelationFieldDocumentAbstractFilter.php b/Form/Filter/MultipleSelectRelationFieldDocumentAbstractFilter.php new file mode 100644 index 0000000..2480332 --- /dev/null +++ b/Form/Filter/MultipleSelectRelationFieldDocumentAbstractFilter.php @@ -0,0 +1,25 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class MultipleSelectRelationFieldDocumentAbstractFilter extends RelationFieldDocumentAbstractFilter +{ + public function getFilterFormOptions() { + $filterFormOptions = parent::getFilterFormOptions(); + + return array_merge($filterFormOptions, array( + 'multiple' => true, + 'expanded' => false + )); + } +} diff --git a/Form/Filter/OrderByDocumentAbstractFilter.php b/Form/Filter/OrderByDocumentAbstractFilter.php new file mode 100644 index 0000000..e14ab6b --- /dev/null +++ b/Form/Filter/OrderByDocumentAbstractFilter.php @@ -0,0 +1,42 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class OrderByDocumentAbstractFilter extends DocumentAbstractFilter +{ + const ORDER_ASC = "ASC"; + const ORDER_DESC = "DESC"; + + abstract public function getAvailableFields(); + + public function getAvailableOrders() + { + return array( + self::ORDER_ASC => 'Ascending', + self::ORDER_DESC => 'Descending', + ); + } + + public function getDefaultOrder() { return self::ORDER_ASC; } + + public function getFilterFormType() + { + return 'orderby'; + } + + public function getResultQueryBuilder($data, $qb, $name) + { + $order = $data['order'] ? $data['order'] : $this->getDefaultOrder(); + $qb->sort(sprintf('%s', $data['field']), $order); + + return $qb; + } +} diff --git a/Form/Filter/RangeFieldDocumentAbstractFilter.php b/Form/Filter/RangeFieldDocumentAbstractFilter.php new file mode 100644 index 0000000..d13e929 --- /dev/null +++ b/Form/Filter/RangeFieldDocumentAbstractFilter.php @@ -0,0 +1,31 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class RangeFieldDocumentAbstractFilter extends DocumentAbstractFilter +{ + abstract public function getDocumentFieldValueMin(); + abstract public function getDocumentFieldValueMax(); + + public function getFilterFormType() + { + return 'range'; + } + + public function getResultQueryBuilder($data, $qb, $name) + { + $qb + ->field(sprintf('%s', $this->getDocumentFieldName()))->range($data['min'], $data['max']) + ; + + return $qb; + } +} diff --git a/Form/Filter/RelationFieldDocumentAbstractFilter.php b/Form/Filter/RelationFieldDocumentAbstractFilter.php new file mode 100755 index 0000000..909f599 --- /dev/null +++ b/Form/Filter/RelationFieldDocumentAbstractFilter.php @@ -0,0 +1,77 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class RelationFieldDocumentAbstractFilter extends DocumentFieldAbstractFilter +{ + public function getFilterFormType() + { + return 'document'; + } + + public function getFilterFormOptions() + { + return array( + 'label' => $this->getFilterFormLabel(), + 'class' => $this->getDocumentClassName(), + 'query_builder' => $this->getQueryBuilder(), + 'required' => false + ); + } + + public function generateAlias($table_name, $field_name) + { + return self::slugify($this->getDocumentClassName().$table_name.$field_name); + } + + static public function slugify($text) + { + $text = preg_replace('~[^\\pL\d]+~u', '_', $text); + $text = trim($text, '_'); + $text = strtolower($text); + $text = preg_replace('~[^-\w]+~', '', $text); + + return $text; + } + + public function getResultQueryBuilder($data, $qb, $name) + { + $ids = array(); + foreach($data as $object) { + $ids[] = $object->getId(); + } + + if(is_null($this->getOption("mode")) || $this->getOption("mode") == "or") { + $alias = $this->generateAlias($name, $this->getDocumentFieldName()); + $qb->leftJoin( + sprintf('%s.%s', $name, $this->getDocumentFieldName()), + $alias + ); + $column = sprintf('%s.id', $alias); + $qb->andWhere($qb->expr()->in($column, $ids)); + } elseif($this->getOption("mode") == "and") { + foreach ($ids as $id) { + $alias = sprintf("%s%d", + $this->generateAlias($name, $this->getDocumentFieldName()), + $id + ); + $qb->leftJoin( + sprintf('%s.%s', $name, $this->getDocumentFieldName()), + $alias + ); + $column = sprintf('%s.id', $alias); + $qb->andWhere($column." = ".$id); + } + } + + return $qb; + } +} diff --git a/Form/Filter/SelectRelationFieldDocumentAbstractFilter.php b/Form/Filter/SelectRelationFieldDocumentAbstractFilter.php new file mode 100644 index 0000000..d89a0bc --- /dev/null +++ b/Form/Filter/SelectRelationFieldDocumentAbstractFilter.php @@ -0,0 +1,25 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class SelectRelationFieldDocumentAbstractFilter extends RelationFieldDocumentAbstractFilter +{ + public function getFilterFormOptions() { + $filterFormOptions = parent::getFilterFormOptions(); + + return array_merge($filterFormOptions, array( + 'multiple' => false, + 'expanded' => false + )); + } +} diff --git a/Form/Filter/SortFieldDocumentAbstractFilter.php b/Form/Filter/SortFieldDocumentAbstractFilter.php new file mode 100644 index 0000000..9a66bca --- /dev/null +++ b/Form/Filter/SortFieldDocumentAbstractFilter.php @@ -0,0 +1,62 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class SortFieldDocumentAbstractFilter extends DocumentFieldAbstractFilter +{ + const ORDER_ASC = "ASC"; + const ORDER_DESC = "DESC"; + + private static $sortFilterEnabled = 0; + + public function getChoices() + { + return array( + self::ORDER_ASC => 'asc', + self::ORDER_DESC => 'desc', + ); + } + + public function getDefaultOrder() { return self::ORDER_ASC; } + + public function getFilterFormType() + { + return 'choice'; + } + + public function getFilterFormOptions() { + $filterFormOptions = parent::getFilterFormOptions(); + + return array_merge($filterFormOptions, array( + 'multiple' => false, + 'expanded' => true, + 'choices' => $this->getChoices(), + 'required' => false, + 'data' => $this->getDefaultOrder() + )); + } + + public function getResultQueryBuilder($data, $qb, $name) + { + $order = $data ? $data : $this->getDefaultOrder(); + $qb->sort($getDocumentFieldName, $order); + + // Doctrine ODM QueryBuilder API supports stacked sort calls + // therefore we don't need sortFilterEnabled check like + // in SortFieldEntityAbstractFilter. Increment is left + // here intentionally as it may be used for something else + // in the future. Besides no harm comes from a simple increment :) + self::$sortFilterEnabled++; + + return $qb; + } +} diff --git a/Form/Filter/TextFieldDocumentAbstractFilter.php b/Form/Filter/TextFieldDocumentAbstractFilter.php new file mode 100755 index 0000000..d3c3cb2 --- /dev/null +++ b/Form/Filter/TextFieldDocumentAbstractFilter.php @@ -0,0 +1,29 @@ + + * @author: Pierre FERROLLIET + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class TextFieldDocumentAbstractFilter extends DocumentFieldAbstractFilter +{ + public function getFilterFormType() + { + return 'text'; + } + + public function getResultQueryBuilder($data, $qb, $name) + { + $data = preg_quote($data); + $qb + ->field(sprintf('%s', $this->getDocumentFieldName()))->equals(new \MongoRegex("/$data/")) + ; + + return $qb; + } +} diff --git a/Form/FilterManager/DocumentAbstractFilterManager.php b/Form/FilterManager/DocumentAbstractFilterManager.php new file mode 100755 index 0000000..82c0262 --- /dev/null +++ b/Form/FilterManager/DocumentAbstractFilterManager.php @@ -0,0 +1,88 @@ + + * @author: Eymen GUNAY + * @license: GPL + * + */ +abstract class DocumentAbstractFilterManager extends AbstractFilterManager +{ + abstract public function getDocumentClassName(); + + protected function getRepository() + { + $dm = $this->container->get('doctrine.odm.mongodb.document_manager'); + + return $dm->getRepository($this->getDocumentClassName()); + } + + protected function createQueryBuilder($name) + { + $repository = $this->getRepository(); + + return $repository->createQueryBuilder($name); + } + + /** + * Get query builder to retrieve documents matching filters + * + * @return DoctrineQueryBuilder + */ + public function getResultQueryBuilder() + { + $name = 'e'; + $qb = $this->createQueryBuilder($name); + + foreach($this->getQueryingFilters() as $field => $data) { + if(count($data) > 0) { + $filter = $this->getFilter($field); + if($filter instanceof DocumentAbstractFilter) { + $qb = $filter->filter( + $data, array('qb' => $qb, 'name' => $name) + ); + } + } + } + + return $qb; + } + + /** + * Get query to retrieve documents matching filters + * + * @return DoctrineQuery + */ + public function getResultQuery() + { + $qb = $this->getResultQueryBuilder(); + + return is_null($qb) ? $qb : $qb->getQuery(); + } + + /** + * Get all documents matching filters + * + * @return array + */ + public function getResult() + { + $q = $this->getResultQuery(); + + return $q->execute(); + } + + public function runFilters() + { + return $this->getResult(); + } +}