SydonieQueryFilter

De Sydonie

Les SydonieQueryFilter (ou Filtre) sont des moyens d'adapter des requêtes SydonieQuery en vue de

  • générer une requête complexes sur les instances saisies dans l'application
  • générer des champs associés à cette requête afin de faciliter la rédaction de formulaire

Sommaire

Description de la configuration d'un package

Pour débuter, nous décrivons un exemple de package fictif en vue de bien comprendre le fonctionnement des filtres. Le package nous intéressant est un SydonieDocument et possède le fichier de configuration suivant :

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <class>
        <name>SydonieDocument_Test</name>
        <extends>Abstract_SydonieDocument</extends>
        <mandatoryProp />
    </class>
 
<attribute entityLevel="work" minOccur="1" maxOccur="1" mandatory="0">
  <predicate>workDate</predicate>
  <objectClass>AttributeType_Date</objectClass>
</attribute>
 
<attribute entityLevel="work" minOccur="1" maxOccur="1" mandatory="0">
  <predicate>workDateTime</predicate>
  <objectClass>AttributeType_DateTime</objectClass>
</attribute>
 
<attribute entityLevel="work" minOccur="1" maxOccur="1" mandatory="0">
  <predicate>workDateInterval</predicate>
  <objectClass>AttributeType_DateInterval</objectClass>
</attribute>
 
<attribute entityLevel="work" minOccur="1" maxOccur="1" mandatory="0">
  <predicate>workText</predicate>
  <objectClass>AttributeType_Text</objectClass>
</attribute>
 
<attribute entityLevel="work" minOccur="1" maxOccur="1" mandatory="0">
  <predicate>workInt</predicate>
  <objectClass>AttributeType_Int</objectClass>
</attribute>
 
</configuration>

Pour résumer ce package SydonieDocument_Test possède les attributs suivants ayant chacun leur type (AttributeType) :

  • (AttributeType_Date) workDate
  • (AttributeType_DateTime) workDateTime
  • (AttributeType_Text) workText
  • (AttributeType_Int) workInt
  • (AttributeType_DateInterval) workDateInterval
  • (+ tous les attributs hérités du package SydonieDocument)

Utiliser les SydonieQueryFilter consiste à expliciter des contraintes que l'on veut appliquer sur ces attributs en fonction de leurs AttributeType en vue d'une requête. Par exemple :

  • Récupérer les SydonieDocument_Test dont (workText contient la chaîne "toto")
  • Récupérer les SydonieDocument_Test dont (workText contient la chaîne "toto" OU workInt est égal à 42)
  • Récupérer les SydonieDocument_Test dont (workText contient la chaîne "toto" OU workInt est égal à 42) ET (workDate est compris entre le 01 Janvier 2010 et le 23 Mars 2011)
  • etc.

Les AttributeType et les SydonieQueryFilter

Un petit mot sur les Attributetype

Chaque AttributeType contient lui aussi ses propres attributs qui sont utilisés pour connaitre la nature de la valeur stockée au moment de la saisie d'une instance d'un package. Par exemple :

  • AttributeType_Text contient un attribut "text" de type text
  • AttributeType_Int contient un attribut "int" de type int
  • AttributeType_Date contient un attribut "date" de type date
  • AttributeType_DateTime contient un attribut "dateTime" de type dateTime

Certains peuvent contenir plusieurs attributs :

  • AttributeType_DateInterval contient deux attributs
    • begins de type "date"
    • end de type "date"

Ainsi, pour une instance d'un SydonieDocument_Test, nous pouvons utiliser la forme suivante pour nommer certains attributs d'AttributeType particulier :

  • SydonieDocument_Test.workText.text pour l'attribut "text" de l'AttributeType workText d'une instance de SydonieDocument_Text
  • SydonieDocument_Test.workDateInterval.begins pour l'attribut "begins" de l'AttributeType workDateInterval d'une instance de SydonieDocument_Text

Quels AttributeType pour les SydonieQueryFilter ?

Rédiger une SydonieQueryFilter, équivaut à établir des clauses sur ces AttributeType, ainsi que sur d'autres propriétés des instances saisies. Les SydonieQueryFilter prennent en compte 4 cas de figure :

  • AttrbuteType.attribut
  • AttributeType
    • considéré comme la somme de ses AttributeType.attribut
    • considéré comme un tout
  • les propriétés des instances qui ne sont pas des AttributeType

Exemple de SydonieQueryFilter

Cet exemple montre l'utilisation d'un SydonieQueryFilter au sein d'une action.

  $m = getManager('SydonieQueryFilters');
  $idFilter = 'myFilterIdentifier';
 
  $array_filters = array(
    'myConditions1' => array(
      'SydonieDocument_Test' => array('creationDate', 'workText')
    ),
    'myConditions2' => array(
      'SydonieDocument_Test' => array('description')
    )
  );
 
  $option_filters = array(
    'myConditions1' => array(
      'SydonieDocument_Test' => array(
         'creationDate' => array('CalendarTime_Margin', array('dateMargin'=>'P2D')),
         'workText.text' => array('Select_As', array('select'=>array('Ada','Perl'))),
      )
    ),
    'myConditions2' => array(
      'SydonieDocument_Test' => array(
         'description.text' => array('Select_Like', array('select'=>array('toto','tutu'))),
      )
    )
  );
 
  $m->addFilter($idFilter, $array_filters, $option_filters);
  $dataGet = $this->controllerData->getDataGet();
  $m->process($idFilter, $dataGet);
 
  $bq = SydonieDocument_Test::baseQuery($this->class);
  $prepareQueryVars = array();
  $m->addToQuery($idFilter, $bq, $prepareQueryVars);
  $arrayInstances = $bq->fetchAll($prepareQueryVars);
 
  $params = array(
    'idFilter' => $idFilter,
    'actionUrl' => urlTo($this->class, 'testClass'),
    'methodFilter' => 'get'
  );
  $html_form = getUi($this->class)->display('sydonieQueryFilter/form', $params);
 
  if(sizeOf($arrayInstances) > 0){
    $params = array(
      'arrayInstances' => $arrayInstances
    );
    return $html_form.getUi($this->class)->display('template_pour_afficher_les_resultats', $params);
  }
  else {
    return $html_form.getUi($this->class)->display('template_si_aucun_resultat');
  }

Cet exemple est décomposable en plusieurs étapes :

  1. déclaration du filtre
    1. déclaration des AttributeType sur lesquels ce filtre s'applique
    2. déclaration des options
  2. instanciation du SydonieQueryFilter
  3. application du filtre sur une requête SydonieQuery
  4. création du formulaire associé au filtre
  5. affichage des résultats

Déclaration du SydonieQueryFilter

Cette étape fait appel au manager de SydonieQueryFilter et permet d'établir sur quels objets et sur quels AttributeType de ces objets le filtre s'applique. A chaque filtre est associé un identifiant sous la forme d'une chaîne de caractères. Ici, $idFilter sera utilisé ultérieurement pour récupérer les informations du filtre que l'on va créer.

  $m = getManager('SydonieQueryFilters');
  $idFilter = 'myFilterIdentifier';

Déclaration des AttributeType

Un filtre se déclare via un tableau associatif ayant cette structure :

  • conditionName
    • objectName
      • tableau d'attributs.
  $array_filters = array(
    'myConditions1' => array(
      'SydonieDocument_Test' => array('creationDate', 'workText')
    ),
    'myConditions2' => array(
      'SydonieDocument_Test' => array('description')
    )
  );

Cette déclaration peut être lue de la manière suivante : Filtrer les résultats d'une requête sur

  • (la date de Création d'un SydonieDocument_Test OU l'attribut workText d'un SydonieDocument_Test)
  • ET (l'attribut description d'un sydonieDocument_Test).

Ici, nous souhaitons récupérer des informations telles que les SydonieDocument_Test "contiennent une certaine chaîne dans l'AttributType workText OU qui ont été créé entre deux dates" ET "dont la description possède une certaine caractéristique".

Chaque condition contient des attributs dont les contraintes seront traitées comme des "OU inclusifs" (OR). Les relations entre condition sont traitées via une relation logique ET (AND). Chaque condition est nommée en fonction des besoins. Le nom de cette condition est utilisé pour afficher le label associé à cette condition à l'affichage du formulaire associé au filtre.

Déclaration des options

Les options permettent de définir la manière utilisée pour traiter les filtres. Par exemple :

  • filtrer via un AttributeType_Text en utilisant un <input type="text"/> ou <select>
  • filtrer via un AttributeType_Date en utilisant un ou plusieurs Calendar

De plus, ces options définissent comment les informations envoyée via le formulaire sont traités pour chaque AttributeType :

  • pour l'AttributeType_Text contraint via un <input type="text"/>, considérer seulement ceux qui contiennent la chaîne saisie
  • pour l'AttributeType_Date contraint via deux Calendar, considérer seulement ceux qui sont compris entre les deux dates sélectionnées.

Ainsi, dans l'exemple ci-contre, CalendarTime_Margin définit le type d'input (CalendarTime) et la manière dont la valeur envoyée est traitée (Margin).

Les options sont déclarées via un tableau associatif ayant la structure suivante :

  • conditionName
    • objectName
      • AttributType.attribut
        • tableau d'options
  $option_filters = array(
    'myConditions1' => array(
      'SydonieDocument_Test' => array(
         'creationDate' => array('CalendarTime_Margin', array('dateMargin'=>'P2D')),
         'workText.text' => array('Select_As', array('select'=>array('Ada','Perl'))),
      )
    ),
    'myConditions2' => array(
      'SydonieDocument_Test' => array(
         'description.text' => array('Select_Like', array('select'=>array('toto','tutu'))),
      )
    )
  );

Les noms des conditions sont les mêmes que ceux donnés à la déclaration des options. Les options s'appliquent directement aux AttributType.attribut.

Dans cet exemple, nous définissons les options suivantes :

  • pour les AttributType de la condition myConditions1
    • la date de création est définie via un CalendarTime, calendrier dans lequel nous pouvons sélectionner une heure (CalendarTime). Les date de création considérées sont celles inclues dans l’intervalle [date_saisie - margin, date_saisie + margin] (Margin). La valeur margin est ici de deux jours (P2D).
    • l'attribut workText.text est définit via un <input type="select"/> (Select) dont les valeurs possibles sont Ada et Perl. Les workText.text considérés sont ceux égaux à la valeur saisie (As).
  • pour les AttributType de la condition myConditions2
    • l'attribut description.text est définit via un <input type="select"/> (Select) dont les valeurs possibles sont toto et tutu. Les workText.text considérés sont contenant la valeur saisie (Like).

Liste des options pour chaque AttributeType

Options sur les AttributeType.attribut

Ces options sont applicables sur les quatre type AttributeType.attribut primitifs suivant :

  • text
  • int
  • date
  • dateTime
AttributeType.text
Type d'attributType de filtreoptions
TextInput_Asaucune
Input_Likeaucune
Select_Likeselect
Select_Asselect
Radio_Likeselect
Radio_Asselect
Split_MultiLikesplitRule
Split_MultiAssplitRule
Checkbox_MultiLikeselect
Checkbox_MultiAsselect
Input_As
  • [Input] : Utilise un champ <input type="text" />
  • [As] : choisi les champs text dont la valeur est égale à celle saisie

Exemple de déclaration :

  'workText.text' => array('Input_As', array()))
Input_Like
  • [Input] : Utilise un champ <input type="text" />
  • [Like] : choisi les champs text dont la valeur contient celle saisie

Exemple de déclaration :

  'workText.text' => array('Input_Like', array()))
Select_As
  • [Select] : Utilise un champ <input type="select" />
  • [As] : choisi les champs text dont la valeur est égale à celle saisie
  • options : array('select'=>array('choice1', 'choice2', ...))

Exemple de déclaration :

  'workText.text' => array('Select_As', array('select' => array('Ada', 'Perl'))))
Select_Like
  • [Select] : Utilise un champ <input type="select" />
  • [Like] : choisi les champs text dont la valeur contient celle saisie
  • options : array('select'=>array('choice1', 'choice2', ...))

Exemple de déclaration :

  'workText.text' => array('Select_Like', array('select' => array('Ada', 'Perl'))))
Radio_As
  • [Radio] : Utilise un champ <input type="radio" />
  • [As] : choisi les champs text dont la valeur est égale à celle saisie
  • options : array('select'=>array('choice1'=>true, 'choice2'=>false, ...))
    • le tableau associatif $options['select'] est structuré de la manière suivante:
      • clef : choix radio
      • valeur : flag pour symboliser "coché" (true) ou "non-coché" (false). Seul le premier couple (clef,true) est pris en compte comme étant coché à l'affichage.

Exemple de déclaration :

  'workText.text' => array('Radio_As', array('select' => array('Ada'=>true, 'Perl'=>false))))
Radio_Like
  • [Radio] : Utilise un champ <input type="radio" />
  • [Like] : choisi les champs text dont la valeur contient celle saisie
  • options : array('select'=>array('choice1'=>true, 'choice2'=>false, ...))
    • le tableau associatif $options['select'] est structuré de la manière suivante:
      • clef : choix radio
      • valeur : flag pour symboliser "coché" (true) ou "non-coché" (false). Seul le premier couple (clef,true) est pris en compte comme étant coché à l'affichage.

Exemple de déclaration :

  'workText.text' => array('Radio_Like', array('select' => array('Ada'=>true, 'Perl'=>false))))
Split_MultiAs
  • [Split] : Utilise un champ <input type="radio" />. Ce champ est découpé en fonction de l'option utilisée
  • [MultiAs] : choisi les champs text dont la valeur est égale à au moins une de celles issues de l'input correspondant
  • options : array('splitRule' => 'regexp')
    • l'option $options['splitRule'] définit une expression régulière servant à découper la chaîne saisie dans l'<input type="text" />.
    • par exemple : array('splitRule' => '[, \-;]+') découpera la chaîne suivant les séquences de ",", ";", "-" et " " contigus.
    • voir [mb_split] pour plus de détails sur cette segmentation

Exemple de déclaration :

  'workText.text' => array('Split_MultiAs', array('splitRule' => ' ')))
Split_MultiLike
  • [Split] : Utilise un champ <input type="text" />. Ce champ est découpé en fonction de l'option utilisée
  • [MultiLike] : choisi les champs text dont la valeur inclue au moins une de celles issues de l'input correspondant
  • options : array('splitRule' => 'regexp')
    • l'option $options['splitRule'] définit une expression régulière servant à découper la chaîne saisie dans l'<input type="text" />.
    • par exemple : array('splitRule' => '[, \-;]+') découpera la chaîne suivant les séquences de ",", ";", "-" et " " contigus.
    • voir [mb_split] pour plus de détails sur cette segmentation

Exemple de déclaration :

  'workText.text' => array('Split_MultiLike', array('splitRule' => ' ')))
Checkbox_MultiAs
  • [Checkbox] : Utilise un champ <input type="checkbox" />
  • [MultiAs] : choisi les champs text dont la valeur est égale à au moins une de celles issues de l'input correspondant
  • options : array('select'=>array('choice1'=>true, 'choice2'=>false, ...))
    • le tableau associatif $options['select'] est structuré de la manière suivante:
      • clef : choix checkbox
      • valeur : flag pour symboliser "coché" (true) ou "non-coché" (false).

Exemple de déclaration :

  'workText.text' => array('CheckBox_MultiAs', array('select' => array('Ada'=>true, 'Perl'=>true))))
Checkbox_MultiLike
  • [Checkbox] : Utilise un champ <input type="checkbox" />
  • [MultiLike] : choisi les champs text dont la valeur inclue au moins une de celles issues de l'input correspondant
  • options : array('select'=>array('choice1'=>true, 'choice2'=>false, ...))
    • le tableau associatif $options['select'] est structuré de la manière suivante:
      • clef : choix checkbox
      • valeur : flag pour symboliser "coché" (true) ou "non-coché" (false).

Exemple de déclaration :

  'workText.text' => array('Checkbox_MultiLike', array('select' => array('Ada'=>true, 'Perl'=>true))))
AttributeType.int
Type d'attributType de filtreoptions
IntInputInt_Asaucune
InputInt_Marginmargin
InputIntDual_Betweenaucune
InputInt_As
  • [InputInt] : Utilise un champ <input type="text" /> (le contenu sera hardcasté en int)
  • [As] : choisi les champs int dont la valeur est égale à celle saisie

Exemple de déclaration :

  'workInt.int' => array('InputInt_As', array()))
InputInt_Margin
  • [InputInt] : Utilise un champ <input type="text" /> (le contenu sera hardcasté en int)
  • [Margin] : choisi les champs int dont la valeur est inclue dans l'intervalle [valeur_saisie-magin, valeur_saisie+margin]
  • options : array('margin' => int_margin)
    • l'option $options['margin'] définit la valeur ajoutée et soustraite à <input type="text" /> pour définir l'intervalle [valeur_saisie-magin, valeur_saisie+margin].

Exemple de déclaration :

  'workInt.int' => array('InputInt_Margin', array('margin' => 7)))
InputIntDual_Between
  • [InputInt] : Utilise deux champs <input type="text" /> (leurs contenus seront hardcastés en int)
  • [Between] : choisi les champs int dont la valeur est inclus à celles récupérées dans les deux <input type="text" /> [valeur_min, valeur_max]

Exemple de déclaration :

  'workInt.int' => array('InputInt_Between', array()))
AttributeType.date
Type d'attributType de filtreoptions
DateCalendarDual_Betweenaucune
Calendar_Asaucune
Calendar_MargindateMargin
CalendarDual_Between
  • [CalendarDual] : Utilise deux Calendars (choix de l'année, du mois et du jour)
  • [Between] : choisi les champs date dont la valeur est inclus à celles récupérées dans les deux Calendar [valeur_min, valeur_max]

Exemple de déclaration :

  'workDate.date' => array('CalendarDual_Between', array()))
Calendar_As
  • [Calendar] : Utilise un Calendars (choix de l'année, du mois et du jour)
  • [As] : choisi les champs date dont la valeur est égale à celle sélectionnée

Exemple de déclaration :

  'workDate.date' => array('Calendar_As', array()))
Calendar_Margin
  • [Calendar] : Utilise un Calendars (choix de l'année, du mois et du jour)
  • [Margin] : choisi les champs date dont la valeur est inclue dans l'intervalle [date-dateMargin, date+dateMargin]
  • options : array('dateMargin' => dateInterval)
    • l'option $options['margin'] définit la valeur ajoutée et soustraite à la date sélectionnée pour définir l'intervalle [date-dateMargin, date+dateMargin].
    • voir [dateInterval] pour plus de détails sur le format d'écriture de margin

Exemple de déclaration :

  'workDate.date' => array('Calendar_Margin', array('dateMargin'=>'P3D')))
AttributeType.dateTime
Type d'attributType de filtreoptions
DateTimeCalendarDual_Betweenaucune
Calendar_Asaucune
Calendar_MargindateMargin
CalendarDual_Between
  • [CalendarDual] : Utilise deux CalendarTimes (choix de l'année, du mois, du jour, de l'heure et des minutes)
  • [Between] : choisi les champs dateTime dont la valeur est inclue à celles récupérées dans les deux CalendarTime [valeur_min, valeur_max]

Exemple de déclaration :

  'workDateTime.dateTime' => array('CalendarTimeDual_Between', array()))
Calendar_As
  • [Calendar] : Utilise un CalendarTime (choix de l'année, du mois, du jour, de l'heure et des minutes)
  • [As] : Choisi les champs dateTime dont la valeur est égale à celle sélectionnée

Exemple de déclaration :

  'workDateTime.dateTime' => array('CalendarTime_As', array()))
Calendar_Margin
  • [Calendar] : Utilise un CalendarTime (choix de l'année, du mois, du jour, de l'heure et des minutes)
  • [Margin] : Choisi les champs dateTime dont la valeur est inclue dans l'intervalle [date-dateMargin, date+dateMargin]
  • options : array('dateMargin' => dateInterval)
    • l'option $options['dateMargin'] définit la valeur ajoutée et soustraite à la date sélectionnée pour définir l'intervalle [date-dateMargin, date+dateMargin].
    • voir [dateInterval] pour plus de détails sur le format d'écriture de dateMargin.

Exemple de déclaration :

  'workDateTime.dateTime' => array('CalendarTime_Margin', array('dateMargin'=>'P3D')))

Options sur les AttributeType

Certains AttributeType portent un sens plus que la somme de leurs AttributeType.attribut. Ces attributs traités par les SydonieQueryFilter sont :

  • AttributeType_DateInterval
  • AttributeType_DateTimeInterval

Les SydonieQueryFilter peuvent tout de même contraindre spécifiquement les AttributeType.attribut de ces AttributeType. Par exemple pour workDateInterval qui est un AttributeType_DateInterval :

  'workDateInterval.begins' => array('CalendarTime_As', array()))

Ainsi, nous exerçons le filtre sur l'attribut begins en le considérant en tant que AttributeType.date et donc en lui appliquant une option disponible pour ce AttributeType.attribut.

AttributeType_DateInterval
Type d'attributType de filtreoptions
DateIntervalCalendarDual_Intersectaucune
Calendar_Inaucune
CalendarDual_Intersect
  • [CalendarDual] : Utilise deux Calendars (choix de l'année, du mois et du jour)
  • [Between] : choisi les intervalles dont qui possèdent une intersection avec l'intervalle formé par les deux Calendars [valeur_min, valeur_max]

Exemple de déclaration :

  'workDateInterval' => array('CalendarDual_Intersect', array()))
Calendar_In
  • [Calendar] : Utilise un Calendar (choix de l'année, du mois et du jour)
  • [In] : Choisi les intervalles dont la valeur fournie par le Calendar est inclue dans ceux-ci.

Exemple de déclaration :

  'workDateInterval' => array('Calendar_In', array()))
AttributeType_DateTimeInterval
Type d'attributType de filtreoptions
DateTimeIntervalCalendarDual_Intersectaucune
Calendar_Inaucune
CalendarTimeDual_Intersect
  • [CalendarDual] : Utilise deux CalendarTimes (choix de l'année, du mois, du jour, de l'heure et des minutes)
  • [Between] : choisi les intervalles dont qui possèdent une intersection avec l'intervalle formé par les deux CalendarTimes [valeur_min, valeur_max]

Exemple de déclaration :

  'workDateTimeInterval' => array('CalendarDual_Intersect', array()))
Calendar_In
  • [Calendar] : Utilise un CalendarTime (choix de l'année, du mois, du jour, de l'heure et des minutes)
  • [In] : Choisi les intervalles dont la valeur fournie par le CalendarTime est inclue dans ceux-ci.

Exemple de déclaration :

  'workDateTimeInterval' => array('Calendar_In', array()))

Options sur les autres attributs

Ces options s'appliquent sur des attributs qui ne sont pas définis dans le fichier de configuration config.xml d'un objet. Les SydonieQueryFilter permettent de traiter les attributs suivant:

  • tag
  • creationDate
tag
Type d'attributType de filtreoptions
TagInput_Likeaucune
Input_Asaucune
Split_MultiLikesplitRule
Split_MultiAssplitRule
Input_As
  • [Input] : Utilise un champ <input type="text" />
  • [As] : choisi les tags dont la valeur est égale à celle saisie

Exemple de déclaration :

  'tag' => array('Input_As', array()))
Input_Like
  • [Input] : Utilise un champ <input type="text" />
  • [Like] : choisi les tags dont la valeur contient celle saisie

Exemple de déclaration :

  'tag' => array('Input_Like', array()))
Split_MultiAs
  • [Split] : Utilise un champ <input type="radio" />. Ce champ est découpé en fonction de l'option utilisée
  • [MultiAs] : choisi les tag dont la valeur est égale à au moins une de celles issues de l'input correspondant
  • options : array('splitRule' => 'regexp')
    • l'option $options['splitRule'] définit une expression régulière servant à découper la chaîne saisie dans l'<input type="text" />.
    • par exemple : array('splitRule' => '[, \-;]+') découpera la chaîne suivant les séquences de ",", ";", "-" et " " contigus.
    • voir [mb_split] pour plus de détails sur cette segmentation

Exemple de déclaration :

  'tag' => array('Split_MultiAs', array('splitRule' => ' ')))
Split_MultiLike
  • [Split] : Utilise un champ <input type="text" />. Ce champ est découpé en fonction de l'option utilisée
  • [MultiLike] : choisi les tag dont la valeur inclue au moins une de celles issues de l'input correspondant
  • options : array('splitRule' => 'regexp')
    • l'option $options['splitRule'] définit une expression régulière servant à découper la chaîne saisie dans l'<input type="text" />.
    • par exemple : array('splitRule' => '[, \-;]+') découpera la chaîne suivant les séquences de ",", ";", "-" et " " contigus.
    • voir [mb_split] pour plus de détails sur cette segmentation

Exemple de déclaration :

  'tag' => array('Split_MultiLike', array('splitRule' => ' ')))
creationDate
Type d'attributType de filtreoptions
creationDateCalendarDual_Betweenaucune
Calendar_MargindateMargin
CalendarDual_Between
  • [CalendarDual] : Utilise deux Calendars (choix de l'année, du mois et du jour)
  • [Between] : choisi les champs dateTime dont la valeur est inclue à celles récupérées dans les deux Calendar [valeur_min, valeur_max]

Exemple de déclaration :

  'creationDate' => array('CalendarDual_Between', array()))
CalendarTimeDual_Between
  • [CalendarTimeDual] : Utilise deux CalendarTimes (choix de l'année, du mois, du jour, de l'heure et des minutes)
  • [Between] : choisi les champs dateTime dont la valeur est inclue à celles récupérées dans les deux Calendar [valeur_min, valeur_max]

Exemple de déclaration :

  'creationDate' => array('CalendarTimeDual_Between', array()))
Calendar_Margin
  • [Calendar] : Utilise un Calendars (choix de l'année, du moi et du jour)
  • [Margin] : Choisi les champs dateTime dont la valeur est inclue dans l'intervalle [date-dateMargin, date+dateMargin]
  • options : array('dateMargin' => dateInterval)
    • l'option $options['dateMargin'] définit la valeur ajoutée et soustraite à la date sélectionnée pour définir l'intervalle [date-dateMargin, date+dateMargin].
    • voir [dateInterval] pour plus de détails sur le format d'écriture de dateMargin.

Exemple de déclaration :

  'creationDate' => array('Calendar_Margin', array('dateMargin'=>'P3D')))

Instanciation du SydonieQueryFilter

Une fois les filtres définit, nous les instancions en nourrissant le manager de SydonieQueryFilter de ces données.

  $m->addFilter($idFilter, $array_filters, $option_filters);

Nous récupérons aussi les données fournies en $_GET pour préremplir les champs si jamais notre action recueille les données issues du formulaire de filtre. La même chose est possible avec les données fournies en $_POST.

  $dataGet = $this->controllerData->getDataGet();
  $m->process($idFilter, $dataGet);

Modification d'une requête SydonieQuery

  $bq = SydonieDocument_Test::baseQuery($this->class);
  $prepareQueryVars = array();
  $m->addToQuery($idFilter, $bq, $prepareQueryVars);
  $arrayInstances = $bq->fetchAll($prepareQueryVars);

Le point de départ est une requête SydonieQuery. Ici :

  $bq = SydonieDocument_Test::baseQuery($this->class);

Cette requête est équivalente à celle déclarée de la manière suivante :

  $bq = new SydonieQuery_Query(array(
    new SydonieQuery_Entity('SydonieDocument_Test', 'SydonieDocument_Test'),
    new SydonieQuery_Rights('SydonieDocument_Test', 'read'),
    new SydonieQuery_Return('SydonieDocument_Test')
  ));

Il s'agit dont ici de récupérer tous les SydonieDocument_Test. Appliquer des filtres sur cette requête équivaut à ajouter des clauses sur les attributs sur lesquels la requête porte.

  $prepareQueryVars = array();
  $m->addToQuery($idFilter, $bq, $prepareQueryVars);
  $arrayInstances = $bq->fetchAll($prepareQueryVars);

$prepareQueryVars recueille les données qui ont été saisies dans les filtres au moment de l'appel de la méthode process du manager de filtre.

  $m->process($idFilter, $dataGet);

Ces données sont utilisées de la même manière que lors d'une préparation de requête via PDO. Le filtre appliqué est donné en utilisant l'identifiant $idFilter adéquat.

  $m->addToQuery($idFilter, $bq, $prepareQueryVars);
  $arrayInstances = $bq->fetchAll($prepareQueryVars);

$arrayInstances contient un tableau d'instance de SydonieDocument_Test comme spécifié dans la requête $bq

Création du formulaire associé au filtre

Un template d'affichage du formulaire issu du filtre et de ses options est fourni dans Sydonie au chemin suivant : SYDONIE/Abstract/SydonieEntity/templates/SydonieQueryFilter/form.tpl.php. Ce template a besoin des paramètres suivants :

  $params = array(
    'idFilter' => $idFilter,
    'actionUrl' => urlTo($this->class, 'testClass'),
    'methodFilter' => 'get'
  );
  $html_form = getUi($this->class)->display('sydonieQueryFilter/form', $params);

Le contenu de ce template ci-contre donne un aperçu de la manière dont le manager de filtre est utilisé pour afficher le formulaire correspondant :

<?php
/*
 * $actionUrl : action = "$action"
 * $idFilter = Filter id to use to build the form
 * $methodFilter = post|get
 */
  $m = getManager('SydonieQueryFilters');
  $arrayFilterToForm = $m->getFiltersForm($idFilter);
  if(count($arrayFilterToForm) === 0){
    return;
  }
?>
 
<form class="filters"
      action="<?php echo $actionUrl; ?>"
      method="<?php echo $methodFilter ?>">
 
<fieldset class="filter">
 
<?php
 
foreach($arrayFilterToForm as $conditionName => $array_filter){
  echo $ui->label($m::getLabelCondition($conditionName));
  foreach($array_filter as $filter){
    echo $filter->write($obj);
  }
}
 
?>
</fieldset>
<input type="submit" name="submit" value="<?php echo $ui->label('submitFilter'); ?>">
</form>

Affichage des résultats

Cette partie est indépendante de la manipulation des requêtes SydonieQuery par des SydonieQueryFilter et est donnée que par soucis de complétude de l'exemple. Ici, nous affichons les résultats via des templates en passant en paramètre le tableau $arrayInstances. Aux templates template_pour_afficher_les_resultats et template_si_aucun_resultat d'afficher les résultats en fonction des besoins de l'application.

  if(sizeOf($arrayInstances) > 0){
    $params = array(
      'arrayInstances' => $arrayInstances
    );
    return $html_form.getUi($this->class)->display('template_pour_afficher_les_resultats', $params);
  }
  else {
    return $html_form.getUi($this->class)->display('template_si_aucun_resultat');
  }

Tableau Récapitulatif des options sur les filtres

Type d'attributType de filtreoptions
TextInput_Asaucune
Input_Likeaucune
Select_Like
Select_As
Radio_Like
Radio_As
Split_MultiLike
Split_MultiAs
Checkbox_MultiLike
Checkbox_MultiAs
IntInputInt_Asaucune
InputInt_Margin
InputIntDual_Betweenaucune
DateCalendarDual_Betweenaucune
Calendar_Asaucune
Calendar_Margin
DateTimeCalendarTimeDual_Betweenaucune
CalendarTime_Asaucune
CalendarTime_Margin
DateIntervalDualCalendar_Intersectaucune
Calendar_Inaucune
DateTimeIntervalDualCalendar_Intersectaucune
Calendar_Inaucune
TagInput_Likeaucune
Input_Asaucune
Split_MultiLike
Split_MultiAs
CreationDateCalendarDual_Betweenaucune
CalendarTimeDual_Betweenaucune
CalendarTime_Margin