Widget permettant de lancer une recherche sur un dataset donné et d’en stocker une valeur choisie.

Edit me

Hérite de WidgetField.

Fonction

Rendu

Utilisation

Exemple : Recherche au sein d’un varset

Au sein d’un formulaire patient, rechercher un médecin pour stocker son ID dans la fiche patient.

Le varset patient

<varset name="patient" prefix="patient" type="std" label="Patient">
  <var uid="1" id="nom" type="string" default_label="Nom" default_short_label="Nom">
    <string length="50"/>
  </var>
  <var uid="2" id="prenom" type="string" default_label="Pr&#xE9;nom" default_short_label="Pr&#xE9;nom">
    <string length="255"/>
  </var>
  <var uid="3" id="id_medecin" type="fkey_varset_ref" default_label="M&#xE9;decin">
    <fkey_varset_ref varset_name="medecin"/>
  </var>
</varset>

Le varset médecin

<varset name="medecin" prefix="medecin" type="std" label="M&#xE9;decin">
  <var uid="1" id="nom" type="string" default_label="Nom" default_short_label="Nom">
    <string length="50"/>
  </var>
  <var uid="2" id="prenom" type="string" default_label="Pr&#xE9;nom" default_short_label="Pr&#xE9;nom">
    <string length="255"/>
  </var>
  <var uid="3" id="adresse" type="string" default_label="Adresse" default_short_label="Adresse">
    <string length="255"/>
  </var>
</varset>

Le formulaire Patient

<?xml version="1.0" encoding="UTF-8"?>
<form id="ogyhrwfwci15441725959">
  
  <!-- Définition des sources données -->
  <data_structure>
	
	<!-- Dataquery principal -->
	<dataquery id="patient" editor_id="main" table_name="{pj}_patient_data" varset_name="patient" table_alias="main">
	  <column_simple field_name="id_data" table_name="main"/>
	  <!-- Condition pour récupérer une fiche patient précise -->
	  <condition sql="{id_data}={param_id_data}">
		<field field_name="id_data" table_name="main" alias="id_data"/>
		<variable alias="param_id_data" default="NULL">
		  <entry type="param" name="id_data"/>
		</variable>
	  </condition>
	  <column_simple field_name="nom" table_name="main"/>
	  <column_simple field_name="prenom" table_name="main"/>
	  <!-- Colonne où sera stockée la valeur sélectionnée au moyen du WidgetAutocomplete -->
	  <column_simple field_name="id_medecin" table_name="main"/>
	</dataquery>
	
	<!-- Dataquery de recherche sur le varset medecin -->
	<dataquery id="recherche_medecin" table_name="{pj}_medecin_data" varset_name="medecin" table_alias="med">
	
	  <!-- Variable utilisée pour l'option value_field -->
	  <column_simple field_name="id_data" table_name="med"/>
	  
	  <!-- Variable calculée utilisée pour l'option display_field -->
	  <column sql="CONCAT_WS(' ', {nom}, {prenom})" alias="nom_prenom" type="string" length="100">
		<field table_name="med" field_name="nom" alias="nom"/>
		<field table_name="med" field_name="prenom" alias="prenom"/>
	  </column>
	  
	  <!-- Variable utilisée pour l'option display_field_comp -->
	  <column_simple field_name="adresse" table_name="med"/>
	  
	  <!-- Condition pour le rafraîchissement du dataset => conditionne la recherche en base de données.
	       Ici, signifie : "Je cherche un médecin dont le nom contient les lettres que je tape
	       dans le champ de recherche. -->
	  <search_on sql="{med.nom} LIKE CONCAT('%', {recherche_nom_medecin}, '%')">		
		<field table_name="med" field_name="nom" alias="med.nom"/>
		
		<!-- Variable permettant de récupérer la chaîne de caractère tapée dans le champ de recherche.
	             L'utilisateur peut choisir le nom de cette variable via l'option search_param_name -->
		<variable alias="recherche_nom_medecin" default="NULL">
		  <entry type="param" name="recherche_nom_medecin"/>
		</variable>		
	  </search_on>
	  
	</dataquery>
	
  </data_structure>
  <layout title="Patient" disabled="false">
	<group title="Identification du patient">
	  <form_row>
		<label dataset="patient" field="nom" />
		<value dataset="patient" field="nom" mode="rw"/>
	  </form_row>
	  <form_row>
		<label dataset="patient" field="prenom" />
		<value dataset="patient" field="prenom" mode="rw"/>
		<option output="html" option_name="strtoupper" value="true" />
	  </form_row>
	  <form_row editor_id="yidaennpgi15544781427">
		<label dataset="patient" field="id_medecin"/>
		<value dataset="patient" field="id_medecin" mode="rw">
		  <option output="html" option_name="widget" value="WidgetAutocomplete"/>
		  <option output="html" option_name="search_dataset" value="recherche_medecin"/>
		  <option output="html" option_name="value_field" value="id_data"/>
		  <option output="html" option_name="display_field" value="nom_prenom"/>
		  <option output="html" option_name="display_field_comp" value="adresse"/>
		  <option output="html" option_name="search_param_name" value="recherche_nom_medecin"/>
		  <option output="html" option_name="min_nb_characters" value="1" />
		  <option output="html" option_name="fa_suffix" value="fa-user"/>
		  <option output="html" option_name="nb_results_show" value="10" />
		  <option output="html" option_name="redirect_path_1" value="form/frame/get/sid/ogyhrwfwci1544172/nom_med/{recherche_nom_medecin}" />
		  <option output="html" option_name="redirect_label_1" value="Ajouter un médecin" />
		</value>
	  </form_row>
	</group>
	<form_row>
	  <box class="col-xs-6">
		<button action="exit" label="Exit"/>
	  </box>
	  <box class="col-xs-6 text-right">
		<button action="save" label="Save" class="btn-primary"/>
	  </box>
	</form_row>
  </layout>
</form>

Redirection vers le formulaire Médecin avec envoi de la chaîne de caractère de recherche

  1. Pour passer la chaîne de caractère de recherche en paramètre dans les liens de redirection, ajouter /nom_du_paramètre/{valeur passée à l’option search_param_name} au lien (voir exemple ci-dessous).
  2. Pour remplir un champ avec ce paramètre dans le formulaire ciblé par le lien de redirection, penser à ajouter l’attribut auto_add_record=”true” au dataquery cible (voir l’article Customs).
  3. Pour récupérer le paramètre dans le formulaire cible, voir l’exemple ci-dessous.

Le lien de redirection : form/frame/get/sid/id du formulaire medecin/nom du parametre/{valeur de l’option search_param_name}

Soit, en suivant l’exemple ci-dessus : “form/frame/get/sid/ogyhrwfwci1544172/nom_med/{recherche_nom_medecin}”

<form id="ogyhrwfwci1544172">
	<!-- Dataquery medecin -->
	<dataquery id="medecin" editor_id="main" table_name="{pj}_medecin_data" varset_name="medecin" table_alias="main" auto_add_record="true">
	  <column_simple field_name="id_data" table_name="main"/>
	  <condition sql="{id_data}={param_id_data}">
		<field field_name="id_data" table_name="main" alias="id_data"/>
		<variable alias="param_id_data" default="NULL">
		  <entry type="param" name="id_data"/>
		</variable>
	  </condition>
	  <column_simple field_name="nom" table_name="main"/>
	  <variables>
		<variable alias="param_nom_med" default="" target_column="nom">
		  <entry type="param" name="nom_med"/>
		</variable>
	  </variables>
	  <column_simple field_name="prenom" table_name="main"/>
	  <column_simple field_name="adresse" table_name="main"/>
	</dataquery>
  <!-- [..] -->
</form>

Exemple : Recherche au sein d’un dictionnaire

Au sein d’un formulaire patient, rechercher le nom d’une maladie via un dictionnaire “maladies”.

Le varset patient

<varset name="patient" prefix="patient" type="std" label="Patient">
  <var uid="1" id="nom" type="string" default_label="Nom" default_short_label="Nom">
    <string length="50"/>
  </var>
  <var uid="2" id="prenom" type="string" default_label="Pr&#xE9;nom" default_short_label="Pr&#xE9;nom">
    <string length="255"/>
  </var>
  <var uid="3" id="id_maladie" type="fkey_dico" default_label="Maladie">
	<fkey_dico dico_name="maladies"/>
  </var>
</varset>

Le formulaire Patient

<?xml version="1.0" encoding="UTF-8"?>
<form id="ogyhrwfwci15441725959">
  
  <!-- Définition des sources données -->
  <data_structure>
	
	<!-- Dataquery principal -->
	<dataquery id="patient" editor_id="main" table_name="{pj}_patient_data" varset_name="patient" table_alias="main">
	  <column_simple field_name="id_data" table_name="main"/>
	  <!-- Condition pour récupérer une fiche patient précise -->
	  <condition sql="{id_data}={param_id_data}">
		<field field_name="id_data" table_name="main" alias="id_data"/>
		<variable alias="param_id_data" default="NULL">
		  <entry type="param" name="id_data"/>
		</variable>
	  </condition>
	  <column_simple field_name="nom" table_name="main"/>
	  <column_simple field_name="prenom" table_name="main"/>
	  <!-- Colonne où sera stockée la valeur sélectionnée au moyen du WidgetAutocomplete -->
	  <column_simple field_name="id_maladie" table_name="main"/>
	</dataquery>
	
	<!-- Dataquery de recherche sur la table {pj}_dico_data qui contient tous les dictionnaires du projet -->
	<dataquery id="recherche_maladie" table_name="{pj}_dico_data" varset_name="dico" table_alias="dico_maladie">
	  
	  <!-- Variable utilisée pour le value_field -->
	  <column_simple field_name="id_data" table_name="dico_maladie"/>
	  
	  <!-- Variable calculée utilisée pour le display_field -->
	  <column sql="CONCAT({code},' - ', {label})" alias="code_label" type="string" length="100">
		<field table_name="dico_maladie" field_name="code" alias="code"/>
		<field table_name="dico_maladie" field_name="label" alias="label"/>
	  </column>
	  
	  <!-- Condition pour le rafraîchissement du dataset => conditionne la recherche en base de données.
		   Ici, signifie : "Je cherche un item de dico dont le code ou le libellé contient les lettres que je tape
		   dans le champ de recherche. -->
	  <search_on sql="{code} LIKE CONCAT('%', {recherche_nom_maladie}, '%') OR {label} LIKE CONCAT('%', {recherche_nom_maladie}, '%')">		
		<field table_name="dico_maladie" field_name="code" alias="code"/>
		<field table_name="dico_maladie" field_name="label" alias="label"/>
		
		<!-- Variable permettant de récupérer la chaîne de caractère tapée dans le champ de recherche.
	         L'utilisateur peut choisir le nom de cette variable via l'option search_param_name -->
		<variable alias="recherche_nom_maladie" default="NULL">
		  <entry type="param" name="recherche_nom_maladie"/>
		</variable>		
	  </search_on>
	  
	  <!-- La table {pj}_dico_data contenant tous les dictionnaires du projet, on applique une condition
		   sur le nom du dictionnaire qui nous intéresse. -->
	  <condition sql="{dico_name}='maladies'">
		<field field_name="dico_name" table_name="dico_maladie" alias="dico_name"/>
	  </condition>
	</dataquery>
	
  </data_structure>
  <layout title="Patient" disabled="false">
	<group title="Identification du patient">
	  <form_row>
		<label dataset="patient" field="nom" />
		<value dataset="patient" field="nom" mode="rw"/>
	  </form_row>
	  <form_row>
		<label dataset="patient" field="prenom" />
		<value dataset="patient" field="prenom" mode="rw"/>
	  </form_row>
	 <form_row editor_id="yidaennpgi144781427">
		<label dataset="patient" field="id_maladie"/>
		<value dataset="patient" field="id_maladie" mode="rw">
		  <option output="html" option_name="widget" value="WidgetAutocomplete"/>
		  <option output="html" option_name="search_dataset" value="recherche_maladie"/>
		  <option output="html" option_name="value_field" value="id_data"/>
		  <option output="html" option_name="display_field" value="code_label"/>
		  <option output="html" option_name="search_param_name" value="recherche_nom_maladie"/>
		  <option output="html" option_name="min_nb_characters" value="2" />
		  <option output="html" option_name="nb_results_show" value="5" />
		</value>
	  </form_row>
	</group>
	<form_row>
	  <box class="col-xs-6">
		<button action="exit" label="Exit"/>
	  </box>
	  <box class="col-xs-6 text-right">
		<button action="save" label="Save" class="btn-primary"/>
	  </box>
	</form_row>
  </layout>
</form>

Procédure via Epicraft

Pour une recherche sur un varset

1. Ajouter une propriété personnalisée "varset.var" sur la page et y insérer le xml correspondant à la variable qui sera récupérée via le widget autocomplete .
<var uid="3" id="id_medecin" type="fkey_varset_ref" default_label="Médecin">
	<fkey_varset_ref varset_name="medecin"/>
</var>
2. Ajouter une propriété personnalisée "form.dataquery.main.column_simple" sur la page et y insérer le xml correspondant à la colonne où sera stockée la valeur sélectionnée au moyen du WidgetAutocomplete.
<column_simple field_name="id_medecin" table_name="main"/>
3. Ajouter une propriété personnalisée "form.dataquery" sur la page et y insérer le xml correspondant au dataquery de recherche.
<dataquery id="recherche_medecin" table_name="{pj}_medecin_data" varset_name="medecin" table_alias="med">
	<column_simple field_name="id_data" table_name="med"/>
	<column sql="CONCAT_WS(' ', {nom}, {prenom})" alias="nom_prenom" type="string" length="100">
		<field table_name="med" field_name="nom" alias="nom"/>
		<field table_name="med" field_name="prenom" alias="prenom"/>
	</column>
	<column_simple field_name="adresse" table_name="med"/>

	<search_on sql="{med.nom} LIKE CONCAT('%', {recherche_nom_medecin}, '%')">		
		<field table_name="med" field_name="nom" alias="med.nom"/>
		<variable alias="recherche_nom_medecin" default="NULL">
			<entry type="param" name="recherche_nom_medecin"/>
		</variable>		
	</search_on>
</dataquery>
4. Ajouter un Bulk à la page et lui appliquer une propriété personnalisée incluant le WidgetAutocomplete.
<form_row>
	<label dataset="patient" field="id_medecin"/>
	<value dataset="patient" field="id_medecin" mode="rw">
		<option output="html" option_name="widget" value="WidgetAutocomplete"/>
		<option output="html" option_name="search_dataset" value="recherche_medecin"/>
		<option output="html" option_name="value_field" value="id_data"/>
		<option output="html" option_name="display_field" value="nom_prenom"/>
		<option output="html" option_name="display_field_comp" value="adresse"/>
		<option output="html" option_name="search_param_name" value="recherche_nom_medecin"/>
		<option output="html" option_name="min_nb_characters" value="1" />
		<option output="html" option_name="fa_suffix" value="fa-user"/>
		<option output="html" option_name="nb_results_show" value="10" />
		<option output="html" option_name="redirect_path_1" value="form/frame/get/sid/ogyhrwfwci1544172/nom_med/{recherche_nom_medecin}" />
		<option output="html" option_name="redirect_label_1" value="Ajouter un médecin" />
	</value>
</form_row>

Pour une recherche sur un dictionnaire

1. Ajouter une propriété personnalisée "form.dataquery" sur la page et y insérer le xml correspondant au dataquery de recherche.
<dataquery id="recherche_maladie" table_name="{pj}_dico_data" varset_name="dico" table_alias="dico_maladie">
	<column_simple field_name="id_data" table_name="dico_maladie"/>
	<column sql="CONCAT({code},' - ', {label})" alias="code_label" type="string" length="100">
		<field table_name="dico_maladie" field_name="code" alias="code"/>
		<field table_name="dico_maladie" field_name="label" alias="label"/>
	</column>
	<search_on sql="{code} LIKE CONCAT('%', {recherche_nom_maladie}, '%') OR {label} LIKE CONCAT('%', {recherche_nom_maladie}, '%')">		
		<field table_name="dico_maladie" field_name="code" alias="code"/>
		<field table_name="dico_maladie" field_name="label" alias="label"/>
		<variable alias="recherche_nom_maladie" default="NULL">
			<entry type="param" name="recherche_nom_maladie"/>
		</variable>		
	  </search_on>
	  <condition sql="{dico_name}='maladies'">
		<field field_name="dico_name" table_name="dico_maladie" alias="dico_name"/>
	  </condition>
</dataquery>
2. Ajouter un composant choix avec affichage en Radio Boutons sur la page.
3. Sélectionner le dictionnaire désiré.
4. Ajouter une propriété personnalisée de type "form.widget.value.option" sur le Bulk afin de surcharger le choix avec un WidgetAutocomplete.
<option output="html" option_name="widget" value="WidgetAutocomplete"/>
5. Ajouter une propriété personnalisée de type "form.widget.value.option" sur le Bulk pour chacune des options du WidgetAutocomplete.
<option output="html" option_name="nom_de_l_option" value="valeur de l'option"/>

A NOTER

  • Le WidgetAutocomplete hérite du WidgetField, les attributs et options du WidgetField peuvent donc s’appliquer, à l’exception :
    • des options on_key_up_refresh, on_key_up_timeout, random_order, n_first_values, n_last_values
    • de l’attribut size (non appliqué)
  • Pour être compatible avec le WidgetAutocomplete, l’attribut field n’accepte pas les variables de type primary_key, fkey_varset, fkey_varset_ext, fkey_dico_ext, fkey_sys_dico_ext. Si une variable de ce type est attribuée au field, le widget se mettra en erreur (voir WidgetErrors).
  • Pour effectuer une recherche de type “mot commençant par”, la requête sql pour la condition à appliquer au dataquery de recherche est la suivante : “{med.nom} LIKE CONCAT({recherche_nom_medecin}, ‘%’)

Attributs

Voir la page consacrée au WidgetField. L’attribut size (non appliqué) n’est pas paramétrable pour le WidgetAutocomplete.

Options

search_dataset

Option obligatoire. Dataset utilisé pour peupler les résultats. Le widget se mettra en ereur si : l’option n’est pas renseignée, si valeur passée à l’option n’est pas une string, si le dataset n’existe pas

  • Version : >=2.26

  • Valeurs possibles : string

<option output="html" option_name="search_dataset" value="{search_dataset_value}" />

value_field

Champ du dataset spécifié via l’option search_dataset contenant la valeur à stocker. Le widget se mettra en erreur si : la valeur passée à l’option n’est pas une string ou si le field n’existe pas au sein du dataset search_dataset.

  • Version : >=2.26

  • Valeurs possibles : string

  • Valeur par défaut : id_data

<option output="html" option_name="value_field" value="id_data" />

display_field

Champ du dataset qui contient la valeur d’affichage. Ce champ est utilisé pour la valeur affichée dans le champ autocomplete et dans les titres des résultats. Si aucun champ n’est précisé, la valeur affichée sera celle contenue dans value_field. Le widget se mettra en erreur si : la valeur passée à l’option n’est pas une string ou si le field n’existe pas au sein du dataset search_dataset.

  • Version : >=2.26

  • Valeurs possibles : string

<option output="html" option_name="display_field" value="{display_field_value}" />

display_field_comp

Champ du dataset qui contient les informations complémentaires à afficher dans les résultats. Le widget se mettra en erreur si : la valeur passée à l’option n’est pas une string ou si le field n’existe pas au sein du dataset search_dataset.

  • Version : >=2.26

  • Valeurs possibles : string

<option output="html" option_name="display_field_comp" value="{display_field_comp_value}" />

search_param_name

Nom du paramètre à utiliser dans le dataquery qui retourne les résultats de recherche. Le widget se mettra en erreur si : la valeur passée à l’option n’est pas une string.

  • Version : >=2.26

  • Valeurs possibles : string

  • Valeur par défaut : search_string

<option output="html" option_name="search_param_name" value="search_string" />

min_nb_characters

Nombre de caractères à partir duquel des recherches sont lancées. Le widget se mettra en erreur si : la valeur passée à l’option ne correspond pas à un nombre ou si ce nombre est inférieur ou égal à zéro.

  • Version : >=2.26

  • Valeurs possibles : string représentant un nombre entier

  • Valeur par défaut : 3

<option output="html" option_name="min_nb_characters" value="3" />

nb_results_show

Nombre de résultats à afficher. Le widget se mettra en erreur si : la valeur passée à l’option ne correspond pas à un nombre ou si ce nombre est inférieur ou égal à zéro.

  • Version : >=2.26

  • Valeurs possibles : string

  • Valeur par défaut : 5

<option output="html" option_name="nb_results_show" value="5" />

Les options display_type, glyphicon_prefix, glyphicon_suffix, fa_prefix, fa_suffix, text_prefix, text_suffix, autocomplete, show_errors et strtoupper sont également disponibles (voir WidgetField).

Options groupées

redirect

Paramètres des liens de redirection. Le widget se mettra en erreur si : le champ correspondant au WidgetAutocomplete est nécessaire à l’enregistrement du formulaire (soit, dans le varset, <var […] mandatory=”true”/>), si une option redirect_label_n ou redirect_always_show_n a été précisée mais qu’aucun redirect_path_n correspondant n’a été précisé et si n manque à l’une des options groupées redirect.

  • Version : null

redirect_path_n

Lien de redirection. Le widget se mettra en erreur si : la valeur passée à l’option n’est pas une string.

  • Version : >=2.26

  • Valeurs possibles : string (lien complet, ex : https://epiconcept.fr, ou module/controleur/action/paramètres)

<option output="html" option_name="redirect_path_n" value="{redirect_path_n_value}" />

redirect_label_n

Libellé de la redirection. Si aucun libellé n’est précisé, ce sera l’url qui sera affichée. Le widget se mettra en erreur si : la valeur passée à l’option n’est pas une string.

  • Version : >=2.26

  • Valeurs possibles : string

<option output="html" option_name="redirect_label_n" value="{redirect_label_n_value}" />

redirect_always_show_n

Si la valeur est à true, le lien de redirection est proposé que le widget ait des résultats ou non. Si des résultats sont trouvés, le lien sera proposé en fin de liste. Le widget se mettra en erreur si : la valeur passée à l’option ne correspond pas à un booléen (true, false, 0 ou 1).

  • Version : >=2.26

  • Valeurs possibles : booléen ou string représentant un booléen

  • Valeur par défaut : false

<option output="html" option_name="redirect_always_show_n" value="false" />