Outils pour utilisateurs

Outils du site


Panneau latéral

devguide:howto:create_filter

Créer un filtre

Dans l'exemple ci-dessous, nous partons sur la base de notre module ''recipes''(télécharger).

Voici les différentes étapes que nous allons accomplir :

  • créer un document (filteringfolder) qui étend le document queryfolder
  • créer le filtre sur les propriétés du document recipe
  • créer et modifier les éditeurs back office pour notre document filteringfolder

Création du dossier implémentant le filtre

Nous allons créer un document qui étend le query folder afin de faire des dossiers filtrant :

php framework/bin/change.php create-document recipes filteringfolder
== Create document ==
=> Document recipes/filteringfolder initialized.
You must now edit <path>/modules/recipes/persistentdocument/filteringfolder.xml and later call add-document

Le modèle de notre document se contente juste de d'étendre le queryfolder du module filter :

<?xml version="1.0" encoding="utf-8"?>
<document xmlns="http://www.rbs.fr/schema/change-document/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.rbs.fr/schema/change-document/1.0 http://www.rbschange.fr/static/schema/change-document/3.5.xsd"
	model-version="3.5" icon="filteringfolder" 
	extend="modules_filter/queryfolder">
</document>

On finalise l'ajout de notre dossier filtrant :

 php framework/bin/change.php add-document recipes filteringfolder
== Add document ==
Generating <projectPath>/modules/recipes/persistentdocument/filteringfolder.class.php
Generating <projectPath>/modules/recipes/persistentdocument/import/FilteringfolderScriptDocumentElement.class.php
Updating <projectPath>/modules/recipes/persistentdocument/import/recipes_binding.xml
Parent: modules_filter/queryfolder
Generating <projectPath>/modules/recipes/lib/services/FilteringfolderService.class.php
Add filteringfolder in <projectPath>/modules/recipes/config/rights.xml
Execute: compile-locales recipes...
Execute: compile-tags ...
Execute: compile-documents ...
Execute: compile-db-schema ...
Execute: compile-config ...
=> Document filteringfolder added in module recipes.

Réalisation du filtre

Nous allons faire notre filtre pour qu'il agisse sur les propriétés vegetarian, peopleNumber, preparationTime, cookingTime, ingredients, cost, difficulty du document recipe. Pour cela nous allons d'abord générer le code nécessaire pour le filtre à l'aide de la commande filter.add-filter :

php framework/bin/change.php filter.add-filter
== HELP ==
Filter.add-filter: adds a new filter
Usage: change.php filter.add-filter <moduleName> <name> <modelName> [<commaSeparatedParamNames>]

Génération du filtre

Nous ajoutons donc à notre module recipes le filtre RecipeProperty qui s'appliquer uniquement au document recipe et qui prendra en paramètre la variable restriction :

php framework/bin/change.php filter.add-filter recipes RecipeProperty modules_recipes/recipe restriction
== AddFilter ==
Filter class path: <projectPath>/modules/recipes/persistentdocument/filters/RecipePropertyFilter.php
Filter locales in m.recipes.bo.documentfilters: recipepropertyfilter-label and recipepropertyfilter-text
=> Command successfully executed

Code du filtre

Il suffit de déclarer les propriétés sur lesquelles on souhaite faire un filtre. RBS Change sera capable de présenter les contrôles de filtrage en fonction du typage de la propriété dans le modèle du document.
Nous modifions donc le code de la classe modules/recipes/persistentdocument/filters/RecipePropertyFilter.php afin qu'elle fasse ce que l'on attend du filtre, ce qui nous donne :

<?php
/**
 * recipes_RecipePropertyFilter
 * @package modules.recipes.persistentdocument.filters
 */
class recipes_RecipePropertyFilter extends f_persistentdocument_DocumentFilterImpl
{
	public function __construct()
	{
		// Parameter "property".
		$property = f_persistentdocument_DocumentFilterRestrictionParameter::getNewInstance();
		$property->setAllowedPropertyNames(array('modules_recipes/recipe.vegetarian',
				'modules_recipes/recipe.peopleNumber',
				'modules_recipes/recipe.preparationTime',
				'modules_recipes/recipe.cookingTime',
				'modules_recipes/recipe.ingredients',
				'modules_recipes/recipe.cost',
				'modules_recipes/recipe.difficulty'));
		
		$this->setParameter('restriction', $property);
	}
	
	/**
	 * @return String
	 */
	public static function getDocumentModelName()
	{
		return 'modules_recipes/recipe';
	}

	/**
	 * Get the query to find documents matching this filter.
	 * @return f_persistentdocument_criteria_Query
	 */
	public function getQuery()
	{
		$query = recipes_RecipeService::getInstance()->createQuery();
		$query->add($this->getParameter('restriction')->getValueForQuery());
		return $query;
	}
}

Rendre le filtre utilisable

Nous initialisons les éditeurs back office :

php framework/bin/change.php add-document-editor recipes filteringfolder 
== Add document editor ==
Add action createFilteringfolder in <projectPath>/modules/recipes/config/actions.xml
Create <projectPath>/modules/recipes/forms/editor/filteringfolder directory
Add model to <projectPath>/modules/recipes/config/perspective.xml
Add filteringfolder as generic/rootfolder child
Add createFilteringfolder to generic/rootfolder contextual menu
Add filteringfolder as generic/folder child
Add createFilteringfolder to generic/folder contextual menu
Declare createFilteringfolder in perspective
Execute: compile-locales recipes...
Execute: compile-editors-config ...
Execute: clear-webapp-cache ...
=> Document filteringfolder's backoffice interface generated.

Modification de la perspective

Dans le fichier de recipes/config/perspective.xml on retire les actions activate, deactivated, reactivate. Par ailleurs, on ajoute dans la liste des drops du rootfolder notre document pour permettre d'ordonner les différents éléments, et on déclare également le document recipe comme pouvant être sous notre document filteringfolder ce qui donne :

...
    <model name="modules_generic/rootfolder">
...
      <drops>
...
        <drop model="modules_recipes/filteringfolder" action="move"/>
      </drops>
...
    </model>
...
    <model name="modules_recipes/filteringfolder">
      <contextactions>
        <contextaction name="edit"/>
        <contextaction name="delete"/>
      </contextactions>
      <children>
         <child model="modules_recipes/recipe" from="function" />
      </children>
    </model>
...
    <action name="createFilteringfolder" single="true" permission="Insert_filteringfolder" icon="add"/>
...

Spécialisation des éditeurs

Nous allons maintenant générer les formulaires de configuration du dossier filtrant :

php framework/bin/change.php generate-document-editor recipes/filteringfolder create
== Generate document editor ==
Processing recipes/filteringfolder create...
<projectPath>/modules/recipes/forms/editor/filteringfolder/create.xml generated
=> Document editor generated

php framework/bin/change.php generate-document-editor recipes/filteringfolder properties
== Generate document editor ==
Processing recipes/filteringfolder properties...
<projectPath>/modules/recipes/forms/editor/filteringfolder/properties.xml generated
=> Document editor generated

On modifie ensuite les fichiers recipes/forms/editor/filteringfolder/*.xml en remplaçant :

    <field name="query" />
par
    <field name="query" type="query" allow="recipes/recipe::getQuery"/>

Afin de prendre en compte les locales que nous avons ajouté pour le filtre, la modification des éditeurs etc… nous pouvons exécuter la commande suivante :

php framework/bin/change.php compile-all

Screenshot

Exemple du formulaire de création de filtre que nous avons créé (cliquez pour agrandir).

Aller plus loin

Pour obtenir plus d'informations sur les filtres, veuillez consulter la page de la référence consacrée aux Filtres

devguide/howto/create_filter.txt · Dernière modification: 2017/01/19 14:54 (modification externe)