From 75b4ef5a7de8bf8aa9b7f388bf5028a815d078a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 29 Aug 2017 17:01:26 +0200 Subject: [PATCH] add filtering before / after date of birth --- Resources/translations/messages.fr.yml | 4 +- Resources/views/Person/list.html.twig | 27 +++++++--- Search/PersonSearch.php | 70 +++++++++++++++++++------- 3 files changed, 74 insertions(+), 27 deletions(-) diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index b1bb9ec4d..ec2ffc9e1 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -14,6 +14,8 @@ birthdate: date de naissance dateOfBirth: date de naissance dateofbirth: date de naissance 'Unknown date of birth': 'Date de naissance inconnue' +Birthdate before: Date de naissance avant le +Birthdate after: Date de naissance après le Nationality: Nationalité nationality: nationalité 'Without nationality': 'Sans nationalité' @@ -85,7 +87,7 @@ Reset: 'Remise à zéro' 'The person has been created': 'Le dossier a été créé' 'Person search results': 'Recherche de personnes' 'Search within persons': 'Recherche parmi les personnes' -'%total% persons matching the search %pattern%': '{0} Aucune personne ne correspond aux termes de recherche "%pattern%" | {1} Une personne a été trouvée par la recherche "%pattern%" | ]1,Inf] %total% personnes correspondent aux termes de recherche "%pattern%".' +'%total% persons matching the search pattern:': '{0} Aucune personne ne correspond aux termes de recherche : | {1} Une personne a été trouvée par la recherche : | ]1,Inf] %total% personnes correspondent aux termes de recherche :' 'Last opening since %last_opening%': 'Dernière ouverture le %last_opening%.' 'Person accompanying period - %name%': 'Historique du dossier - %name%' 'Opening date': 'Date d''ouverture' diff --git a/Resources/views/Person/list.html.twig b/Resources/views/Person/list.html.twig index 30676268b..4d7288d9a 100644 --- a/Resources/views/Person/list.html.twig +++ b/Resources/views/Person/list.html.twig @@ -16,7 +16,12 @@ #}

{{ 'Person search results'|trans }}

-

{{ '%total% persons matching the search %pattern%'|transchoice( total, {'%pattern%': pattern, '%total%' : total}) }}

+

+ {{ '%total% persons matching the search pattern:'|transchoice( total, { '%total%' : total}) }} + + {{ pattern }} + +

{{ 'Results %start%-%end% of %total%'|trans({ '%start%' : start, '%end%': start + persons|length, '%total%' : total } ) }}

@@ -64,6 +69,11 @@ {{ 'Add a person'|trans }} +
  • + + {{ 'Advanced search'|trans }} + +
  • {% if preview == true and persons|length < total %}
  • @@ -71,14 +81,15 @@
  • {% endif %} -
  • - - {{ 'Advanced search'|trans }} - -
  • - - +{% else %} + {% endif %} {% if preview == false %} diff --git a/Search/PersonSearch.php b/Search/PersonSearch.php index 2181e8332..e3e199763 100644 --- a/Search/PersonSearch.php +++ b/Search/PersonSearch.php @@ -122,7 +122,8 @@ class PersonSearch extends AbstractSearch implements ContainerAwareInterface, array( 'persons' => $this->search($terms, $start, $limit, $options), 'pattern' => $this->recomposePattern($terms, array('nationality', - 'firstname', 'lastname', 'birthdate', 'gender'), $terms['_domain']), + 'firstname', 'lastname', 'birthdate', 'gender', + 'birthdate-before','birthdate-after'), $terms['_domain']), 'total' => $total, 'start' => $start, 'search_name' => self::NAME, @@ -194,16 +195,32 @@ class PersonSearch extends AbstractSearch implements ContainerAwareInterface, ->setParameter('lastname', '%'.$terms['lastname'].'%'); } - if (array_key_exists('birthdate', $terms)) { + foreach (['birthdate', 'birthdate-before', 'birthdate-after'] as $key) + if (array_key_exists($key, $terms)) { try { - $date = new \DateTime($terms['birthdate']); + $date = new \DateTime($terms[$key]); } catch (\Exception $ex) { throw new ParsingException('The date is ' . 'not parsable', 0, $ex); } - $qb->andWhere($qb->expr()->eq('p.birthdate', ':birthdate')) - ->setParameter('birthdate', $date); + switch($key) { + case 'birthdate': + $qb->andWhere($qb->expr()->eq('p.birthdate', ':birthdate')) + ->setParameter('birthdate', $date); + break; + case 'birthdate-before': + $qb->andWhere($qb->expr()->lt('p.birthdate', ':birthdatebefore')) + ->setParameter('birthdatebefore', $date); + break; + case 'birthdate-after': + $qb->andWhere($qb->expr()->gt('p.birthdate', ':birthdateafter')) + ->setParameter('birthdateafter', $date); + break; + default: + throw new \LogicException("this case $key should not exists"); + } + } if (array_key_exists('gender', $terms)) { @@ -271,10 +288,18 @@ class PersonSearch extends AbstractSearch implements ContainerAwareInterface, 'label' => 'Last name', 'required' => false ]) + ->add('birthdate-after', ChillDateType::class, [ + 'label' => 'Birthdate after', + 'required' => false + ]) ->add('birthdate', ChillDateType::class, [ 'label' => 'Birthdate', 'required' => false ]) + ->add('birthdate-before', ChillDateType::class, [ + 'label' => 'Birthdate before', + 'required' => false + ]) ->add('gender', ChoiceType::class, [ 'choices' => [ 'Man' => Person::MALE_GENDER, @@ -299,11 +324,13 @@ class PersonSearch extends AbstractSearch implements ContainerAwareInterface, .' '; } - $string .= empty($data['birthdate']) ? - '' - : - 'birthdate:'.$data['birthdate']->format('Y-m-d').' ' - ; + foreach (['birthdate', 'birthdate-before', 'birthdate-after'] as $key) { + $string .= empty($data[$key]) ? + '' + : + $key.':'.$data[$key]->format('Y-m-d').' ' + ; + } return $string; } @@ -315,18 +342,25 @@ class PersonSearch extends AbstractSearch implements ContainerAwareInterface, $data[$key] = $terms[$key] ?? null; } - // parse birthdate - if (\array_key_exists('birthdate', $terms)) { - try { - $date = new \DateTime($terms['birthdate']); - } catch (\Exception $ex) { - throw new ParsingException('The date is ' - . 'not parsable', 0, $ex); + // parse dates + foreach (['birthdate', 'birthdate-before', 'birthdate-after'] as $key) { + if (\array_key_exists($key, $terms)) { + try { + $date = new \DateTime($terms[$key]); + } catch (\Exception $ex) { + throw new ParsingException("The date for $key is " + . 'not parsable', 0, $ex); + } } + $data[$key] = $date ?? null; } - $data['birthdate'] = $date ?? null; return $data; } + + public function getAdvancedSearchTitle() + { + return 'Search within persons'; + } } \ No newline at end of file