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 usages, 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
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
À 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 votre compte webmestre.
Discussions par date d’activité
137 discussions
Bonjour,
tout simplement exceptionnel.
Je cherche le meilleur moyen pour faire deux choses :
1/ via une table de jointure lier un objet X à un autre objet X. malheureusement dans le panneau de config « liaisons », cette possibilité n’existe pas (toutes les tables sont présentes sauf celle que l’on est en train de créer)
2/ dans une liaison (table jointure) j’aimerais ajouter un champ qui spécifie la liaison (une colonne supplémentaire en plus de id_machin, type_objet, id_objet) ?
Si vous avez une idée de départ ... merci d’avance.
par ailleurs, ce serait bien que :
1/ le code génère automatiquement un sélecteur pour un nouvel objet éditorial, sur le modèle du sélecteur saisies-auteurs
2/ quand je fais une liaison de l’objet X à l’objet Y (créé dans le même plugin), et que je souhaite faire une liaison de Y vers l’objet X (seule possibilité automatique pour que la possibilité de liaison soit présente dans chaque l’interface de chaque objet), deux tables de jointure sont créées. il y a moyend e faire avec mais c’est pas optimum.
Mais c’est vraiment terrible comme plugin !!!
Mille mercis
R. Burton
1.1)
Il me semble que j’avais amélioré ce point en permettant d’attraper un objet en cours de création. Sinon, la solution est le de : créer le premier objet, activer le plugin, revenir sur la fabrique, et continuer la création : le premier objet est alors sélectionnable car connu de SPIP.
1.2)
Il n’y a aucune API graphique pour gérer ces champs là. par contre l’API editer_liens en SPIP/php le gère. Il suffit d’ajouter le champs à la table de liaison (mais ce n’est pas à la Fabrique de gérer un cas particulier comme ça).
2.1)
La saisie auteurs du plugin saisie n’est vraiment adapté que s’il n’y a que peu d’auteurs. Je vois pas en quoi générer ce type de saisie serait bien.
2.2)
Les liaisons X -> Y et Y -> X ne sont pas les même choses. Le cas typique est :
- Attacher des mots sur des documents, ou des documents sur des mots clés. La table de liaison n’est pas la même. Par défaut dans la fabrique, si on demande de lier à autre chose, il prend la même table, et ne fais le truc que dans 1 sens, par exemple en mettant le formulaire X->Y sur l’objet X. Si tu veux la même liaison sur l’objet Y (X->Y) il faut l’ajouter à la main dans le pipeline après la construction du plugin.
Bonjour,
D’abord merci pour cette réponse rapide.
1.1 hé bien non. Je crée l’objet x, je crée le plugin, je reviens sur la fabrique,
objet x : dans l’onglet liaisons, l’objet x n’apparaît pas. (il apparaît évidemment dans les autres objets, y, z, etc.)
1.2 le seul fait d’ajouter ledit champ à la table de lien ne suffit pas à spip pour en afficher l’input dans le formulaire d’édition de liens. Mais ok, c’est pas à la Fabrique :-). je chercherai.
2.1 ok en plus mal conceptualisé de mon coté
2.2 merci du tuyau.
votre plugin est balèze ! vraiment.
RB
Pardon, j’avais mal compris 1.1
Effectivement je n’ai pas permis de lier un X dans un X. Quel est l’intérêt ? À part peut être créer des bugs ? Non, pour gérer une hierarchie (si c’est pour cela), il faut ajouter et gérer un champ « id_parent » dans la table X.
Sinon, pour le 2.1, c’est loin d’être sot de proposer en option une saisie utilisable. Juste que la saisie auteurs du plugin saisie est un sélect qui ne s’adapte pas au nombre d’élément contenu dans la table et ceci ne va pas.
Une autre idée est de faire générer des pages publiques de contenu, au format Z. Enfin ça urge pas, et ptet que des bonnes volontés voudrons améliorer la Fabrique pour le faire, maintenant que le mécanisme de construction est à peu près en place.
Bonjour,
pour 1.1
j’ai trouvé la parade via une table tierce, mieux adaptée en fait.
pour 2.1 la question des saisies. Je vais plancher pour élaborer une nouvelle saisie pour des objets susceptibles d’être très nombreux. si ça marche, je proposerai un commit sur saisies, et ce sera donc j’imagine disponible automatiquement dans fabrique.
pour toucher à La Fabrique, me faudra du temps pour démonter ce que vous avez mis si ingénieusement en place. Ce sera pour beaucoup plus tard :-)
J’ai lu vos deux articles sur Marcimat. Excellent pour conserver ses propres modifs au plugin créé via Fabrique, tout en continuant à le développer via Fabrique.
Grand merci
RB
Bonjour,
je suis dans le même cas que vous c’est à dire « dans une liaison (table jointure) j’aimerais ajouter un champ qui spécifie la liaison » (le point 1.2) et je sèche.
Voici où j’en suis :
1- dans base/mon_plugin.php, j’ai ajouté le nouveau champ
"nouveau_champ" => "VARCHAR(6) DEFAULT 'non' NOT NULL",
...et le champ est bien là dans la table de liaison.
2- dans prive/objet/liste/mon_plugin_associer.html, j’ai ajouté le champ input
...mais rien n’est enregistré dans la base de données.
J’ai également exploré l’API editer_liens, mais je ne vois pas où il serait pertinent d’ajouter la fonction objet_associer.
Avez-vous trouvé une solution ?
Bonjour,
non pas réussi ...
J’ai contourné le problème en créant un objet via La Fabrique, qui s’appelle « relation », et qui contient au moins un (chez moi plusieurs) champs de spécif de la relation.
Cet objet est liable aux objets que je veux mettre en relation.
ça complexifie un peu les boucles, mais ça marche.
Attention, les tables de jointures ne sont pas « symétriques » si deux objets peuvent être associés l’un à l’autre à partir de chacun d’entre eux, il y aura deux tables à traiter pour retourner toutes les liaisons.
Par ailleurs, la table jointure (en tous cas les boucles qui la traitent en cas de jointure automatique et l’interface privée) e permettent pas qu’une instance d’un objet soit liée à une autre instance du même objet.
Bon travail,
RB
Bonjour,
et merci pour ce retour d’expérience.
J’ai fini par trouver une solution à mon problème de qualification de la relation.
Il était assez simple : il s’agissait pour une fiche film de dire qui est le réalisateur et/ou le scénariste, sachant qu’une même personne peut avoir à son actif plusieurs films, un film peut avoir été co-écrit et co-réalisé par deux personnes différentes, etc.
Mon plugin créé un objet éditorial « Créateurs » avec le nom et la bio de la personne,et depuis la fiche film (un article SPIP), on lie le ou les créateurs en précisant si ils sont réalisateur et/ou scénariste.
1- j’ai rajouté les deux inputs correspondants dans le fichier mon_plugin/prive/objets/liste/mon_plugin_associer.html
2- j’ai créé un fichier mon_plugin_options.php dans lequel j’ai placé une surcharge de la fonction formulaires_editer_liens_traiter() (qui se trouve à l’origine dans prive /formulaires/editer_liens.php)
La surcharge consiste à faire un _request(’mon_champ’), puis à passer cette valeur dans la fonction objet_associer du paragraphe « if ($ajouter’) »
Todo : j’ai encore à trouver une solution si le rédacteur utilise le bouton « Créer et associer un nouveau créateur »
Un grand merci pour ce plugin qui m’à fait gagner un temps considérable
Intéressant.
Je vais sûrement faire dans les jours à venir un plugin pour permettre de gérer un peu des rôles sur les liens, et permettre à la Fabrique de créer les squelettes avec.
Je serais néanmoins intéressé pour voir comment ça rend chez toi et le code que tu as utilisé.
Enfin je n’avais pas pensé à ce bouton « créer et associer... ». Peut être dans ce cas devrait il y avoir une valeur par défaut du rôle à la création.
Je mis le code et des copies d’écran sur http://www.akilia.net/Nouvel-objet-editorial-Createurs-pour-SPIP
Pour le bouton « créer et associer... » une valeur par défaut est nécessaire mais pas suffisante. J’ai mis par défaut la valeur "non". Ainsi, à la création d’une relation, la personne n’est donc ni scénariste, ni réalisateur. Il faut alors « Retirer le créateur », le qualifier puis l’ajouter. Faut que je trouve qqc de mieux !
autre todo : rendre obligatoire la sélection d’au moins une des deux cases à cocher. Un petit jQuery fera l’affaire je pense
Je reviens sur ce point.
J’ai envoyé aujourd’hui une adaptation de la Fabrique pour gérer de façon expérimentale des « rôles » sur des tables de liaison.
Ce que génère la Fabrique nécessite alors le plugin « Roles » qui est le résultat pour SPIP 3.0 de la discussion abordée là http://thread.gmane.org/gmane.comp.web.spip.devel/63059 et dont une documentation est présente là http://contrib.spip.net/ecrire/?exec=article&id_article=4199
Dans le textarea prévu on peut par exemple saisir :
Le premier de la liste étant celui qui sera le rôle par défaut. Tous les rôles sont alors permis sur les objets de liaison cochés. Évidement comme toujours avec la Fabrique, le code créé est une base de travail simple que vous devrez certainement adapter ensuite à votre gré.
Autre mot, concernant l’interface, ça ressemble assez à ce qui est montré
Répondre à ce message
bonjour,
Je souhaite que seuls les auteurs (administrateurs, auteurs OU visiteurs) d’un objet donné puissent le voir côté public.
Je suppose que ça se passe dans la fonction :
mais que dois-je mettre pour vérifier que l’utilisateur connecté est auteur de l’objet ?
J’ai bien pensé au plugin accès restreint mais mon nouvel objet éditorial n’est pas dans une rubrique. y a-t-il moyen de déclarer à acces restreint qu’il y a un autre type d’objet à prendre en compte en dehors de toute rubrique ?
Il faut récupérer les liens de la table
spip_auteurs_liens
avec ton objet, et comparer avec$qui['id']
de la personne connectée.Tu peux donc jouer avec la fonction de action/editer_liens (http://www.spip.net/fr_article5477.html) : objet_trouver_liens($objets_source,$objets_lies)
Tu peux aussi regarder dans inc/autoriser, il doit y avoir des exemples également avec sql_select() peut être.
merci pour le tuyau
sur le principe je vois vaguement mais concrètement je ne sais pas comment faire.
cette fonction objet_trouver_liens($objets_source,$objets_lies) je ne vois pas comment ça marche ni où la placer.
d’avance merci pour ton aide
Répondre à ce message
Félicitations pour ce plugin !
Quel gain de temps !
Répondre à ce message
Bonjour,
soit une table avec 2 champs date : date_publication et date_echeance.
afin de pouvoir utiliser le critère age relativement à date_echeance dans une boucle, j’ai choisi
dans la fabrique : Champ SQL de date = date_echeance
(
Si j’ai bien suivi c’est ce qui fait que j’obtiens dans /base/monplugin.php :
function kaye_declarer_tables_objets_sql($tables)
...
$tables[’spip_matable’] = array(
...
’date’ => « date_publication »,
...
C’est ça ? je demande car en réalité j’ai fais la modif à posterori et je veux être certain de n’avoir rien oublié
)
Petit problème : dans l’espace privé, la page d’affichage de l’objet exec=mon_objet&id_mon_objet=x
j’obtiens un cadre DATE DE PUBLICATION EN LIGNE : XX-XX-XXXX
qui affiche la date d’écheance et non pas la date de publication
je comprend la logique du système mais ça génère quelque chose d’incohérent pour l’auteur de l’objet.
y a t-il un moyen de corriger cela ?
d’avance merci
je voulais écrire ’date’ => « date_echeance »,
Non, date gère à la fois le statut de publication ET le champ par défaut des criteres ages.
Je t’invite à utiliser les mêmes critères suivi du nom du champ que tu veux (xx dans date_xx) :
{age_echeance} {mois_echeance} etc. ou {age_relatif_echeance} {mois_relatif_echeance}, etc.
... .Répondre à ce message
Bonjour,
Très intéressant ce plugin.
Son utilisation ne me permet pas cependant de corriger un bug déjà rencontré lors de la création d’un plugin « en dur » :
- lorsque je permets l’ajout de document à un objet éditorial et que je crée un nouvel objet, j’arrive bien à « téléverser » un document sélectionné. Mais lorsque j’enregistre ce nouvel objet, le document n’est pas lié à l’objet. Dans la table documents-lien, l’id_objet est =-1...
- Si une fois l’objet crée je fais « ajouter un document », alors cela fonctionne.
Il y a donc un problème pour les nouveaux objets, que l’on ne rencontre pas pour les nouveaux articles.
Merci de votre aide
Je crois bien que tu as raison :)
oui, j’ai envoyé un message sur spip_rezo, en fait je ne sais pas trop où m’adresser pour que ce bug soit pris en compte.
Cordialement
Corrigé j’espère par http://zone.spip.org/trac/spip-zone/changeset/60873 .
chez moi le problème persiste
l’id de l’objet reste négatif
fabrique : 1.15.0 SVN [60902]
Si le problème ne peut pas être réglé alors ne serait-il pas préférable d’enlever le formulaire d’upload de la page objet_edit&new=oui ?
Bonne continuation
Veuillez m’excuser, je n’avais pas vu que la correction avait été effectuée dans le plugin medias et non la fabrique.
J’ai mis à jour medias et ça fonctionne à merveille.
merci bcp
Répondre à ce message
Encore deux questions :
Quand on a fait un plugin avec la fabrique puis modifié ce plugin à posteriori (à la main), est-il possible d’éditer à nouveau le plugin dans la fabrique sans perdre les modifs faites à la main ?
Soit plugin avec 2 objets, dans le formulaire de saisie du premier objet comment intégrer une liste déroulante de sélection des occurrences du second objet.
Pour l’instant j’édite à posteriori et ajoute une boucle dans un select, mais je ne bénéficie pas du traitement de l’erreur comme avec les autres saisies ?
Y a-t-il un moyen simple de faire un sélecteur d’objet ?
D’avance merci
PS : c’est extra la fabrique, je n’arrive pas à décrocher
1) Non.
2) Ça dépend. Entre autres du nombre d’éléments possible dans la saisie : trop, il faut un chargement ajax avec recherche par exemple, sinon, un select avec 10000 éléments, c’est pas pratique, et en plus ça rame.
Je t’invite à lire ou relire http://marcimat.magraine.net/?article361
Y est expliqué une façon de faire pour :
MM.
Répondre à ce message
Pour les rédacteurs et les admin restreints, le bouton de création d’un nouvel objet n’apparaît pas dans les outils rapides.
Voici les autorisations générées :
J’ai pensé qu’il manquait un _ entre devoirs et creer dans autoriser_devoirscreer_menu_dist, mais ça n’a rien changé.
Une solution ?
D’avance merci
(ie 8, ff 11, fabrique 1.14)
Je pense que je comprends. Ce n’est pas autoriser_devoirscreer_menu_dist, mais autoriser_devoircreer_menu_dist qu’il faut je présume. Tu peux tester ?
Corrigé par http://zone.spip.org/trac/spip-zone/changeset/60866
ça fonctionne
merci beaucoup
Répondre à ce message
Salut à tous,
Pour remonter une info qui pourra intéresser Matthieu, j’ai eu une erreur lorsque j’ai accédé pour la première fois à /ecrire/ ?exec=fabrique
Erreur :
Filtremb_strtoupper non défini
Dans le fichier : ../plugins/fabrique/formulaires/fabriquer_plugin.html
_tab_objets
Ligne : 44
Config SPIP 3.0.0-rc [19216]
En espérant que ça puisse aider au dev.
Bonne journée
Re ;-)
J’ai dorénavant cette erreur lorsque j’affiche /ecrire/ ?exec=fabrique.
Pour avoir ce message jai tenté de créer un objet éditorial après création du plugin...
Je précise que je suis bien en PHP 5.3 et base MySql
Erreur :
Fatal error : Call to undefined function mb_strtoupper() in /xxx/xxxxxxx/xxx/xxx/plugins/fabrique/fabrique_fonctions.php on line 535
Bonne appétit tout le monde !
Bah écoute, je sais pas, cette fonction est dans le module PHP « mbstring » qui est logiquement dans PHP par défaut (http://www.php.net/manual/fr/mbstring.requirements.php)
Corrigé (je suppose) par http://zone.spip.org/trac/spip-zone/changeset/60866
Merci pour ton suivi parfait ;-) Effectivement mbstring n’était pas installé par défaut sur une config « grand public ». Une fois installé tout roule.
Si ce module php est vraiment important peux-tu indiquer la necessité d’installer ce module auparavant et/ou l’indiquer dans un message d’erreur ?
Si ce module permet d’aller de l’avant ou est très important évitons de l’éviter... ;-) Je pense que ce module s’adressera à des personnes (dev ou « bidouilleurs » confirmés) qui sauront certainement l’installer ou vérifier qu’ils l’ont...
Répondre à ce message
L’arrivée de spip 3 et la perspective de devoir reprendre mon plugin kaye m’angoissait heureusement la fabrique est arrivée. Merci Matthieu Marcillaud.
J’ai un message d’erreur avec un champ date :
« Une erreur technique a empêché l’enregistrement correct du champ ’date_echeance’. »
Détails :
- Définition SQL : date NOT NULL DEFAULT ’0000-00-00’
- Type de saisie : date
- SPIP 3.0.0-rc
- La Fabrique 1.13.3
- mysql 5.1.40-0
- php 5.2.6
Une idée ?
Remarque : lorsque le message d’erreur s’affiche, on reste sur la page exec=objet_edit, pourtant les données sont postées. Le risque c’est que l’utilisateur poste x fois les données avant de s’apercevoir de quelque chose.
Grand merci et bonne continuation
Je suppose que c’est un champ que tu as ajouté toi-même dans la liste des champs créés (c’est pas un date dans « champs spéciaux » donc.
Il me semble que la saisie date ne modifie pas automatiquement ce qui est saisi pour le formater à ce qui est attendu par mysql (ie. ça envoie ’2012/12/04’ au lieu de ’2012-12-04’) ou un truc comme ça.
Tu peux essayer déjà de passer non pas un date SQL, mais un ’datetime’ avec defaut ’0000-00-00 00:00:00’ mais a mon avis cela sera pareil.
En fait, pour date, il va te falloir éditer à postériori le plugin, en utilisant le plugin « verifier » et en demandant une vérification de ce champ tout en le « normalisant ». Ça pourrait ressembler, dans ton verifier() du formulaire d’édition de l’objet à quelque chose comme ça :
Cf. une utilisation dans champs extras http://zone.spip.org/trac/spip-zone/browser/_plugins_/champs_extras/core/trunk/cextras_pipelines.php#L200
N’hésite pas à poster ici la solution que tu auras utilisé.
Et par ailleurs, tu dois pouvoir lire l’erreur SQL générée dans tmp/log/ prive_mysql.log ou prive_sqlite.log
Merci Matthieu, voici la solution que j’ai utilisée :
j’ai installé le plugin vérifier, et j’ai édité (dans mon plugin) le fichier /formulaires/editer_truc.php
Dans la fonction formulaires_editer_truc_verifier_dist
j’ai remplacé
return formulaires_editer_objet_verifier('truc',$id_truc, array('titre'));
par
Une automatisation par la fabrique ça serait super bien.
Important : la définition sql doit être de la forme datetime NOT NULL DEFAULT ’0000-00-00 00:00:00’
Autrement j’ai trouvé une autre solution (mais beaucoup moins satisfaisante) :
j’ai copié le fichier /prive/formulaires/dateur/inc-dateur.html (de spip) vers /formulaires/dateur/inc-mondateur.html (de mon plugin). J’ai été obligé de renommer car la surcharge ne fonctionne pas. Dans ce fichier j’ai changé dateFormat : ’yy-mm-dd’
J’ai ensuite édité mon fichier /formulaires/editer_truc.html en changeant le type de saisie date en input et en rajoutant la classe date
puis j’ai ajouté
[(#INCLURE{fond=formulaires/dateur/inc-mondateur})]
Ce n’est pas satisfaisant car il y a une surcharge et les utilisateurs voient la date (dans le champ de saisie) sous la forme 0000-00-00.
Merci Matthieu
PS : comment fait-on du « beau » code dans les commentaires ?
Pour du code (on a normalement des icones pour ça dans la barre d’icones au dessus du textarea, mais Cédric l’a désactivé suite à un bug sur contrib. J’ai pas réussi à reproduire, faudra que je me repenche dessus voir). Et donc, il faut insérer des :
Répondre à ce message
Easyphp 5.3.8.0
Firefox 11
Windows 7 64 bit
SPIP 3.0.0-rc [19299]
J’ai créer un répertoire fabrique_auto dans le dossier plugins/auto
J’ai voulu faire un test en faisant comme dans la vidéo dans un premier temps.
J’ai rempli description et paquet comme dans la video, puis j’ai cliquer sur « creer un plugin », j’ai eu comme message :
Warning : copy(../tmp/cache/fabrique/.backup/exports/fabrique_felins 2012-04-25 00:32:48.php) [function.copy] : failed to open stream : Invalid argument in C :\Program Files (x86)\EasyPHP-5.3.8.0\www\spipdev\plugins\auto\fabrique\v1.13.3\formulaires\fabriquer_plugin_actions.php on line 282
Le plugin a été créé avec succès dans
../tmp/cache/fabrique/felins/
Vous pouvez pour vous faciliter les tests créer un répertoire fabrique_auto accessible en écriture dans votre répertoire de plugins. Ainsi, les plugins créés seront aussitôt disponibles sur l’administration des plugins et activables.
Manifestement il y a plusieurs problèmes :
1) il y a un caractère, peut être les « :» que Windows n’aime pas dans les copies. Enfin c’est étonnant. Si tu veux essayer de trouver la source du problème n’hésite pas.
2) si tu as bien créé le répertoire fabrique_auto avec des droits d’accès suffisants pour le serveur, il n’aurait pas du le créer dans tmp/cache.
1) - même pb systématique. si je trouve, je vous dis...
2) - le dossier « fabrique_auto » est à créer dans plugins et non dans plugins/auto ;-)
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 :
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.
Suivre les commentaires : |