Procédure pour exploiter une relation 1-N dans des formulaires.

Edit me

Introduction

Cet article vise à expliquer comment exploiter l’interface des relations entre varsets d’Epicraft pour créer une relation de type un 1-N dans une application Voozanoo 4 via du XML.

Dans cet article, tous les dataqueries sont saisis en tant que ressources XML. Un article sur le même sujet mais utilisant l’interface des sources de données pour la création des dataqueries existe ici.

Pré-requis

Voici les prérequis :

  • Un projet dans EpiCraft associé à un projet Voozanoo 4.
  • Dans ce projet :
    • Une page Médecin associée au varset docteur.
    • Une page Patient associée au varset patient.

Objectif

L’objectif est de créer une relation 1-N entre docteur et patient (un médecin a plusieur patients) et de l’exploiter avec :

  • Sur la page Médecin :
    • un listing des patients du médecin ;
    • un bouton pour ajouter un patient.
  • Sur la page Patient :
    • l’affichage de certains champ du médecin.
    • un bouton pour aller vers le médecin.

Schéma cible Médecin-Patients

Etape 1 : Créer la relation dans EpiCraft

Créer la relation dans EpiCraft via l’interface dédiée puis publier les actions :

Relation Médecin-Patients dans EpiCraft

Juste pour information, ceci automatiquement crée une nouvelle variable dans le varset patient :

<var uid="6" id="id_generaliste" type="fkey_varset" default_label="Médecin Traitant" editor_relation_id="viiuqxwhik1542036337667">
  <fkey_varset varset_name="doctor"/>
</var>

Etape 2 : Exploiter la relation dans les formulaires

Etape 2.1 : Afficher un listing des patients sur la page Médecin

Créer un dataquery pour récupérer la liste des patients d’un médecin

Premièrement, créer un dataquery sur la page médecin pour récupérer la liste des patients d’un médecin (à l’aide d’une propriété personnalisée form.dataquery) :

<dataquery id="patients" table_name="{pj}_patient_data" varset_name="patient" table_alias="pat" begin="0" range="10" mode="r">
  
  <!-- Les colonnes que l'on souhaite afficher -->
  <column_simple field_name="id_data" table_name="pat"/>
  <column_simple field_name="trigramme" table_name="pat"/>
  <column_simple field_name="sexe" table_name="pat"/>
  <column_simple field_name="ddn" table_name="pat"/>

  <!-- La condition pour n'avoir que les patients du médecin courant -->
  <condition sql="{id_generaliste_from_patient}={id_data_from_doctor}">
    <field field_name="id_generaliste" table_name="pat" alias="id_generaliste_from_patient"/>
    <variable alias="id_data_from_doctor" default="NULL">
      <entry type="dataset" name="doctor" field="id_data" row="current" />
    </variable>
  </condition>
  
  <!-- Facultatif : un tri des résultats par date de création -->
  <order_by sql="{pat.sys_creation_date} DESC">
    <field field_name="sys_creation_date" table_name="pat" alias="pat.sys_creation_date" />
  </order_by>
  
</dataquery>

Ajouter un widget Table pour afficher les résultats obtenus

Ensuite, ajouter un widget Table pour afficher les résultats obtenus (à l’aide d’un bulk form.widget):

<table dataset="patients">
  <options>
    <option output="html" option_name="edit_url" value="form/frame/get/sid/gddpsaqnmb1542032980270/id_data/{id_data}"/>
    <option output="html" option_name="save_before_edit" value="true"/>
    <option output="html" option_name="enable_deletion" value="true"/>
  </options>
  <columns>
    <column field="trigramme" />
    <column field="sexe"/>
    <column field="ddn" />
  </columns>
</table>

<paginator dataset="patients"/>

Ici, la valeur de paramètre sid doit être celui du formulaire patients (la page de destination).

Etape 2.2 : Afficher un bouton “Ajouter un patient” sur la page Médecin

Créer le bouton

Premièrement, créer un bouton à l’aide d’un bulk dans EpiCraft :

<button label="Ajouter un patient" action="save" class="btn-primary pull-right">
  <redirection module="form" ctrl="frame" action="get">
    <params>
      <dataset dataset_name="doctor" field="id_data" alias="id_data_from_doctor"/>
      <value alias="sid">gddpsaqnmb1542032980270</value>
    </params>
  </redirection>
</button>

Ici, la valeur de paramètre sid doit encore être celui du formulaire Patient (la page de destination).

On note que l’on passe un id_data_from_doctor en paramètre pour qu’il soit utilisé dans la page Patient.

Récupérer le paramètre passé pour lier la future fiche patient à son médecin

Deuxièmement, récupérer le paramètre passé pour lier la future fiche patient à son médecin :

D’abord avec une propriété personnalisée form.dataquery.main.column_simple sur la page patient :

<column_simple field_name="id_generaliste" table_name="main"/>

Ensuite avec un propriété personnalisée form.dataquery.main.variable toujours sur la page patient:

<variable default="null" target_column="id_generaliste">
  <entry name="id_data_from_doctor" type="param"/>
</variable>

Ceci va alimenter automatiquement la colonne patient.id_generaliste avec le paramètre envoyé par le bouton.

Etape 2.3 : Afficher des champs du médecin sur la page Patient

Créer un dataquery pour récupérer les champs du médecin

Premièrement, il faut créer un dataquery pour récupérer les informations sur le médecin sur la page patient :

<dataquery id="generaliste" table_name="{pj}_doctor_data" varset_name="doctor" table_alias="doc" begin="0" range="1" mode="r">
  
  <!-- Les colonnes que l'on souhaite afficher -->
  <column_simple field_name="id_data" table_name="doc"/>
  <column_simple field_name="nom" table_name="doc"/>
  <column_simple field_name="prenom" table_name="doc"/>

  <!-- La condition pour n'avoir que le médecin du patient courant -->
  <condition sql="{id_data_from_doctor}={id_generaliste_from_patient}">
    <field field_name="id_data" table_name="doc" alias="id_data_from_doctor"/>
    <variable alias="id_generaliste_from_patient" default="NULL">
      <entry type="param" name="id_data_from_doctor"/>
      <entry type="dataset" name="patient" field="id_generaliste" row="current" />
    </variable>
  </condition>
  
</dataquery>

On note ici que la variable id_generaliste_from_patient peut provenir de la base de données ou bien d’un paramètre.

Disposer les champs dans la page

Deuxièmement, afficher les champs du médecin à l’aide d’un bulk dans EpiCraft :

<form_row>
  <label dataset="generaliste" field="prenom" class="text-right col-md-3"/>
  <value dataset="generaliste" field="prenom" mode="r" class="text-left col-md-9"/>
</form_row>
<form_row>
  <label dataset="generaliste" field="nom" class="text-right col-md-3"/>
  <value dataset="generaliste" field="nom" mode="r" class="text-left col-md-9"/>
</form_row>

Etape 2.4 : Afficher un bouton vers le médecin sur la page Patient

Ici, on suppose que le dataquery créé à l’étape 2.3 existe déjà (on a besoin de son id_data).

Il suffit alors de créer un bouton à l’aide d’un bulk :

<button label="Vers la fiche médecin" action="save" class="btn-primary pull-right">
  <redirection module="form" ctrl="frame" action="get">
    <params>
      <dataset dataset_name="generaliste" field="id_data" alias="id_data"/>
      <value alias="sid">zjyavujfrx1542035295204</value>
    </params>
  </redirection>
</button>

Ici, la valeur de paramètre sid doit encore être celui du formulaire Médecin (la page de destination).

On note que l’on passe un id_data en paramètre pour arriver sur le bon médecin.