La Fabrique

La Fabrique est un outil pour créer des plugins, essentiel dans la phase de développement d’un site SPIP. La Fabrique est capable de générer le code source minimal d’un plugin pour SPIP 3 (elle accélère donc le démarrage d’un plugin) et peut s’occuper également de construire un plugin fonctionnel gérant un ou plusieurs objets éditoriaux et leurs liaisons (et là, elle devient formidable !). La base du plugin construit, il ne vous reste plus qu’à l’adapter à vos désirs les plus créatifs.

La Fabrique est un outil de construction de plugin spécialement orientée pour la gestion d’objets éditoriaux. Pour ceux qui ont connu le plugin « Chat » ou « Chat2 », sachez que la Fabrique sait gérer tout ce qui est présent dans ce tutoriel / plugin, et même au-delà, bien au-delà.

N’allez pas trop vite !

Cette note est aussi présente lors de l’installation du plugin, mais redisons le encore :

  • la Fabrique crée un code fonctionnel mais qui ne répondra peut être pas à 100% de vos attentes. La Fabrique ne peut pas tout faire. À vous d’adapter ensuite le code généré.
  • un plugin est très vite fait grâce à la Fabrique. Mais attention : le code n’est qu’une partie d’un plugin. Si vous voulez que votre plugin perdure dans le temps, il faut qu’il soit utile, partagé, documenté, traduit, il faut assister les utilisateurs, et maintenir son code avec les évolutions de SPIP et c’est tout cela aussi un plugin !
  • la Zone de SPIP permet de collaborer sur les plugins. Essayez au maximum de ne pas créer des plugins existant déjà, pour éviter des doublons qui peuvent disperser d’autant les énergies pour toutes les tâches citées au point précédent.

Pré-requis

Pour faire fonctionner la Fabrique il faut :

  • PHP >= 5.3 (il est possible que 5.2 fonctionne aussi)
  • SPIP 3.0-RC minimum
  • Un navigateur récent (testé avec FF11 et Chrome 18.0)
  • Saisies >= 0.25
  • Et peut être un système Unix/Linux pour son serveur (appel de exec('diff') en PHP) [1]

Optionnellement mais conseillé :

Démonstration vidéo

Dans la vidéo suivante, vous verrez une présentation de la Fabrique impliquant la construction d’un plugin « Félins » dans lequel nous créons 1 objet éditorial « Chats ».
Cette vidéo est aussi disponible en meilleure qualité sur medias.spip.net

Présentation de la Fabrique en vidéo

Accéder à la fabrique

Depuis SPIP 3.1, La fabrique est accessible dans le menu de développement (il faut activer l’option de vos préférences personnelles pour voir ce menu)

Documentation

En attendant une documentation plus riche ici, vous pouvez lire ces articles :

Capture d’écran

La Fabrique, version 1.13.3
Interface d’accueil de la Fabrique avec un objet éditorial « Chats » de renseigné dans un plugin nommé « Félins »

À tester

« La Fabrique » doit être testée dans différents environnements. Vous êtes donc invités à explorer cet outil développé avec git sur la Zone [2]

Limitation connue

Actuellement (version 1.16.3), à partir d’un certain nombre d’objets et de champs (environ 10 objets * 8 champs ici), le formulaire devient naturellement inopérant à cause d’une limitation voulue de PHP : max_input_vars, par défaut à 1000 dans php.ini.
Pour contourner, il faut modifier php.ini pour tolérer plus de champs (5000) par exemple.

Attention

Depuis la version 2.0.0, le menu de la fabrique se trouve dans celui de Développement. Celui-ci est activable depuis l’espace préférence de l’utilisateur.

Notes

[1À faire vérifier par quelqu’un ayant un serveur local sous Windows

Discussion

137 discussions

  • Bonjour,
    si c’est pas encore fait, je confirme que dans un environnement windows 7 pro 64bits, avec wampserver 3.1.9 (apache 2.4.33, php 5.6.35 à 7.2.4, MySQL 5.7.21, spip 3.2.5) la fabrique (2.3.15) bloque sur la génération des fichiers avec les messages suivant
    -  si le dossier /plugins/fabrique_auto/ est présent : La sauvegarde de ../plugins/fabrique_auto/alloc n’a pu être réalisée. Le plugin par précaution n’a pas été régénéré. La cause probable provient de droits insufisants ce répertoire source pour le serveur. (avec une faute « insuffisants » dans la chaîne de langue)
    -  si le dossier est absent : vérifier les droits d’écriture
    Le système a rencontré une erreur lors de l’écriture du fichier tmp/cache/fabrique/alloc /.plat. Veuillez, en tant qu’administrateur du site, vérifier les droits d’écriture sur le répertoire ecrire/tmp/cache/fabrique/alloc .
    La même chose dans un environnement Unix/Linux y a pas de soucis (sauf la faute d’orthographe ;)
    cordialement

    Répondre à ce message

  • Callaghan

    Salut,

    Une petite anomalie sous spip 3.2 Factory (2.3.15)
    Je crée un objet blob simple sans liaison directe, mais avec une liaison indirecte
    sur des articles

    Lors de l’édition du premier objet, nous avons une erreur de compilation :
    Argument manquant dans la balise INFO_
    ../plugins/fabrique_auto/blobings/prive/squelettes/contenu/blob_edit.html

    01 [(#ID_BLOB|oui)
    
    02     [(#AUTORISER{modifier,blob,#ID_BLOB}|sinon_interdire_acces)]
    03     [(#SET{id_parent,#INFO_{blob,#ID_BLOB}})]
    04 ]

    Mauvaise utilisation ?

    Merci

    Répondre à ce message

  • 1

    Bonjour,
    je n’arrive pas à effectuer ce correctif :

    Vous pouvez sur la vue de votre objet, lister les objets (sélectionnés au dessus) qui lui sont liés. Note : il est possible que ces listes ne fonctionnent pas parfaitement, affichant l’ensemble des objets, au lieu de seulement ceux liés au votre ; il faudra alors surcharger le fichier de liste utilisé (prive/objets/liste/xxx.html) pour ajouter un critère {xxx_liens.id_xxx ?} supplémentaire.

    Pourriez-vous donner un exemple ou « xxx » en effet les fichiers sont au pluriel et le id_ au singulier...
    Voici mon code après modification la table s’appelle bien « spip_etapes_liens » avec « id_etape » :

    <BOUCLE_liste_etapes(ETAPES){id_rubrique?}{id_secteur?}{tours_liens.id_tour?}{journees_liens.id_journee?}{id_mot?}{id_auteur?}{where?}{statut?}{recherche?}{tri #ENV{par,num titre},#GET{defaut_tri}}{par titre}{pagination #ENV{nb,10}}{etapes_liens.id_etape ?}>

    Ce code provoque une erreur « Critère inconnu etapes_liens.id_etape »
    je ne comprends pas d’où vient cette erreur...
    NB : retirer l’espace devant le «  ? » ne change rien.

    • Voici un exemple ou j’avais fait cette modification et qui marche :
      ajout de rivieres_liens.id_riviere ? sinon
      a l’affichage d’une riviere on a tous les articles et non seulement les articles qui lui sont associes .

      \prive\objets\liste\articles.html

       
      	<BOUCLE_liste_art(ARTICLES){id_article?}{id_rubrique?}{id_mot?}{id_auteur?}{rivieres_liens.id_riviere?}{where?}{statut?}{recherche?}{tri #ENV{par,date}|defaut_tri_par{#GET{defaut_tri}},#GET{defaut_tri},session_liste_art}{par titre}{pagination #ENV{nb,10}}{!lang_select}>

      => et alors seuls les articles (et non tous) auxquels une riviere est associee, sont listes quand on affiche cette riviere

    Répondre à ce message

  • 7

    Merci pour cet outil vraiment pratique ! J’ai créé un nouvel objet éditorial (que j’appelle « fiches »), tout fonctionne sauf les inclusions de doc.
    Je copie/colle une inclusion de doc dans un texte (exemple : doc18, entre balises ouvrante et fermante). Dans l’espace privé, ma fiche s’affiche bien avec sa jolie image.
    Dans l’espace public, impossible par contre d’afficher cette fiche avec son image. Cela m’affiche l’inclusion « doc18 » en toute lettre.... Pourtant, je code exactement pareil que pour un objet « article » standard (sauf le nom des balises qui changent...).
    Ya un truc que j’ai pas dû suivre... Vous avez une idée ?

    • Il n’y a rien de spécial à faire. Je suppose que le nom du champ (la colonne SQL) n’est pas commune pour SPIP (pas ’texte’ ou ’descriptif’ par exemple). Dans ce cas, il faut soit utiliser [(#TRUC|propre)] pour appliquer les traitements typos au cas par cas dans les squelettes, soit déclarer un traitement typo automatiquement sur cette balise, ce qui se fait dans le pipeline ’declarer_interfaces’, avec par exemple : 

      $interface['table_des_traitements']['SLOGAN']['fiches'] = _TRAITEMENT_RACCOURCIS;

      où ’SLOGAN’ est le nom du champ, et ’fiches’ le nom de la table (sans spip_).

    • Merci beaucoup Matthieu !
      Effectivement |propre fonctionne bien. Je vais de suite me renseigner par quelle magie ce filtre opère !

    • Bonjour,
      vous écrivez :
      « , soit déclarer un traitement typo automatiquement sur cette balise, ce qui se fait dans le pipeline ’declarer_interfaces’, avec par exemple :

      $interface[’table_des_traitements’][’SLOGAN’][’fiches’] = _TRAITEMENT_RACCOURCIS ;
      où ’SLOGAN’ est le nom du champ, et ’fiches’ le nom de la table (sans spip_). »

      Où se trouve ce pipeline ’declarer_interfaces’ ?
      Cordialement

    • Il est créé et utilisé normalement tout seul par le plugin Fabrique et est présent dans base/objet.php par exemple là : https://gitlab.com/magraine/vortaro/blob/master/base/vortaro.php#L15 ; et c’est effectivement declarer_tables_interfaces, pas declarer_interfaces.

    • Merci de votre réponse.
      Suite à vos commentaires j’ai modifié mon fichier « bases/tours.php » comme suit

      function tours_declarer_tables_interfaces($interfaces) {
      
      	$interfaces['table_des_tables']['tours'] = 'tours';
      	$interfaces['table_des_tables']['journees'] = 'journees';
      	$interfaces['table_des_tables']['etapes'] = 'etapes';
      //modifications
      	$interface['table_des_traitements']['PTIDEJ']['journees'] = _TRAITEMENT_RACCOURCIS ;
      	$interface['table_des_traitements']['DEJEUNER']['journees'] = _TRAITEMENT_RACCOURCIS ;
      	$interface['table_des_traitements']['DINER']['journees'] = _TRAITEMENT_RACCOURCIS ;
      // /modifications
      	return $interfaces;
      }

      Je n’ai aucun effet...

      Cordialement

    • C’est pourtant il me semble la bonne écriture.
      (je me suis permis d’éditer ton commentaire pour colorer le code)

      Ah… je vois le problème : dans ton code, il faut utiliser $interfaces au pluriel ; c’est le nom de la variable qui arrive et repart du pipelines. Tu as modifié $interface sans s.

      Une fois ce genre de modifications faite, il faut ensuite soit repasser par la page de gestion des plugins (ecrire/ ?exec=admin_plugin) soit lancer un ?var_mode=recalcul sur une page. Mais je suppose que c’est ce qui avait été fait ; le seul problème venant de ce petit s

    • Bonjour,
      merci pour ta réponse.
      Effectivement comme cela c’est bon. J’aurais du y penser et non me contenter de recopier le le code.

    Répondre à ce message

  • 1

    Bonjour,
    près plusieurs tentatives d’installations, de réinitialisation...
    J’arrive à créer le plugin, mais lorsque que j’ai créé un objet éditorial, je n’arrive pas utiliser la commande : Pré-remplir cet objet.
    Je suis en PHP 7.2, SPIP 3.2.4
    Merci de me donner une piste pour trouver une solution...

    • l
      La console d’inspection affiche ce message :
      An invalid form control with name=’objets[0][nom]’ is not focusable.
      An invalid form control with name=’objets[0][table]’ is not focusable.

    Répondre à ce message

  • 2
    bourdeau alain

    Bonjour,
    sous ubuntu 18.04 et spip
    SPIP 3.2.1 [24285] plugin la fabrique 2.3.13
    + écran de sécurité 1.3.11 (la mise à jour vers 3.2.4 se déroule, mais l’info de version ne change pas).
    je peux créer un début de pluning, mais désque je cherche à intégrer un objet éditorial, j’ai systématiquement :

    Oups. Une erreur inattendue a empêché de soumettre le formulaire. Vous pouvez essayer à nouveau.

    et ça ’plante’ !
    je suis démuni.
    Merci bien pour votre implication Alain

    • Même erreur, dans un environnement Debian/Strecth
      Aucune erreur dans les log d’apache :-(
      Dans les log de spip, j’ai
      Pri:ERREUR : Le serveur ’_connect’ version 1 n’a pas ’showbase’

      Mais cela ne semble pas être dans le code de la fabrique...
      Sur une autre machine, très semblable (stretch aussi), la fabrique veut bien fonctionner !

      Une idée ?

    • Pour le « Le serveur ’_connect’ » ... c’est qu’il doit exister un fichier config/_connect.php compris par SPIP comme une base de données distante, mais qui ne fonctionne pas dans ton contexte. Renommes le en _connect.php.prod par exemple, ou du moins quelque chose ne terminant pas par .php :)

    Répondre à ce message

  • Bonjour,
    Après moult tentatives, ça avance mais j’ai l’erreur -voir image jointe-
    Sous UBUNTU 18.04.1
    apache 2.4.29
    php 7.2.17
    mariadb 10.3.14
    et spip tout neuf 3.2.4(24285)
    Dans la déclaration de table si je ne mets pas le nom de la base (spip2) devant le nom de la table je n’ai pas de création de table et si je mets spip2_qrcodes, j’ai bien la création de la table mais j’ai cette erreur ?
    Que faire
    J’ai par le passé, il y a plusieurs mises à jour de spip depuis, utilisé la fabrique avec bonheur, mais la ça plante.
    Merci bien Alain

    Répondre à ce message

  • Deux suggestions pour cet outil (qui est vraiment génial et je vous en remercie) : 1) pouvoir désactiver la gestion des champs par La Fabrique une fois qu’on a tout bien paramétré, de sorte que les Champs Extra ne s’affichent plus et qu’on fixe la base une fois pour toutes sans risquer de supprimer par mégarde un Champ Extra ; 2) pouvoir gérer les statuts d’auteurs supplémentaires que l’on a créé de façon personnalisée. Ce serait (pour moi) une aide sans pareille que de pouvoir voir, dans la liste des statuts à sélectionner quand le Champ Extra de type « Auteur » est configuré, tous les autres statuts — autres que les statuts prédéfinis (admin, rédacteurs et visiteurs). Je précise par ailleurs que les Champs Extra permettent de pallier une anomalie des bases SQL en version 4.7.7 qui crée un bug sur les dates (le format datetime ne permet pas de gérer un paramétrage par défaut à 0000-00-00 00:00:00 et seule l’utilisation des Champs Extras permet de résoudre ce problème ! ) Merci beaucoup.

    Répondre à ce message

  • 2

    Bonjour,

    Impossible d’utiliser un champ « checkbox ».

    Par exemple, on crée un objet éditorial avec 2 champs : Titre et Checkbox (avec 3 choix par exemple).

    Quand on crée une occurence de l’objet, pas de souci. MAIS si on coche une des checkbox, on a l’enregistrement le message « Une erreur technique a empêché l’enregistrement correct du champ XXXX ».

    Quelqu’un s’en est déjà rendu compte et a la soluce ? Ou suis je le premier ?

    Merci

    Répondre à ce message

  • 2
    Tederic Merger

    Bonjour,
    Le problème de page blanche et de non installation du plugin se pose même quand j’en ai enlevé toute création d’objet éditorial.
    A mon dernier test dans ces conditions, la log de SPIP ne me donne que des « INFO : Probleme de configuration opcache.revalidate_freq 2s ».
    J’ai vu que dans le passé, le moteur d’optimisation OpCache avait pu entrainer « chez certains hébergeurs (dont OVH) » la mauvaise installation des tables SQL des plugins.
    Je suis chez OVH, alors ne serait-ce pas à la base un pd d’OpCache ?

    • Bonjour Tederic,

      Désolé des problèmes rencontrés.
      Alors, concernant Opcache, non il n’y a pas de problème particulier avec la configuration normalement de nos jours (effectivement on avait eu quelques soucis par le passé).

      Concernant la page blanche, je t’invite à faire afficher les erreurs PHP ; quelque chose comme cela dans mes options, temporairement :

      error_reporting(E_ALL^E_NOTICE);
      ini_set ("display_errors", "On");
      define('SPIP_ERREUR_REPORT',E_ALL);

      Pendant un temps, on tolérait les champs dans les tables qui étaient des mots clés réservés à mysql (tel que ’option’), et qui pouvait empêcher une table SQL de se créer. Ces champs sont normalement bloqués aussi maintenant lors de la création par la Fabrique.

      J’espère que l’affichage d’erreur sera informatif. Ça pourrait être un timeout par exemple (le script qui prendrait plus de 30 secondes de travail)

      MM.

    • Tederic Merger

      Merci Matthieu, notamment pour les instructions de pistage des erreurs en cas de page blanche.
      Mais j’ai recommencé un plugin sous un autre nom, et avec le premier objet éditorial créé, je n’ai justement plus la page blanche, et l’installation se fait correctement ! J’ai donc bon espoir que le problème soit résolu.
      Il y avait un trait d’union dans le préfixe du premier plugin (« locs-noms »). J’espère que c’est pas ça...

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom