LINUX:MediaWiki - SMW - Amélioration: Personnes

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour à Sémantic MediaWiki


But

On améliore ensuite cet embryon de gestion de personnes présente à l'article sur le Prototype: Personnes.

Les zones des scripts ajoutées ou modifiées seront notées en rouge. Pour comparer, reportez-vous aux scripts de départs à l'article sur le Prototype: Personnes.


Adresse

Modèle

Voici le script:


 <includeonly>
 {| class="wikitable"
 ! Rue
 | [[Adresserue::{{{Adresserue|}}}]]
 |-
 ! N°
 | [[Numerorue::{{{Numerorue|}}}]]
 |-
 ! Code Postal
 | [[Codepostal::{{{Codepostal|}}}]]
 |-
 ! Commune
 | [[Commune::{{{Commune|}}}]]
 |-
 ! Pays
 | [[Codepays::{{{Codepays|}}}]]
 |-
 ! Liste de personnes
 | {{#ask:[[Adresselien::{{FULLPAGENAME}}]]|format=list}}
 |}
  
 [[Catégorie:PERSONNE:Adresse]]
 </includeonly>

Il n'y a qu'une modification: le mot magique "SUBPAGENAME" est remplacé par "FULLPAGENAME". C'est une conséquence de la volonté de ne pas afficher la partie espace de nom "PERSONNE:" comme nous le verrons par la suite.


Formulaire

Voici le script:


 <includeonly>
 <div id="wikiPreview" style="display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;"></div>
 {{{for template|Adresse|label=Fiche de l'adresse}}}
 {| class="formtable"
 ! Rue: 
 | {{{field|Adresserue|input type=text}}}
 |-
 ! N°: 
 | {{{field|Numerorue|input type=text}}}
 |-
 ! Code Postal: 
 | {{{field|Codepostal|input type=text}}}
 |-
 ! Commune: 
 | {{{field|Commune|input type=text}}}
 |-
 ! Pays: 
 | {{{field|Codepays|input type=dropdown}}}
 |}
 {{{end template}}}
  
 '''Remarques:'''
 {{{standard input|free text|rows=10}}}
 </includeonly>

Ici également, peu de changement. On ajoute un titre au tableau avec le paramètre "label=Fiche de l'adresse". Et on modifie le texte "Texte libre" par "Remarque".


Catégorie

On ajoute un titre pour séparer l'appel existant à la création d'une nouvelle page de la liste des pages.

On remplace cet appel à la création d'une nouvelle page "{{#default_form:Adresse}}", par la fonction "#forminput" qui nous permet de présélectionner l'espace de nom "PERSONNE".

Voici le code:


 __NOEDITSECTION__
 =Création d'une nouvelle adresse=
 {{#forminput:form=Adresse|size=65|namespace selector=PERSONNE}}
 {{#default_form:Adresse}}

Et voici l'aspect:

LINUX:Mws.categorie.adresse.4.png


Exploration

On peut explorer les adresses en allant au lien suivant: Adresses


Personne

Propriété

On a ajouté une nouvelle propriété:

  • la date de naissance que l'on nomme "Datenaissance" de type "Date"


Modèle

Voici de script:


 <includeonly>
 {| class="wikitable"
 ! Utilisateur
 | [[Nomutilisateur::{{{Nomutilisateur|}}}]]
 |-
 ! Nom de famille
 | [[Nomfamille::{{{Nomfamille|}}}]]
 |-
 ! Prénom
 | [[Prenomfamille::{{{Prenomfamille|}}}]]
 |-
 ! Date de naissance
 | {{#if: {{{Datenaissance|}}}|[[Datenaissance::{{#time: d F Y |{{{Datenaissance|}}} }}]]}}
 |-
 ! Email
 | [[Emailutilisateur::{{{Emailutilisateur|}}}]]
 |-
 ! GSM
 | [[GSM::{{{GSM|}}}]]
 |-
 ! Téléphone
 | [[Telephoneutilisateur::{{{Telephoneutilisateur|}}}]]
 |-
 ! Adresse
 | {{#arraymap:{{{Adresselien|}}}|,|xx1|{{#formredlink:target=PERSONNE:xx1|form=Adresse|existing page link text=xx1|link text=xx1}} {{#set:Adresselien=PERSONNE:xx1}} }}
 |}
 {{#arraydefine:Listelien | {{{Adresselien}}} }}
 {{
  #loop: i | 0 | {{ #arraysize:Listelien }} | 
  {{ #arraydefine: Adrl | {{ #arrayindex:Listelien | {{ #var:i }} }} }}
  {{ #ask:[[category:PERSONNE:Adresse]]
  [[PERSONNE:{{#arrayprint:Adrl}}]]
  |?Adresserue=Rue|?Numerorue=N°|?Codepostal=CP|?Commune|?Codepays=Pays
  |mainlabel=Page
  |limit=2|format=table }}
 }}
  
 [[Catégorie:PERSONNE:Personne]]
 </includeonly>

Nous avons Trois grosses modifications.


En premier, on ajoute l'affichage de la date de naissance:


 |-
 ! Date de naissance
 | {{#if: {{{Datenaissance|}}}|[[Datenaissance::{{#time: d F Y |{{{Datenaissance|}}} }}]]}}

Il se fait que par défaut l'affichage se fait sous la forme <année/mois/jour> mais nous voulons avoir une représentation inverse "jour mois année>. Nous utilisons pour cela la fonction "#time" avec le format "d F Y". Vient alors un autre problème; s'il n'y a pas de date, c'est la date du jour qui apparaît or nous voulons une zone vide. Pour y arriver, nous allons utiliser la fonction "#if" qui teste s'il y a une valeur dans la zone "Datenaissance" pour l'afficher.


La seconde se situe au niveau de l'adresse qui peut être multiple. Nous avions le code suivant:


 ! Adresse
 | {{#arraymap:{{{Adresselien|}}}|,|x|[[Adresselien::x]]}}

On le remplace par:


 ! Adresse
 | {{#arraymap:{{{Adresselien|}}}|
     ,|
     xx1|
     {{#formredlink:
       target=PERSONNE:xx1|
       form=Adresse|
       existing page link text=xx1|
       link text=xx1
     }} 
     {{#set:Adresselien=PERSONNE:xx1}}
   }}

En premier lieu, on modifie la variable de transit "x" par "xx1". Dans certains cas, j'ai été confronté à une absence de réaction de la commande car cette variable n'était pas identifiante; en la remplaçant par "xx1", on a moins de chance de tomber sur la même séquence.

Lors de l'encodage, on désire ne donner que le nom de l'adresse sans son espace de nom "PERSONNE". Et on désire utiliser un lien vers le formulaire "Adresse". On va les forcer.


L'action sera divisée en deux étapes.

Quand l'adresse n'est pas trouvée, elle s'affiche en rouge et en cliquant sur ce lien, une page de création s'ouvre mais pas sous forme de formulaire. Pour cette raison nous utilisons la fonction "#formredlink". Voyez l'URL https://www.mediawiki.org/wiki/Extension:Page_Forms/Linking_to_forms/fr

Voici les paramètres utilisés:

  • "target": Le nom de la page de l'adresse à créer. Devant la variable de transfert "xx1", on force l'espace de nom "PERSONNE".
  • "form:" On va utiliser le formulaire "Adresse"
  • "existing page link text": Si l'adresse existe, on l'affiche de façon classique sans l'espace de nom "PERSONNE".
  • "link text": Si l'adresse n'existe pas, on l'affiche de façon classique sans l'espace de nom "PERSONNE" mais en rouge.

Enfin on attribue à la propriété "Adresselien" la valeur complète "PERSONNE:xx1" avec la fonction "#set".


On supprime la requête:


 |-
 ! 
 | {{#ask:[[Adresselien::{{SUBJECTPAGENAME}}]]|format=list}}

car elle est inutile.


Enfin on désire afficher le détail de chaque adresse sélectionnée. Cette étape est plus complexe et nous devrons utiliser trois extensions: Arrays, Loops et Variables.

Voici le script:


 {{#arraydefine:Listelien|
   {{{Adresselien}}}
 }}
 {{#loop: i|
          0|
          {{ #arraysize:Listelien }}|
   {{#arraydefine: Adrl|
     {{#arrayindex:Listelien|
       {{#var:i}}
     }} 
   }}
   {{#ask:
     [[category:PERSONNE:Adresse]]
     [[PERSONNE:{{#arrayprint:Adrl}}]]
     |?Adresserue=Rue
     |?Numerorue=N°
     |?Codepostal=CP
     |?Commune
     |?Codepays=Pays
     |mainlabel=Page
     |limit=2
     |format=table 
   }}
 }}

Les étapes sont les suivantes:

  • On convertit la chaîne d'adresse en un vecteur ou série de valeurs.
  • On passe en revue à tour de rôle chaque valeur de la série.
  • On effectue une requête de cette adresse

Le problème est l'imbrication de diverses fonctions avec leurs propres paramètres; il ne faut pas se tromper dans la séquence des doubles accolades qui s'ouvrent et se ferment. Pour cette raison, on a séparé la ligne en un grand nombre de lignes indentées. Cette partie a de fortes similitudes avec la programmation.


En début, on utilise la fonction "#arraydefine" de l'extension "Arrays". Elle convertit la chaîne "{{{Adresselien}}}" en un vecteur ou série de valeurs dans la variable "Listelien". Par défaut, le séparateur est la virgule. Voyez l'URL: https://www.mediawiki.org/wiki/Extension:Arrays/fr

Par exemple, dans l'écran ci-dessous, la zone "Adresselien" a la valeur "70, 80". Après séparation, la variable "Listelien" comportera deux valeurs: "70" et "80".


Ensuite vient l'étape de bouclage. On utilise l'extension "Loops". Voyez l'URL: https://www.mediawiki.org/wiki/Extension:Loops/fr

La fonction "#loop" a la syntaxe suivante:


 {{#loop: 
   <Nom de variable>
   | <valeur de départ>
   | <nombre de bouclage>
   | <action>
 }}

On veut boucler sur chaque valeur de la série de la variable "Listelien". Comme dans beaucoup de langage de programmation tel le C, la numérotation d'ordre des valeurs d'un vecteur débute à zéro. On va utiliser la fonction "#arraysize" de l'extension "Arrays" qui fournit le nombre de valeurs existants dans la variable "Listelien". Le résultat du bouclage se met dans la variable "i". Pour notre exemple, nous avons deux valeurs; donc on bouclera deux fois et la variable "i" vaudra "0" puis "1".

Au niveau de l'action, il y a deux étapes.

La première action est de récupérer la valeur souhaitée dans le vecteur. On utilise la fonction "#arrayindex" qui va récupérer la "i"ème valeur dans série "Listelien". Pour utiliser la variable "i", nous avons besoin de l'extension "Variables"; on utilise sa fonction "#var". On met ensuite cette valeur dans un vecteur d'une position avec la fonction "#arraydefine" déjà utilisée; le nom de cette variable est "Adrl".

Enfin la seconde action est la requête. Elle est classique. Dans la catégorie "PERSONNE:Adresse", on sélectionne la page de l'adresse récupérée dans la variable "Adrl". On a besoin de transformer cette variable en texte en utilisant la fonction "#arrayprint" que l'on fait précéder de l'espace de nom "PERSONNE".

Par exemple, lors du premier bouclage, la variable "i" vaut "0". Et la valeur ayant l'indice "0" de la variable "Listelien" est "70". Elle est rangée dans la variable "Adrl". Après transformation en texte, la partie du code "PERSONNE:{{#arrayprint:Adrl}}" devient le texte "PERSONNE:70".


Et voici un exemple de résultat:

LINUX:Mws.encodage.personne.6.png

A noter que les n° de téléphone doivent être introduits au format international.


Formulaire

Voici le script:


 <includeonly>
 <div id="wikiPreview" style="display: none; padding-bottom: 25px; margin-bottom: 25px; border-bottom: 1px solid #AAAAAA;"></div>
 {{{for template|Personne|label=Fiche de la personne}}}
 {| class="formtable"
 ! Utilisateur: 
 | {{{field|Nomutilisateur|unique|mandatory|input type=text}}}
 |-
 ! Nom de famille: 
 | {{{field|Nomfamille|input type=text}}}
 |-
 ! Prénom: 
 | {{{field|Prenomfamille|input type=text}}}
 |-
 ! Date de naissance: 
 | {{{field|Datenaissance|input type=date}}}
 |-
 ! Email: 
 | {{{field|Emailutilisateur|input type=text}}}
 |-
 ! GSM: 
 | {{{field|GSM|input type=text}}}
 |-
 ! Téléphone: 
 | {{{field|Telephoneutilisateur|input type=text}}}
 |-
 ! Adresse: 
 | {{{field|Adresselien|input type=tokens}}}
 |}
 {{{end template}}}
  
 * {{#queryformlink:form=RequeteAdresse|link text=Recherche d'adresse|new windows}}
  
 '''Remarques:'''
 {{{standard input|free text|rows=10}}}
 </includeonly>

Divers changements:

  • On ajoute un titre au tableau avec le paramètre "label=Fiche de la personne".
  • On impose que le nom d'utilisateur soit unique ("unique")
  • On impose que le nom d'utilisateur soit nécessaire ("mandatory")
  • On ajoute l'encodage de la date de naissance; on impose le type d'entrée "date" qui permet de séparer l'encodage en trois zones: jour, mois et année

 | {{{field|Datenaissance|input type=date}}}

  • On ajoute un lien en la fin du script, nous avons le texte suivant:

 * {{#queryformlink:form=RequeteAdresse|
     link text=Recherche d'adresse|
     new windows
   }}

Dans l'article Requête: Personnes, nous avions créé un écran permettant de rechercher une adresse donnée. On y fait appel en ouvrant une autre fenêtre ("new windows"). C'est une petite facilité afin de remplir la dernière zone du tableau: "Adresse". Au lieu de "new windows", on peut utiliser l'option "popup".

  • Et plus loin, on modifie le texte "Texte libre" par "Remarque".


Voici un exemple de résultat:

LINUX:Mws.encodage.personne.7.png


Catégorie

On ajoute un titre pour séparer l'appel existant à la création d'une nouvelle page de la liste des pages.

On remplace cet appel à la création d'une nouvelle page "{{#default_form:Personne}}", par la fonction "#forminput" qui nous permet de présélectionner l'espace de nom "PERSONNE".

Voici le code:


 __NOEDITSECTION__
 =Création d'une nouvelle personne=
 {{#forminput:form=Personne|size=65|namespace selector=PERSONNE}}
 {{#default_form:Personne}}

Et voici l'aspect:

LINUX:Mws.categorie.personne.4.png


Exploration

On peut explorer les personnes en allant au lien suivant: Personnes




retour à Sémantic MediaWiki