Saisies

Le plugin Saisies facilite le développement des formulaires, en proposant des méthodes et outils pour déclarer et vérifier les champs.

Introduction

Créer un formulaire est une tâche toujours un peu répétitive : les champs ont souvent les mêmes propriétés, le même accompagnement (message d’erreur, explication ...) et la même structure HTML. Ce plugin est un outil d’aide au développement, ayant pour but de faciliter et d’accélérer l’écriture des formulaires.

Pour cela, Saisies propose plusieurs mécanismes (balises, API PHP) pour générer et manipuler plus facilement les champs des formulaires. De cette manière, les squelettes de formulaires sont :

  • plus lisibles : il n’y a que le strict nécessaire dedans, pas de répétition ;
  • intégrés au fonctionnement CVT de SPIP, notamment pour la gestion des erreurs sur les champs ;
  • automatiquement compatibles avec les recommandations HTML/CSS de SPIP.

Dans la présente documentation, nous présentons la manière de construire un formulaire avec Saisies de la méthode la plus robuste à la méthode la moins robuste.

Les méthodes moins robustes sont présentées pour deux raisons :

  1. ce sont les méthodes les plus anciennes. On trouve encore beaucoup de code les utilisant ;
  2. il est parfois nécessaire de passer par là, pour des réglages fins.

Pour utiliser l’API complète PHP, vous devez installer ou nécessiter le plugin YAML dans votre plugin. Ce n’est pas le cas quand on utilise juste la simple balise, ce pourquoi c’est à vous de le nécessiter.

Dans la présente documentation, lorsqu’un code est entre chevrons (comme <ceci>), vous devez le remplacer par une valeur correspondant à votre projet.

Cette documentation est valable à partir de la version 4.11.0 ou du plugin.

Méthode 1 : déclarer un formulaire CVT complet en PHP

Principe

Saisies augmente l’API CVT de SPIP avec une fonction formulaires_<nomduformulaire>_saisies() afin de déclarer l’ensemble des champs d’un formulaire et leur vérification dans une unique syntaxe. Cette fonction permet également de déclarer différents réglages de formulaire, tel que :

  • le label du bouton de validation final ;
  • l’utilisation en multiétapes.

Grâce à ce mécanisme, pour les cas les plus courants, les fonctions formulaires_<nomduformulaire>_charger() et formulaires_<nomduformulaire>_verifier() deviennent facultatives. Saisies s’occupera de tout suivant votre déclaration. Seule la fonction formulaires_<nomduformulaire>_traiter() reste toujours de votre ressort.

De même, par défaut, vous n’avez plus à vous occuper du squelette. Il doit toujours être présent, avec le même nom que votre fichier PHP dans le dossier formulaires/, mais vous devez le laisser totalement vide. Saisies s’occupera de générer le HTML complet, en suivant les recommandations de structuration de SPIP.

Enfin, dans le cas particulier où vous créez un formulaire de configuration, vous n’aurez même pas à déclarer les valeurs par défaut ni le traitement. Voir l’article « Formulaire de configuration avec le plugin Saisies ».

Mise en œuvre

Il vous faut donc créer un fichier formulaires/<nomduformulaire>.html vide, ainsi qu’un fichier formulaires/<nomduformulaire>.php contenant deux fonctions :
- formulaires_<nomduformulaire>_traiter(), qui indique ce que votre formulaire doit effectuer comme traitement ; cela n’est pas du ressort du plugin Saisies ;
- formulaires_<nomduformulaire>_saisies(), pour déclarer les saisies proprement dites.

Cette dernière fonction reçoit comme arguments les mêmes arguments que la fonction _charger() du formulaire CVT, et elle doit retourner un tableau PHP contenant la liste de toutes vos saisies suivant un formalisme attendu.

formulaires_<nomduformulaire>_saisies(…) {
    $saisies = […];
    return $saisies;
}

Déclaration de l’ensemble des saisies

Chaque ligne globale du tableau renvoyé décrit une saisie.
L’ordre des éléments sera l’ordre des saisies.

$saisies = [
    […], // une saisie
    […], // une saisie
    […], // une saisie
];

Déclaration d’une saisie individuelle

Chaque saisie est elle-même décrite dans un tableau, qui prend par exemple la forme suivante :

[
    'saisie' => 'input',
    'options' => [
        'nom' => 'nom',
        'label' => 'Votre nom',
        'defaut' => 'Valeur par défaut'
    ],
];

On consultera « Référence des saisies » pour avoir l’ensemble des saisies et des options disponibles en standard.

D’autres plugins ajoutent leurs propres saisies, et vous pouvez aussi créer vos propres saisies.

Déclaration des saisies enfants

Les saisies qui acceptent des enfants (comme les fieldsets) les placent dans une clé saisies dont la valeur est un tableau ayant la même structure que le tableau global :

$un_fieldset = [
    'saisie' => 'fieldset',
    'options' => [
        'nom' => 'mon_groupe',
        'label' => 'Mon groupe de champ'
    ],
    'saisies' => [
        […], // une autre saisie
        […], // une autre saisie
        […], // etc
    ]
];

Appliquer des vérifications

Pour des vérifications simples et uniques vous pouvez en déclarer des vérifications à appliquer sur chacune de vos saisies, avec le plugin API de Vérification (qui n’est pas activé automatiquement avec le plugin saisies).

Il faut alors ajouter une clé verifier selon ce formalisme :

[
	'saisie' => 'input',
	'options' => [
		'nom' => 'slug',
		'label' => 'slug',
		'obligatoire' => 'oui',
	],
	'verifier' => [
		[
			'type' => 'taille',
			'options' => ['min' => 10]
		],
		[
			'type' => 'slug',
		],
	],
];

Permet de vérifier que nous avons affaire à un slug d’une taille minimum de 10 caractères.

Consulter « Références des vérifications » pour la liste des types de vérification livrés avec le plugin et de leurs options.

Pour les versions du plugin < 4.3.0, il n’est possible de déclarer qu’une seule vérification par saisie, sous la forme :
[
    'saisie' => 'input',
    'options' => [
        'nom' => 'nom',
        'label' => 'nom',
        'obligatoire' => 'oui',
    ],
    'verifier' => [
            
        'type' => 'entier',
        'options' => [
            'min' => 100,
            'max' => 500
        ],
    ],
];

Support du multilinguisme

Saisies supporte le multilinguisme. Ainsi, dans l’exemple ci-dessous, la chaine de langue <:cle:valeur:> sera automatiquement interprétée.

[
    'saisie' => 'input',
    'options' => [
        'nom' => 'nom',
        'label' => '<:cle:valeur:>',
        'size' => 50
    ],
];

Options globales

Il est possible de déclarer des options d’affichage globales à l’ensemble du formulaire. Elles sont alors placées dans une clé options à la racine du tableau des saisies.

$saisies = [
    'options' => [
        // Changer l'intitulé du bouton final de validation
        'texte_submit' => 'Valider c’est gagné',
        …
        '<option>' => '<valeur>' //Une autre option
    ],
    […], // une saisie
    […], // une saisie
    […], // une saisie
);
OptionUsageValeur possibleValeur par défaut
Options pour le bouton de validation
texte_submit Texte du bouton de validation Texte, passe par _T_ou_typo() <:bouton_enregistrer:>
afficher_si_submit Condition pour afficher le bouton de validation Voir « Affichage conditionnel des saisies : syntaxe des tests » null
Options pour la gestion des étapes multiples
etapes_activer Activer la gestion multi-étapes, chaque fieldset de premier niveau devient une étape True|False False
etapes_presentation Mode de présentation des étapes en haut du formulaire 'defaut'|'courante', il est possible de créer son propre mode en créant un squelette formulaires/inc-saisies-cvt-etapes-<presentation>.html defaut
etapes_suivant Texte du bouton pour aller à l’étape suivante Texte, passe par _T_ou_typo() <:bouton_suivant:>
etapes_precedent Texte du bouton pour revenir à l’étape précédente Texte, passe par _T_ou_typo() <:precedent|ucfirst:>
etapes_precedent_suivant_titrer Permet d’ajouter le titre des étapes dans les boutons « précédent » et « suivant » True|False False
etapes_ignorer_recapitulatif Permet de ne pas insérer de récapitulatif avant la validation finale True|False False
Options techniques
verifier_valeurs_acceptables Permet de s’assurer que les valeurs reçues figurent bien parmi les valeurs proposées lors de la saisie du formulaire True|False False
afficher_si_avec_post Permet que les saisies masquées par affichage conditionnel soient tout de même postées True|False False
inserer_debut Contenu arbitraire à insérer au début du formulaire, par exemple pour appeler un script Javascript Chaîne de caractères null
inserer_fin Contenu arbitraire à insérer à la fin du formulaire, par exemple pour appeler un script Javascript Chaîne de caractère null

Si un texte passe par _T_ou_typo(), cela peut être :

  • un texte directement écrit dans la langue du site ;
  • un appel à une chaîne de langue sous la forme <:fichier_de_langue:chaine:> ;
  • un texte utilisant la balise <multi> pour gérer l’internationalisation.

Pipeline

Lors du chargement des saisies déclarées via une fonction formulaires_<nom_du_formulaire>_saisies(), les saisies sont passés à un pipeline formulaire_saisies. Le tableau $flux passé à ce pipeline à la structure suivante :

-  $flux['args']['form'] : le nom du formulaire ;
-  $flux['args']['args'] : les différents arguments passés ;
-  $flux['data'] : les saisies.

Il est donc possible à un plugin de modifier dynamiquement les saisies d’un formulaire en utilisant les différentes fonctions de l’API de saisies.

Méthode 1a : déclarer un formulaire CVT en PHP, mais effectuer soi-même des vérifications

Parfois il est nécessaire d’avoir des vérifications supplémentaires sur les saisies. Pour ce faire, vous devez déclarer votre propre fonction formulaires_<nomduformulaire>_verifier().

Dans ce cas, vous ne perdrez pas le bénéfice d’une déclaration des vérifications de base dans votre tableau de saisies : celles-ci sont alors automatiquement effectuées après vos propres vérifications.

Toutefois, il est parfois nécessaire de faire en sorte que les vérifications « par déclaration » se fassent avant vos propres vérifications. Dans ce cas, la méthode la plus propre est de déclarer ses vérifications non pas sous forme d’une fonction formulaires_<nomduformulaire>_verifier(), mais par la création d’une fonction formulaires_<nomduformulaire>_verifier_post_saisie(), ou sa variante verifier_etapes_post_saisies() dans le cadre du multiétape.

À noter qu’il existe deux pipelines pour ajouter des vérifications à un formulaire existant : formulaire_verifier_post_saisies et formulaire_verifier_etapes_post_saisies.

Méthode 1b avec #GENERER_SAISIES : contrôler la structure globale du formulaire, mais utiliser le formalisme de saisies

Dans quelques cas rares, la structure globale du formulaire livrée avec Saisies ne convient pas. Pour autant, vous souhaitez.

  • profiter du formalisme de déclaration des saisies
  • profiter de la vérification automatique de ces saisies (sauf si vous utilisez la méthode 1a).

Dans ce cas :

  • vous mettez dans votre fichier formulaires/<nomduformulaire>.html la structure globale du formulaire correspondant à votre besoin ;
  • là où vous souhaitez insérer vos saisies, vous utilisez la balise #GENERER_SAISIES.

Cette balise permet de générer toutes les saisies d’un formulaire, en une seule fois. Pour cela on lui passe en paramètre le tableau de description.

Exemple d’utilisation :

<div class="formulaire_spip formulaire_#ENV{form}"[(#ENV{_etape}|oui)formulaire_multietapes]">
<form .... [ data-resume_etapes_futures="(#ENV{_resume_etapes_futures}|json_encode|attribut_html)"]>
....
<div >
    #GENERER_SAISIES{#ENV{_saisies}}
</div>
....
</form>
</div>

On notera l’emploi d’un _ en préfixe de la variable d’environnement. Cela permet que les guillemets présents dans les options ne soient pas transformés en entités HTML [1].

#ENV{_saisies} est rempli automatiquement avec la valeur de retour de la fonction formulaires_<nomduformulaire>_saisies() [2].

On n’oubliera pas les attributs suivants :
-  les différentes classes sur le <div> englobant
-  l’attribut [ data-resume_etapes_futures="(#ENV{_resume_etapes_futures}|json_encode|attribut_html)"] sur le <form>, qui permet de gérer correctement les affichages conditionnels des étapes dans un formulaire multi-étape.

Par ailleurs, on utilisera

		[(#ENV{_etape}|oui)
			<INCLURE{fond=formulaires/inc-saisies-cvt-etapes-#ENV{_saisies/options/etapes_presentation,defaut}, etapes=#ENV{_saisies_par_etapes}, env} />
		]
</div>
pour insérer le chemin d'étapes, et 

<cadre class="spip">
<INCLURE{fond=formulaires/inc-saisies-cvt-boutons,env} />

pour les boutons de validation.

Méthode 2 : la balise #SAISIE

Parfois on veut pouvoir contrôler encore plus finement la présentation des saisies. Pour ce faire, on peut insérer dans formulaires/<nomduformulaire>.html des appels à la balise #SAISIE.

Cette méthode n’est pas toujours adaptée, car elle présente des limitations :

  1. elle ne permet pas de profiter des vérifications automatiques ;
  2. elle ne permet pas de profiter du mécanisme d’affichage conditionnel.

#SAISIE permet de générer une seule saisie en lui donnant directement les paramètres désirés. Chaque saisie va générer une ligne dans un formulaire, c’est-à-dire un élément <div>.

La balise #SAISIE a deux arguments obligatoires : le type de saisie, et son nom HTML (attribut « name »). Toutes les autres options sont facultatives et servent à configurer le champ ; de ce fait, elles sont de la forme option=valeur.

La forme complète est donc la suivante :
#SAISIE{type, name, option=valeur, option2=valeur2, etc=etc}

Voici quelques exemples d’utilisation.

Génère un simple champ texte, indiqué comme étant obligatoire :
#SAISIE{input, email, label=Votre courriel, obligatoire=oui}

Génère un choix multiple parmi les utilisateurs du SPIP :
#SAISIE{auteurs, destinataires,
    label=Destinataires du message,
    explication=Choisissez une ou plusieurs personnes à qui sera envoyé le message.,
    multiple=oui}

Comme vous le voyez, des champs qui peuvent être complexes, et fastidieux à écrire de manière complète, s’écrivent ici en quelques lignes.

#SAISIE supporte le multilinguisme. Dans ce cas, attention de bien utiliser la syntaxe complète avec les crochets :

  • #SAISIE{input, annee, label=<:monplugin:annee:>,obligatoire=oui} ne fonctionne pas ;
  • [(#SAISIE{input, annee, label=<:monplugin:annee:>,obligatoire=oui})] fonctionne.

Appendice 1 : chargement des CSS et scripts Javascript sur le site public

Si votre formulaire est destiné à être public, le plugin se charge d’ajouter automatiquement les appels aux fichiers CSS et scripts Javascript associés aux saisies utilisées sur le site public, lorsque le formulaire est effectivement utilisé.forme

Toutefois, si vous avez beaucoup de formulaires utilisant Saisies sur le site public, il peut être judicieux de charger systématiquement les fichiers sur toutes les pages, afin de profiter de la compréhension et du cache navigateur. Dans la configuration du plugin (« Squelettes »->« Configuration du plugin Saisies »), une option permet d’activer cela.

Appendice 2 : enregistrer des tableaux

La norme HTML permet de gérer des réponses de formulaire sous la forme de tableau.

Dans la déclaration de la saisie, on peut utiliser la syntaxe HTML classique avec crochets :

[
    'saisie' => 'input',
    'options' => [
        'nom' => 'annee[debut]',
        'label' => 'Votre nom',
        'size' => 50
    ],
];

Mais il est recommandé d’utiliser le formalisme SPIP suivant : <tableau>/<clé>.

[
    'saisie' => 'input',
    'options' => [
        'nom' => 'annee/debut',
        'label' => 'Label',
        'size' => 50
    ],
];

Le code suivant permettra de récupérer la valeur en PHP :

$annee = _request('annee');
$debut = $annee['debut'];

Appendice 3 : la balise #VOIR_SAISIES

Cette balise permet d’afficher toutes les valeurs saisies après validation d’un formulaire. On lui passe en paramètre deux arguments :

  1. le tableau de description des saisies (au même format que pour #GENERER_SAISIES)
  2. un tableau des valeurs saisies

Exemple d’utilisation, dans le squelette d’un formulaire :

[(#EDITABLE|non)
    #VOIR_SAISIES{#ENV{mes_saisies}, #ENV}
]

Appendice 4 : problème avec Xdebug

Si vous développez en utilisant le logiciel Xdebug, il existe un problème connu : par défaut celui-ci affiche une erreur à partir d’un certain niveau d’imbrication de fonctions PHP (« nesting level » dirait Shakespeare).

Le niveau d’imbrication autorisé par défaut est relativement bas, mais on peut le paramétrer. Vous devez donc ajouter cela dans votre configuration PHP/Xdebug :

[xdebug]
xdebug.max_nesting_level = 200 ou 500 ou plus…

Et hop, ça remarche.

Notes

[2Historiquement, elle pouvait aussi être remplie manuellement en ajoutant une clé _saisies dans le tableau de retour de la fonction formulaires_<nomduformulaire_charger(), toutefois ceci ne permet pas de bénéficier de tous les mécanismes d’automatisme du plugin saisies, et les bugs risquent d’être présents. Ce n’est donc pas une fonctionnalité officiellement supportée et validée.

Voir aussi la doc complémentaire et participative sur le wiki :
Saisies : Doc complémentaire

Discussion

179 discussions

  • Bonjour,
    et merci pour ce plugin qui simplifie bien les choses !

    En évolution, sera t-il possible d’uploader un document, une image par exemple ? Ce serait génial !

    Répondre à ce message

  • 2

    Bonjour,

    J’aimerais savoir quelle format doit avoir la colonne d’une table sql qui reçoit les données de saisie ’checkbox’ ou cases à cocher ?

    Spip 3.0.16 et Saisies pour formulaires 1.40.4 - stable...

    Merci d’avance de votre aide !

    • Une table SQL ne reçoit pas le contenu d’une saisie HTML. C’est traité par CVT avant. Or les champs HTML checkbox, select multiple, et certains autres, génèrent au serveur (donc ici PHP) des tableaux (array PHP donc).

      À chacun⋅e d’en faire ce qu’ille veut avant d’envoyer dans la base. Ça peut être dans une table dédié à ces choix (je sais pas, je ne connais pas le contexte moi), ou bien basiquement une sérialisation du tableau (serialize()) donc une chaîne de caractère (donc un champ SQL « text » à priori).

    • Merci de tes explications.

      Je vais approfondir le sujet en me basant sont ta courte, mais ô combien utile, réponse.

      Bien à toi !

    Répondre à ce message

  • 4

    J’utilise plusieurs champs date dans mon formulaire à l’aide de saisie.
    Cependant le code suivant ne me permet pas d’avoir le calendrier au clic sur l’icone :

    [(#SAISIE{date, date_deb})]
    [(#SAISIE{date, date_fin})]

    car l’inclusion du « formulaires/dateur/inc-dateur » est double et empêche le bon affichage de celui-ci.
    Pour que cela fonctionne, je dois faire :

    [(#SAISIE{date, date_deb})]
    [(#SAISIE{input, date_fin, class=date})]

    Est-ce normal ?

    Merci

    • Non ce n’est pas normal, mais il faudrait corriger le inc-dateur du noyau qui ne devrait pas insérer deux fois le même JS si on l’appelle plusieurs fois. Il faudrait un test avec une variable globale ou un truc comme ça pour savoir qu’il a déjà été appelé avant.

    • brain_damage

      bonjour,

      Comment faites vous pour utiliser le date_picker sur un champ date et enregistrer au format ’date’ ou ’datetime’ ?

      le picker complete le champ en JJ/MM/AAAA et mysql veut du AAAA-MM-JJ

      ya bien la solution
      [(#SAISIEdate_jour_mois_annee, datet, obligatoire=oui,
      label=<:date :>
      )]

      mais si je veux un date_picker je ne comprends pas comment convertir automatiquement le format.

      Est ce un réglage php ou une options dans saisies ?

    • Avec le plugin Vérifier, il faut utiliser la vérification « date » et activer la normalisation SQL.
      Sans le plugin Vérifier, on peut faire la même chose à la mano dans la fonction verifier() de CVT.

    • brain_damage

      Merci Beaucoup !

      Va falloir que je me décide alors :|

    Répondre à ce message

  • 1

    Bonjour,

    je suis en train d’écrire un plugin qui crée un formulaire CVT.
    Pour créer formulaire j’utilise le plugin saisies en initialisant le formulaire au sein d’un fonction _charger.
    Ma fonction charger cree un tableau de valeur avec les valeurs par defaut une valeur [’mes_saisies’] contenant la liste des champs à la norme saisies.
    Dans ma balise formulaire, le formulaire est généré par un appel #GENERER_SAISIES#ENVmes_saisies

    Mon formulaire s’affiche correctement avec tout ses champs, mais j’ai dedans 2 champs avec un affichage conditionnel : afficher_si . Cette affichage conditionnel ne fonctionne pas !!

    Pourtant le javascript gèrent cet affichage conditionnel semble être chargé dans la page.

    Le formulaire en question est visible ici :http://chaps-a-chap.com/spip.php?article101. Je souhaite que si on choisit conducteur, le champs nb_passager soit masqué et si on choisit passager, le champ places dispo soit masqué.

    Quelqu’un aurait une petite aide pour moi ????

    Répondre à ce message

  • 2

    Bonjour,
    Mon environnement : SPIP 3.0.16 [21266] | Sarka-SPIP 3.2.36 [77717] |
    Je n’arrive pas à personnaliser mon « /squelettes/css/perso.css » de façon à ce que les différents éléments de type checkbox se trouvent sur la même ligne malgré les différents posts que j’ai lus :
    Code de mon html :

    		[(#SAISIE{checkbox,categorie,
    	    label=Catégorie,
        	    datas=#ARRAY{
                    U8,U8,
                    U10,U10,
    	        U12,U12,
    	        U14,U14,
    	        U16,U16,
                    U18,U18,
                    U21,U21,
    	        U30,U30,
    	        tous, Autres,}
    			})]
    
    		[(#SAISIE{checkbox,sexe, 
    		label=Sexe, 
    		datas=#ARRAY{
    			H,Garçon,
    			L,Fille, }})]
    			
    		[(#SAISIE{checkbox,licence, 
    		label=Licence, 
    		datas=#ARRAY{
    			2,Licences,
    			1,C. Neige, }})]
    		
    		[(#SAISIE{radio,tri, 
        	label=Tri, 
    	    defaut=nom, 
        	datas=#ARRAY{
            	nom,Par nom,
    	        annee,Par âge,}})]

    code de mon php :

    function formulaires_selmembres_charger_dist(){
    
    	$valeurs = array(
    		'categorie' => array('U8','U10','U12','U14','U16','U18','U21','U30','tous'), 
    		'sexe' => array('H','L'), 
    		'licence' => array('2','1'), 
    		'tri' => 'nom');
    		
    	return $valeurs;
    }

    Le formulaire CVT fonctionne parfaitement mais j’obtiens une checkbox par ligne.
    Je voudrais que les checkbox de la même balise Saisie s’affichent sur la même ligne.
    C’était le cas sous Spip 2, je loupe sans doute quelque chose d’évident mais je ne vois pas quoi, une piste ?
    Merci
    Philippe

    • Ben ça c’est ton thème CSS qui fait ça (ou celui que tu utilises).

      Il faut mettre les labels internes des saisies en « display:inline », en ciblant par exemple « .saisie_checkbox .choix label », un truc dans ce genre, je ne me rappelle plus du HTML par cœur.

    • Cela n’a pas suffit, je me suis rendu compte qu’il fallait que mon fichier de personnalisation des css se nomme « perso.css.html » et non pas« perso.css ».
      Merci pour l’info

    Répondre à ce message

  • 6

    Question plus simple cette fois (saisies ne me quitte plus), comment enchainer 2 trads quand on est en yaml ?
    ex :

    explication: <:video:id_groupe_tags_explication:><:video:id_groupe_explication_archives:>

    Merci encore

    • Je ne crois pas que ce soit possible. En PHP si, avec _T()._T()

    • Hello,

      J’ai pas mal sué sur le YAML et les traductions.

      En faite, tu dois dire à SPIP de foutre la paix a ton fichier YAML. Dans ta fonction fonction charger, quand tu passes le paramètre au formulaire :

      function formulaires_configurer_foundation_charger() {
      
        // Lire le fichier YAML qui contient la structure du formulaire.
        include_spip('inc/yaml');
        $formulaire = yaml_decode_file(find_in_path('formulaires/configurer_foundation.yaml'));
      
        // Lire la configuration de foundation
        $config = lire_config('foundation');
      
        // Ajouter le formulaire au contexte pour utiliser #GENERER_SAISIES
        // On utilise un _ devant le nom ENV pour évité les traitements automatiques.
        $config['_form_saisies'] = $formulaire;
      
        return $config;
      }

      Tu mes un « _ » devant le nom de ta variable, cela indique à SPIP de ne pas faire de traitement de sécurité.

      Ensuite, tu balances tout dans #GENERER_SAISIES :

      #GENERER_SAISIES{#ENV{_form_saisies}}

      Et normalement tes traductions fonctionnent.

      Je baliserai aussi les traductions avec des ’ comme cela :

      explication: '<:video:id_groupe_tags_explication:><:video:id_groupe_explication_archives:>'

      Voilà pour le YAML et les traductions !

    • Je ne saisis toujours pas l’intérêt de mettre ça dans un YAML, alors que Saisies contient une API spéciale pour les CVT, qui est de fournir une fonction formulaires_truc_saisies_dist($args) qui renvoie un tableau de saisies.

      En plus ça fait faire des traitements supplémentaires (décoder du YAML).

      Pour un formulaire de config classique (donc pas besoin de verifier() ni de traiter()), il y a juste à déclarer les champs et avoir un squelette vide.

      Il suffit juste de :

      • un configurer_foudnation.html vide
      • un configurer_foundation.php avec une unique fonction formulaires_configurer_foundation_saisies_dist()

      Et c’est tout. Saisies s’occupe du reste.

    • Je ne saisis toujours pas l’intérêt de mettre ça dans un YAML,

      Avoir un fichier très simple pour modifier un formulaire. Pour les formulaires très complexes, cela aide fortement. C’est un peu le but du YAML de renvoyer des tableaux.

      alors que Saisies contient une API spéciale pour les CVT, qui est de fournir une fonction formulaires_truc_saisies_dist($args) qui renvoie un tableau de saisies.

      Documenté nulle part sur cette page... Je ne savais même pas qu’une telle fonction était possible. Tu ne peux pas reprocher aux gens de ne pas utiliser des choses non documentées...

      En plus ça fait faire des traitements supplémentaires (décoder du YAML).

      Dans le cas des formulaires d’admin, ce n’est pas trop grave. Dans le cas des formulaires publics, ce sera dans le cache de SPIP non ?

      Pour un formulaire de config classique (donc pas besoin de verifier() ni de traiter()), il y a juste à déclarer les champs et avoir un squelette vide.
      Il suffit juste de :

      un configurer_foudnation.html vide
      un configurer_foundation.php avec une unique fonction formulaires_configurer_foundation_saisies_dist()

      Et c’est tout. Saisies s’occupe du reste.

      Ça à l’aire chouette, je fais le même reproche, pas de documentation...

      Bref, tout cela à l’aire parfaitement faite et pensée, malheureusement, la documentation pour que tout le monde puisse s’en servir est absente, c’est dommage.

    • Dans la documentation ci-dessus il y a un bloc « Consultez également » avec un lien avec cet autre article de doc (sur le wiki pour l’instant car c’est un fourre-tout bordel) :
      http://contrib.spip.net/Doc-Saisies-complementaire

      Et notamment ce chapitre :
      http://contrib.spip.net/Doc-Saisies-complementaire#autocvt

      Bien sûr, avec moins de flemme, cela aurait vocation à être intégré dans cet article principal, ça c’est sûr. En tout cas au moins pour ce point-là.

    • Hello,

      Merci, le pire c’est que je connais cette page, mais je n’y fais que des recherches précises.

      Cela dit, cela ne résout pas vraiment le problème : on doit toujours écrire des tableaux PHP dans la syntaxe est vite rébarbative. Le YAML a justement vocation à être très lisible et facile à modifier/maintenir.

      C’est juste une question de préférence cela dit...

    Répondre à ce message

  • 1

    Bonjour,

    Sur un SPIP 2.1.25 [21141] le plugin saisies Version : 1.38.6 [80094] donne une page blanche quand je veux l’activer. La version 1.14.0 [50422] elle s’installe bien.

    dd

    • Chez-moi-ça-marche. ©

      Pour tester, il faut bien entendu n’activer QUE ce plugin-là et rien d’autres. C’est ce que tu as fait ?

    Répondre à ce message

  • 5

    Salut Marcimat,

    Merci encore pour ce travail fantastique.

    _ include_spip('inc/yaml');
    _ $fichier = find_in_path("mes_yaml/monfichier.yaml");
    _  lire_fichier($fichier, $yaml);
    _ $data = yaml_decode($yaml);
    _ print_r( $data );


    Dans tes exemples tu ne parles pas de lire_fichier, or j’ai réussis à faire marcher yaml_decode, uniquement grâce à cette fonction, sinon ca me renvoie l’url de mon yaml.
    J’ai manqué un truc ?

    Sinon merci encore
    ++
    Charles

    • Mmmh es-tu sûr que tu postes dans le bon forum ? Parce que dans cet article il n’est a aucun moment question de yaml_decode(). :)

    • Salut Rastapopoulos

      Je me suis en effet trompé de personne, j’ai lu trop vite et j’ai du croire que c’était Marcimat qui avait fait ce tuto (doc complémentaire).
      Désolé.

      J’ai relevé sur google un échange de mail que tu as eu avec plusieurs contributeurs et developpeurs dont mathieu, cedric, joseph. (le lien chez moi ne s’ouvre plus...???)

      Tu proposes à un moment donné de generer les saisies en fnct de leur contexte aussi aurais tu des pistes qui vont en ce sens, je suis justement dans ce cas de figure ?

      J’ai 5 yaml nommés Xstatut.yaml dans un dossier yaml d’un plugin, contenant - des champs communs mais à labels différents - et d’autres champs dédiés au statut.

      Dans un pipeline declarer_champs_extra, je veille à ce que tous les champs de ces 5 fichiers soient présent en base, le cas échéant les créer grâce à l’option sql de la saisie manquante.

      	
      include_spip('inc/flock');
      $files = preg_files(find_in_path("yaml/"));
      
      include_spip('inc/yaml');
      foreach ($files as $key => $value) {
      	lire_fichier($value, $yaml);  ///// <- Le fameux ;) /// $data = yaml_decode_file($yaml) ne marchant pas ...
      	$data = yaml_decode($yaml);
      	foreach ($data as $key => $value) {
      		$result = array_diff(array($value['options']['nom']), $desc);
      		if($result) {
      			include_spip("base/upgrade");
      			sql_alter("TABLE spip_matable ADD ".$value['options']['nom']." ".$value['options']['sql']);
      		}
      		$champs['spip_matable'][$value['options']['nom']] = $value;	
      	}
      }

      Mon CVT quant à lui est composé de 5 #SAISIEs de base et d’1 #GENERER_SAISIES#ENVmes_saisies.
      Mes champs s’affichent bien et s’enregistrent.

      MAIS : comme mes champs sont TOUS déclarer j’ai dans mon cvt tous les champs rédiger dans tous mes yaml.

      Et c’est à partir de là que je m’arrache les cheveux. Je viens de comprendre déjà les pipelines, quelque chose doit m’échapper (intellectuellement) ...

      Comment obtenir le #ENVmes_saisies contenant l’array du yaml correspondant au contexte de mon cvt et en l’occurence du statut d’un auteur ?

      J’ai bien essayer de récupérer le statut en get, c’est sale, ca affiche du coup les bons champs des bons yaml relatifs aux statuts, mais le form n’enregistre plus.

      	
      Genre : 
      	find_in_path("yaml/".$statut["statut"].".yaml");

      Ma question est donc la suivante :

      Comment passer à la fonction ci dessus - qui réside dans mon pipeline de déclaration des champs extra - le statut de l’auteur afin de disposer de 5 yaml parametrant un seul et même CVT ?

      Bidouiller un second passage de variable à GENERER_SAISIES ? // Bof bof
      N’utiliser qu’un yaml mais gérer des autorisations dans les descriptions des saisies // Je perd l’interet d’un yaml par statut or c’est l’enjeu.

      Qu’en pensez vous chère communauté ?

      Bien à vous

      Charles

    • Vu avec marcimat sur irc, en fait le cache de la déclaration des champs extra ne permet pas trop ce genre de chose.

      Je pense à la solution suivante :
      Garder mes 5 yamls puis en rajouter un qui serait merger à tous
      Et dans ma fonction foreach tester le fichier yaml et rajouter au tableau de saisies l’option de restriction qui va bien, le résultat est une seule declaration, bien cachée

      Je ferais un retour d’experience ici même
      En tout cas merci à Marcimat et Rastapopoulos

    • Bon, conclusion.
      Ma solution révele que ce post n’est en effet pas au bon endroit
      L’un étant lié à l’autre cependant j’ai solutionné mon problème en surchargeant autoriser_modifier_extra et en ajoutant un parametre d’option à mes champs dans mon yaml
      Je dépose le code si quelqu’un pourrait être interessé :

      function autoriser_modifierextra($faire, $type, $id, $qui, $opt){
      	if (isset($opt['saisie'])) {
      		// tester des fonctions d'autorisations plus precises declarees
      		if ($opt['champ']) {
      			$f = 'autoriser_' . $opt['type'] . '_modifierextra_' . $opt['champ'];
      			if (function_exists($f) OR function_exists($f .= '_dist')) {
      				return $f($faire, $type, $id, $qui, $opt);
      			}
      		}
      
      		$autor = $opt['saisie']['options']['autoriser_statut'];
      		if($autor){
      			$statut = sql_fetsel('statut','spip_auteurs','id_auteur='.intval($opt['contexte']['id_auteur']));
      			if ( ($autor == $qui['statut'] ) === ( $autor == $statut['statut'] ) ){
      				return false;
      			}
      		}
      			
      		return champs_extras_restrictions($opt['saisie'], substr($faire, 0, -5), $opt['table'], $id, $qui, $opt);
      			
      	}
      	return true;
      }


      ++

    • Correction :
      if ( ($autor !== $qui[’statut’] ) AND !( $autor == $statut[’statut’] ) )

      Pas réussit à faire plus propre

    Répondre à ce message

  • 4

    Aujourd’hui : Formidable -> Saisie et Mediaspip ?

    J’avance comme je peux... Faute d’infos et de piste.

    Une autre découverte (peut-être ?) serait la piste du plugin Saisie.

    C’est dans le fichier plugins/auto/saisies/v1.34.1/javascript/saisies.js

    1 $(function(){
    2  saisies_fieldset_pliable();
    3  onAjaxLoad(saisies_fieldset_pliable);
    4 });
    5 
    6 function saisies_fieldset_pliable(){
    7  // On cherche les groupes de champs pliables
    8 $('li.fieldset.pliable')

    a la ligne 8 il dit : $ is not a function (erreur js)

    si je commente la ligne 2 & 3 tout se remet a marcher

    Vous avez une piste pour me débloquer ?

    Merci à tous.

    Le 14 septembre 2013 10:25, Formidable et Mediaspip ?

    Bonjour,

    Je suis toujours dans l’embarras... Pas de réponse...

    Je n’arrivais plus à faire fonctionner la lecture de médias avec Mediaspip. J’ai posé la question. La réponse est une erreur javascript
    "Uncaught TypeError: Property '$' of object [object Object] is not a function saisies.js:8"

    J’ai désactivé Formidable et Mediaspip fonctionne à nouveau normalement.
    J’imagine donc que cette erreur vient de Formidable, non ?
    comment régler mon problème pour faire fonctionner Mediaspip ET Formidable ?

    Un grand merci à vous tous...

    Robert

    • Je ne vois pas comment « $ » pourrait ne pas être une fonction à la ligne 8 (= jquery pas chargé) MAIS être pourtant interprété correctement à la ligne 1...

      T’as un problème avec jQuery en général non ? Ya un truc qui se charge pas bien on dirait.

    • OUi, sans doute... Mais j’aimerais vraiment trouvé ce qui coince...

      Page exemple : http://malle-arts.org/spip.php?article10

      Merci, merci...

      Robert

    • Rappel pour tester si un plugin précis est à l’origine d’un bug, et déjà marqué dans le lien « Les choses à faire avant de poser une question » que l’on trouve au dessus du champ texte de ce forum :

      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.

      Donc as-tu déjà désactivé TOUS les plugins non obligatoires pour tester Formidable/Saisies ?

    • J’ai eu le même genre de message ( function saisies_fieldset_pliable(){ // On cherche les groupes de champs pliables $('li.fieldset.pliable') ... TypeError: $ is not a function dans la console firebug.

      En passant de la version 1.34.1 à la version 1.38.3 : plus de problème !

    Répondre à ce message

  • 9
    Pierrot

    Bonjour,

    Dans un contexte de Spip mutualisé (plusieurs sites avec une seule installation de spip, en 3.0.11) et avec des dossiers plugins par site, donc dans un dossier sites/www.domaine.tld/plugins/auto correctement déclaré (voir http://www.spip.net/fr_article4865.html et http://www.spip.net/fr_article5296.html pour les variables _DIR_PLUGINS_SUPPL et _DIR_PLUGINS_AUTO) qui nous permet d’installer des plugins dans le bon dossier de site par les dépôts, avec le code dans mes_options :

    define('_DIR_PLUGINS_SUPPL',_DIR_RACINE.$rep.$site.'/plugins/');
    define('_DIR_PLUGINS_AUTO',_DIR_PLUGINS_SUPPL.'auto/');

    Seul le plugin Saisies nous donne un souci avec l’erreur suivante :

    Erreur dans les plugins : ecrire/_ROOT_PLUGINS_SUPPLauto/saisies/v1.32.4/saisies_pipelines.php

    On voit « auto » collé à _ROOT_PLUGINS_SUPPL comme si à cet endroit, _ROOT_PLUGINS_SUPPL n’était pas connu ni remplacé par sa valeur ....

    Le traitement de _ROOT_PLUGINS_SUPPL se fait apparemment dans inc/utils.php (ligne 1546) selon ce changelog :

    r20029 | kent1     |  (sam. 01 déc. 2012) | Report de r20028Meilleure gestion de _DIR_PLUGINS_SUPPL, incompatibilité avec ce qui se faisait auparavant :-* On ne peut gérer qu'un seul répertoire (on enlève la gestion des : pour séparer les répertoires);-* Le répertoire de plugins supplémentaires doit être défini comme _DIR_PLUGINS soit à partir de "ecrire/" soit define('_DIR_PLUGINS_SUPPL', _DIR_RACINE."chemin_vers/répertoire/plugins_suppl")Ça a le mérite de simplifier le code, d'enlever plusieurs cas spécifiques liés à ce define.On ajoute un define dans inc/utils _ROOT_PLUGINS_SUPPL si le define _DIR_PLUGINS_SUPPL existe afin de rendre le fonctionnement des plugins supplémentaires équivalent aux deux autres répertoires _DIR_PLUGINS et _DIR_PLUGINS_DIST

    Le plugin s’installe mais ne fonctionne pas ...

    Le traitement dans utils.php, c’est ça (j’ai tenté de le déplacer dans mes_options.php mais cela donne une autre erreur sur saisies.css)

    if (!defined('_ROOT_PLUGINS_SUPPL') &amp;amp;amp;amp;&amp;amp;amp;amp; defined('_DIR_PLUGINS_SUPPL') &amp;amp;amp;amp;&amp;amp;amp;amp; _DIR_PLUGINS_SUPPL) define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE,'',_DIR_PLUGINS_SUPPL)); 

    Une idée géniale ?

    Merci d’avance !

    Pierre

    • Pierrot

      On peut d’ailleurs aussi se poser la question du « ecrire/ » devant « _ROOT_PLUGINS_SUPPL » alors que cette constante (par ex placée dans mes_options) produit un chemin absolu depuis la racine de l’hébergement, donc avoir « ecrire » devant semble sans issue ...

      Ceci dans l’erreur qui apparait déjà mentionnée dans mon premier post :

      Erreur dans les plugins : ecrire/_ROOT_PLUGINS_SUPPLauto/saisies/v1.32.4/saisies_pipelines.php

      Toute aide bienvenue et appréciée ... je sais on est en août !
      P.

    • A priori, il n’y a aucun rapport avec le plugin saisies.

      Cela dit, il te faudrait par exemple ajouter un test là où _ROOT_PLUGINS_SUPPL est utilisé dans le code de SPIP et provoque une erreur.

      Tu pourrais tester un

      if (!defined('_ROOT_PLUGINS_SUPPL')) or _ROOT_PLUGINS_SUPPL == '_ROOT_PLUGINS_SUPPL') {
          var_dump(debug_backtrace());
      }

      Tu pourras alors fournir la pile d’exécution des fonctions pour arriver à cette erreur. Ce qui peut aider à trouver dans quel contexte ça se produit.

    • pierrot

      Bjr,
      Oui je l’ai mentionné au niveau du plugin mutualisation, je pense que Saisies le révèle mais n’est pas la cause.
      Je vais tenter ce qui est suggéré et revenir ici.
      P.

    • Bonjour

      Je pense que saisies et commun à tout les sites non ? Le mettre dans le répertoire centrale serais pas une facilité ?

    • pierrot

      Oui d’accord mais on revient au problème que depuis la version 3, la mise à jour d’un plugin le dévalide dans tous les sites d’une ferme à spip, c’est pour ça que je suis en train d’envisager de faire un dossier plugin par site de la ferme.

      La ferme me permettra de mettre à jour le core, ensuite je peux m’occuper site par site de la mise à jour des plugins via l’interface ... tâche que je dois faire de toutes façons (je veux dire aller sur chaque site vérifier que tout marche).

      Voir http://contrib.spip.net/Ferme-a-SPIP#forum465002 ou vous intervenez, je viens justement de rajouter un mot sur ce sujet, il n’est pas encore aparru.

    • pierrot

      Une suggestion ou mettre ça car là je n’ai pas trop de résultat ... Ou alors je ne sais pas ou regarder.

      PS : je crois qu’il y a une parenthèse fermante de trop au premier defined.

    • pierrot

      Une autre chose que je constate, c’est que dans utils.php (ligne 1546 pour 3.0.11) qui a été modifié assez récemment : http://core.spip.org/projects/spip/repository/revisions/20029 on a

      if (!defined('_ROOT_PLUGINS_SUPPL') &amp;amp;amp;&amp;amp;amp; defined('_DIR_PLUGINS_SUPPL') &amp;amp;amp;&amp;amp;amp; _DIR_PLUGINS_SUPPL) define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE,'',_DIR_PLUGINS_SUPPL));

      Et à cet endroit, _DIR_PLUGINS_SUPPL est vide donc ce if n’est jamais éxécuté. Pourtant _DIR_PLUGINS_SUPPL marche puisque mon spip voit le dossier plugins/auto qui est dans le dossier spécifique de ce site dans la ferme. (j’ai pris soin de renommer le dossier plugins central qui ne peut donc être utilisé).

    • pierrot

      J’ai l’impression qu’une réponse sur 2 est zappée et à chaque fois j’ai un message qui me dit que je suis soupçonné de spam, donc je sais plus trop ou j’en suis sur ce fil ... J’ai fait 2 réponses qui ne sont pas apparues (à Pierre et Mathieu), ... j’attends pour voir si c’est un souci de modération mais en général les messages apparaissent rapidement ...

    • C’est quand une réponse contient beaucoup de liens. Tes messages étaient en « proposés ». Je les ai validés.

    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