Ajouter des coordonnées multiples - C&O suite

La table des Auteurs de SPIP ne permet d’indiquer qu’une seule valeurs aux champs de chaque individu, même avec des champs extras, alors qu’on a parfois besoin de pouvoir ajouter un nombre variables de valeurs [1].
Le plugin Coordonnées est conçu pour proposer l’utilisation simplifiée de plusieurs tables annexes aux AUTTEURS pour les informations habituelles (adresses, téléphones, et mails), en gérant les automatismes des liaisons.

Article publié le 23 février 2020, et actualisé en février 2020


 Rappels historiques

La table AUTEURS de SPIP est essentielle pour valider la connexion individuelle des utilisateurs et leur statut, donc leurs droits d’interventions sur le site.
Mais cette rigidité a souvent contraint les développeurs de sites à imaginer des extensions, nombreuses, jusqu’à ce qu’au début 2010 une petite équipe de core-devs construise un plugin majeur dans ce domaine : en 2020, le plugin Contacts et Organisations est désormais à sa quatrième branche...
Mais ce plugin ne propose que de rajouter des informations mono-valuées pour chaque auteur [2]. Pour des informations possiblement multivaluées, comme les divers numéros de téléphones (domicile, portable, bureau, vacances, conjoint...), a été conçu le plugin autonome Coordonnées, offrant divers types de données en occurrences multiples pour chaque auteur ; en cas de besoins non couverts, il serait facile de compléter les tables de ce plugin, decrites ci-dessous, avec des champs extras sur des types de coordonnées si besoins particuliers... sans oublier la possibilité de greffer ensuite ces positions géographées avec GIS...

 Rappels de Conception

Il peut etre intéressant d’exposer certains aspects du plugin (pas encore abordés dans la documentation de Contrib.
- Typage des liaisons
Les tables de liens des objets gérés par le plugin (`adresse`, `email` et `numero`) possèdent une colonne supplémentaire : `type`.
Ce champ permet de qualifier le lien entre une coordonnée et un objet éditorial : par exemple, une adresse liée à auteur avec un lien typé `home` signifie qu’il s’agit de son adresse personnelle.
Comme ce champ fait partie de la clé primaire, il est possible de lier plusieurs fois une coordonnée au même un objet éditorial en utilisant des types différents : ce principe est repris par [le plugin `Rôle` de matthieu Marcillaud](https://contrib.spip.net/Des-roles-...) qui explique en détail la problématique.
- Liste des types de liaisons
Les types proposés par le plugin sont les codes normalisés du [format vCard](https://fr.wikipedia.org/wiki/VCard).
- La fonction coordonnees_lister_types_coordonnees() retourne la liste complète des types disponibles pour chaque coordonnée, et les chaînes de langue.
On peut éventuellement s’en servir dans les squelettes, mais on préfèrera utiliser les filtres correspondants pour chaque type de coordonnée :
 [(#EVAL{null}|coordonnees_lister_types_adresses)]
Ce filtre permet également de récupérer la chaîne de langue d’un type en particulier :
 [(#TYPE|coordonnees_lister_types_adresses)]
Les saisies #SAISIE{type_xxx} s’en servent de ce filtre pour récupérer les données du sélecteur.
Dans le formulaire d’édition d’une coordonnée, cette saisie n’apparaît que lorsque la paramètre `associer|objet` est donné (cette saisie n’ayant pas de sens si la coordonnée n’est pas liée à un objet).
- Pipeline types_coordonnees
Le plugin fournit un pipeline spécifique pour faciliter l’usage intégré de ses éléments : par exemple, le plugin `Commandes` s’en sert pour rajouter aux adresses les 2 types `livraison` et `facturation`.
Ainsi les autres plugins peuvent compléter (ou altérer) la liste des types en se servant du pipeline `code>types_coordonnees programmé par le plugin, de la façon suivante.

  • dans paquet.xml : ajouter
    <pipeline nom="types_coordonnees" inclure="commandes_pipelines.php" />
  • dans `commandes_pipelines.php` :
    1. function commandes_types_coordonnees($liste) {
    2.                 $types_adresses = $liste['adresse'];
    3.                 if (!$types_adresses or !is_array($types_adresses)) $types_adresses = array();
    4.                 // on définit les couples types + chaînes de langue à ajouter
    5.                 $types_adresses_commandes = array(
    6.                     'livraison' => _T('commandes:type_adresse_livraison'),
    7.                     'facturation' => _T('commandes:type_adresse_facturation')
    8.                 );
    9.                 // on les rajoute à la liste des types des adresses
    10.                 $liste['adresse'] = array_merge($types_adresses, $types_adresses_commandes);
    11.                 return $liste;
    12.             }

    Télécharger

- Usage de l’ API `editer_liens` et limitations
On peut se servir de [l’API d’édition de liens](https://www.spip.net/fr_article5477.html) pour lier ponctuellement une coordonnée à un objet.
Mais celle-ci comporte (actuellement ?) une limitation : l’API ne permet de faire qu’un seul lien d’objet à objet. On ne peut pas lier 2 fois une coordonnée au même objet, avec 2 types de liaison différents.
Ainsi, avec l’essai de code suivant... :

include_spip('action/editer_liens');
            objet_associer(array('adresse'=>$id_adresse), array('commande'=>$id_commande), array('type'=>'facturation'));
            objet_associer(array('adresse'=>$id_adresse), array('commande'=>$id_commande), array('type'=>'livraison'));

Le 2ème lien ’livraison’ va écraser le premier enregistrement .

Dans ce cas, il faut procéder sans l’API, en écrivant les insertions en PHP :

            foreach(array('facturation','livraison') as $type){
                sql_insertq( 'spip_adresses_liens', array(
                    'id_adresse' => $id_adresse,
                    'objet' => 'commande',
                    'id_objet' => $id_commande,
                    'type' => $type
                    )
                );
            }

Merci de nous signaler les coquilles, imprécisions ou erreurs qui figureraient dans cette page.

[1Penser aux divers numéros de téléphone à rajouter dans l’application Contacts de votre smartphone !

[2Ajouter une seule valeur est possible, en lien bi-univoque avec chaque auteur, comme avec un Champ Extras ! Mais ce concept est d’usage limité, car il est plus pénible de gérer des informations répétitives, comme des enfants en nombre....

[3Penser aux divers numéros de téléphone à rajouter dans l’application Contacts de votre smartphone !


Liens A2A visibles seulement pour les inscrits.
Liens visibles seulement pour les inscrits.

Article publié le 23 février 2020, et actualisé en février 2020 .

Répondre à cet article