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

  • 2
    David Mich

    Bonjour, je trouve ce plugin super, il va me faire gagner un maximum de temps. Mais je rencontre quelques difficultés pour le peuplement de ma base au moment de la création de mon plugin.

    En effet, J’aimerais pouvoir peupler les bases créées au moment de l’installation du plugin avec des données (comme suggéré dans la vidéo, avec déjà 10 chats dans la base au moment de l’installation).
    J’ai trouvé dans le fichier /base/importer_spip_eist_sc_competences.php
    * include_spip(’base/importer_spip_eist_sc_competences’) ;
    * $maj[’create’][] = array(’importer_spip_eist_sc_competences’) ;

    La solution semble être là, sous mon nez mais je cale ....

    • David Mich

      Bonjour, je me répond puisque j’ai trouvé le truc ...

      Il fallait que je mette le code :
      include_spip(’base/importer_eist_sc_competences’) ;
      $maj[’create’][] = array(’importer_eist_sc_competences’) ;

      dans « Compléter $maj dans la fonction upgrade() » de la partie administration du plugin.

      J’en ai profité aussi pour changer le préfixe de la table dans le fichier puisque j’ai choisi comme préfixe de table pour spip « eist_ » et non le « spip_ » par défaut.

      Cela va me poser d’ailleurs des problèmes à venir car ce plugins est destiné à être diffusé pour les sites d’établissements scolaires et évidemment ils n’ont pas choisi « eist » comme préfixe. Je sais modifier le préfixe de la base spip, des tables pour remettre le préfixe par défaut « _spip » mais je n’ai pas réussi à intégrer le préfixe en cours dans la procédure d’installation du plugin. Résultat : si un webmaster souhaite utiliser mon plugin alors qu’il n’a pas choisi le préfixe de table par défaut, il ne peourra pas utiliser mon plugin conçu avec la fabrique. J’ai bien essayer de récupérer le préfixe ($prefix, etc ...) mais je cale.

    • Non non, laisse le nom de ta table avec ’spip_....’, c’est SPIP qui s’occupera ensuite de gérer le bon nommage par rapport à ton préfixe ensuite (lors des appels aux fonctions sql_*().

    Répondre à ce message

  • 4
    peetdu

    Avec SPIP 3.0.8 et la Fabrique 1.18.1 Je viens de créer un objet « Stages » et j’ai posé dans la partie publique le formulaire correspondant :

    #FORMULAIRE_EDITER_PROJET

    Tout marche bien sauf que à la validation de l’objet je voudrais récupérer id_stage mais il reste à 0.

    [id_stage] => 0

    J’ai essayé mon plugin sur 3 serveurs différents et j’ai toujours le même résultat.

    Qu’est ce que j’ai pu oublier ?

    • Aucune idée. Mais je ne comprends pas bien ce que tu veux faire non plus.

    • peetdu

      suite à la validation du formulaire, je voudrais donner la possibilité de joindre un document au stage enregistré.

      Pour cela j’utilise

      [(#ENV**{message_ok}|oui)
         #FORMULAIRE_JOINDRE_DOCUMENT{new,#ID_STAGE, stage}
      ]

      A la validation du formulaire, je récupère bien toutes les valeurs enregistrées en base de données sauf id_stage.

    • Ah, bah, si tu as (ou calcule) un id_stage dans le traiter() de ton formulaire, tu peux le faire renvoyer via set_request(’id_stage’, $id_stage) ; (dans le traiter), en déclarant également dans le charger() que ’id_stage’ doit être récupéré. Par exemple avec $valeurs[’id_stage’] = 0 ; (au chargement).

      Donc, en gros, à vue de nez un peu brouillon, ça ferait peut être un truc comme ça :

      function formulaire_xx_charger_dist() {
         // ...
         $valeurs['id_stage'] = 0;
         return $valeurs;
      }

      et

      function formulaire_xx_traiter_dist() {
         // ...
         $id_stage = ...;
         set_request('id_stage', $id_stage);
         return $res;
      }
    • peetdu

      Ok. Ça marche avec

      function formulaire_xx_charger_dist() {
         // ...
         $valeurs['id_stage'] = _request('id_stage');
         return $valeurs;
      }

      et

      function formulaire_xx_traiter_dist() {
             $id_stage = _request('id_stage');
      	if ($id_stage =='') {
      		$id_stage = 'new';
      	}
      
      	$res = formulaires_editer_objet_traiter('stage',$id_stage,...);
      
      	if (!$retour) {
      		set_request('id_stage',$res['id_stage']); 
      	}
      	return $res;

      Du coup je peux insérer la balise #FORMULAIRE_JOINDRE_DOCUMENT après validation
      du formulaire et surtout mes fichiers editer_stage.html et editer_stage.php
      sont utilisables aussi bien dans la partie publique du site que dans la partie back-office.

      Merci beaucoup (vraiment beaucoup ) !
      ps : et encore merci pour cette Fabrique qui je me rend compte sert également à faire pleins d’autre chose que des objets éditoriaux.

    Répondre à ce message

  • 2

    Salut,

    J’ai créé des objets éditoriaux avec la fabrique et j’aimerais pouvoir utiliser le forum de l’espace privé sur ceux-ci.
    Je n’ai rien trouvé dans les options de mon objet dans la fabrique, rien dans la configuration du site (comme pour les documents joints ou les mots clés), et une comparaison de squelette avec des objets pourvus du forum comme « article » ne m’a rien apporté non plus.
    Si quelqu’un a une idée de la façon dont ça se passe...
    Amicalement,
    Dorch

    • Malheureusement ce n’est pas encore prévu dans le plugin forum.

      Deux possibilités :

      MM.

    • Pour la première possibilité, je vais attendre d’être un peu plus aguerri sur l’élaboration des formulaires de configuration. A priori, il faut modifier le formulaire configurer_forums_prives en s’inspirant de ce qui se trouve dans le plugin mots pour la sélection des liaisons de mot vers les objets SQL, mais là, j’ai un peu de mal à suivre...

      J’opte donc pour la deuxième solution, maintenant que je sais quel pipeline utiliser : http://programmer3.spip.net/afficher_fiche_objet

      Merci Matthieu pour ta réponse rapide et tes explications claires et précises :)

    Répondre à ce message

  • 1

    Bonjour

    J’ai créé un plugin mais je veux modifier par des styles CSS. Comme je peux faire ?

    Meci

    • peetdu

      Tu veux modifier la partie publique ou privée ?

    Répondre à ce message

  • 3

    Bonjour
    le formulaire d’ajout de documents n’apparaît sur la page d’édition que lors de la création d’un nouvel objet (?exec=objet_edit&new=oui).
    Si on modifie l’objet, plus de formulaire (?exec=objet_edit&id_objet=x)
    (j’ai déjà eu ce problème sous spip 2 suite à une maj de Médiatheque)

    Quelque chose à faire ? d’autres personnes rencontrent le même problème ?

    ma config : SPIP 3.0.5 (Medias 2.7.34) Fabrique 1.18

    Dans l’attente de vous lire
    Bien cordialement

    Répondre à ce message

  • 2
    Edouard

    Serait-il possible qu’il y ai une limitation de caractères ?

    J’ai des problèmes pour changer le statut d’un objet si j’appel la table « realisations » mais pas si je les appels « projets ».

    Idem avec « publications » qui fonctionnent lorsque je l’appelle « publi »

    • Edouard

      c’est un vrai bug. ça me fait exactement la même chose avec un objet « partenaire »

      les tables sont identiques en terme de configuration. les mêmes fichiers sont créés etc...

    • Normalement non, vu qu’on a créé l’autre jour un « spip_projets_categories » bien plus long, sans problème. En tout cas si limitation il y a, ça ne vient pas de la fabrique en elle-meme.

    Répondre à ce message

  • Bonjour,
    merci infiniment pour ce plugin
    je tente de créer un plugin de gestion de références bibliographiques
    une fois le plugin créé, en validant le formulaire de création d’une entrée de ce nouvel objet, j’obtiens

    Erreur SQL 1146
    Table ’glostran.glostran_refs’ doesn’t exist
    SELECT * FROM glostran_refs LIMIT 1

    et

    Erreur SQL 1146
    Table ’glostran.glostran_glostran_refs’ doesn’t exist
    SELECT * FROM spip_glostran_refs WHERE id_glostran_ref=0

    et je ne sais comment agir.
    je ne connais pas les bases SQL suffisamment pour pouvoir intervenir.
    merci de votre aide,
    E

    mac OS 10.8.2, spip 0.0.5, LaFabrique 1.18, Saisies 1.3

    Répondre à ce message

  • Bonjour,
    je suis en train d’essayer « la fabrique » en suivant votre vidéo.

    je suis pas à pas vos indications (n’étant pas un spécialiste)- je tente désespérément de mettre le logo et j’obtiens le message suivant :

    « La sauvegarde de ../plugins/fabrique_auto/felins 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 insuffisants ce répertoire source pour le serveur. »

    je ne comprend pas
    l’image est bien importée mais les dossiers et les images au formats .png ne sont pas crées.
    et précédemment la création de fichier et dossier (felin, lang, fabrique_felins.php...) c’est bien passé

    pouvez-vous m’aider ?

    Répondre à ce message

  • 4

    Bonsoir,

    Je viens de commencer un plugin avec la Fabrique. Tout fonctionne bien, sauf une chose : j’utilise 2 champs date « date_prise_fonction » et « date_validite ». Les deux champs dates sont affichés dans le formulaire grace au widget « jquery.ui.datepicker ».

    Lors de la validation du formulaire, j’ai cette erreur :

    Une erreur technique a empêché l’enregistrement correct du champ ’date_prise_fonction’,’date_validite’.

    et voici le contenu de modifier.log (pareil pour spip.log)

    Sep 18 21:25:46 127.0.0.1 (pid 5680) :Pri:CRITIQUE : Erreur enregistrement en base offre/1 champs :array (
    ’date_prise_fonction’ =>
    array (
    ’post’ => ’14/01/1980’,
    ’save’ => ’0000-00-00’,
    ),
    ’date_validite’ =>
    array (
    ’post’ => ’21/03/1990’,
    ’save’ => ’0000-00-00’,
    ),
    )

    L’enregistrement est cependant bien créé, mais les champs date restent à la valeur « 0000-00-00 ». Jje ne sais pas du tout où intervenir.
    Une aide serait la bienvenue.

    D’avance, merci

    • J’ai le même problème : en sql, mon champ est de type « date » (aaaa-mm-jj) alors que la saisie « date » retourne un « datetime » (aaaa-mm-jj hh:mm:ss).

      Une première solution est de modifier la définition sql du champ pour le passer en datetime.

      Une autre solution rapide est de modifier la saisie « date » en « date_jour_mois_annee ». Dans ce cas, on a plus le « picker » de date mais les données s’enregistrent bien.

      Une troisième serait de modifier les fonctions vérifier et traiter pour qu’elles convertissent la date dans le bon format. Mais je ne l’ai pas encore mise en œuvre.

    • Voilà, personnellement, j’ai :

      -  modifié la définition SQL de mon champ date en :
      datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
      dans mon_plugin/base/mon_objet.php
      function items_declarer_tables_objets_sql.

      -  désinstallé et réinstallé le plugin (mais je n’avais pas de contenu hormis des tests, donc, dans le cas contraire, il vaut mieux modifier la définition du champ avec phpMyAdmin, et simplement désactiver/réactiver le plugin sans désinstaller, sans quoi, on perd le contenu de la table).

      -  laissé la saisie de type « date » dans mon formulaire : [(#SAISIE{date,...

      -  ajouté deux lignes dans la fonction « vérifier » de ce formulaire :
      mon_plugin/formulaires/editer_mon_objet.php

      function formulaires_editer_mon_objet_verifier_dist($id_mon_objet='new', $id_rubrique=0, $retour='', $associer_objet='', $lier_trad=0, $config_fonc='', $row=array(), $hidden=''){
      	include_spip('prive/formulaires/dater');
      	$date_edition = dater_recuperer_date_saisie(_request('date_edition'));
      	set_request('date_edition',sql_format_date($date_edition[0], $date_edition[1], $date_edition[2], '00', '00'));
      	return formulaires_editer_objet_verifier('mon_objet',$id_mon_objet, array('titre', 'date_edition'));
      }

      Donc, avant d’utiliser la fonction standard formulaires_editer_objet_verifier, je récupère la date saisie par l’utilisateur grâce à une fonction trouvée dans prive/formulaires/dater puis je la formate en sql grâce à sql_format_date et je la réinjecte parmi les données renvoyées par le formulaire avec set_request.

      À terme, je pense qu’il y a moyen :
      -  dans le plugin Saisies, d’améliorer la saisie « date » en lui ajoutant une option « format » qui modifie, en javascript, la saisie de l’utilisateur pour la conformer au format attendu (prive/formulaires/dater semble le faire, de même que la saisie date_jour_mois_annee d’une certaine manière) ;
      -  dans le core de spip, la fonction formulaires_editer_objet_verifier et/ou formulaires_editer_objet_traiter devrait aussi pouvoir formater une date conformément à la définition de l’objet (date ou datetime). Je crois que la fonction objet_instituer le fait pour le champ « date » standard dans ecrire/action/editer_objet.

      Une nième piste théorique par rapport à ce problème est de passer par le pipeline pre_insertion. Le plugin pourrait sans doute utiliser ce pipeline pour reformater la date avant son injection dans la base.

      Bon, je cause, je cause, mais je suis incapable de mettre tout ça en oeuvre :-)

    • La réponse est dans ce forum. à la date du 27 avril.

      @Aurélie : à ma connaissance le pipeline pre_insertion ne fonction qu’avec des champs indéxés.

    Répondre à ce message

  • 2
    Christian

    Bonjour,

    j’ai utilisé la fabrique pour créer un nouvel objet éditorial dont je rêvais depuis longtemps ! Génial ! La je viens de rencontrer un petit hic - dans mes champs texte j’affiche bien la barre d’outils SPIP qui se mettent comme il faut. En revanche les raccourcis ne sont pas interprétés - j’imagine que c’est un rien du tout à rajouter quelque part... Mais quoi et où ?

    Merci pour ton aide !

    Christian

    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