Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2015-09-24 15:22:51

WSH
Membre
Lieu : Lyon
Inscription : 2008-11-11
Site Web

Imbriquer des balises tpl

Chers sorciers,

Je développe actuellement un plugin permettant de créer facilement des formulaires depuis l'interface d'administration et de gérer les réponses apportées par les utilisateurs.
J'aborde actuellement la partie d'affichage côté public, après avoir terminé la partie administration. Je rencontre un petit problème pour la personnalisation de l'affichage des formulaires : j'aimerais en effet pouvoir boucler sur chacun des champs du formulaire et découper ceux-ci en différentes parties, de manière à pouvoir les agencer un peu comme on veut. En clair, ça donnerait un truc dans ce genre :

<tpl:Form>
     <div>
          {{tpl:FormItemLabel}}
          {{tpl:FormItemField}}
          <p>{{tpl:FormItemDescription}}</p>
     </div>
 </tpl:Form>

Le truc, c'est que ce qui est à l'intérieur de <tpl:Form> est interprété avant, je récupère donc dans ma fonction qui gère le bloc uniquement un contenu démuni de balises template !
Comment puis-je appliquer le contenu de <tpl:Form> à chacun de mes champs, pour faire une sorte de <tpl:Entries> pour formulaire ?

Merci d'avance !

Hors ligne

#2 2015-09-24 15:51:54

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Imbriquer des balises tpl

Une première idée qui me vient à l'esprit : convertir <tpl:Form> en {{tpl:FormBegin}}, </tpl:Form> en {{tpl:FormEnd}}, …
Du coup plus de soucis, chaque balise est gérée indépendamment.

Mais j'ai peut-être mal compris l'idée ?

En fait je vois mal pourquoi il faut que tu récupères le contenu de <tpl:Form> avec les balises {{tpl:Form…}}

Un éclairage, voire un accès au code source quelque part ?


Dotclear addicted since 2004

Hors ligne

#3 2015-09-24 16:33:33

WSH
Membre
Lieu : Lyon
Inscription : 2008-11-11
Site Web

Re : Imbriquer des balises tpl

Merci pour ta réponse. En fait, ma balise <tpl:Form> délimite le début et la fin de mon formulaire, comme tu l'as compris. Ce qui est dedans est en fait le HTML de chaque champ du formulaire, afin de pouvoir les agencer comme on veut (en ligne, en colonne...). Je voudrais donc en fait interpréter le contenu de mon bloc <tpl:Form> pour chaque champ. Je pensais du coup qu'en retournant x fois le contenu de <tpl:Form> je pourrais avoir x champs, mais puisque les balises sont supprimées à l'intérieur, ça ne marche pas...

Du coup avec ta proposition je ne pense pas que je puisse arriver à faire quelque chose, puisque je ne sais pas ce qui est entre {{tpl:FormBegin}} et {{tpl:FormEnd}}...

EDIT : en fait pour faire simple, je voudrais faire un <tpl:Entries> mais pour mes champs de formulaire en fait, pour itérer sur chacun d'eux !

EDIT2 : Est-ce qu'il est possible, sinon, de faire un tpl comprenant juste le HTML d'un champ de formulaire, que j’appellerais pour chaque champ en remplaçant alors les balises par les valeurs de chacun ? Je retournerais alors le HTML de l'ensemble dans une balise du genre {{tpl:FormContent}} du tpl de la page, ce qui m'éviterait d'avoir tout ce bazar… En plus, ça me permettrait de laisser l'utilisateur choisir un template différent pour chaque formulaire. Reste à savoir si c'est possible ?

Voici le lien vers le dépôt si ça t'intéresse, mais la partie public n'est pas encore dessus, puisqu'elle n'est pas encore du tout fonctionnelle : https://github.com/Banasura/majordome/tree/dev

Merci pour ton aide :)

Dernière modification par WSH (2015-09-24 17:09:54)

Hors ligne

#4 2015-09-24 17:13:59

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Imbriquer des balises tpl

« Je voudrais donc en fait interpréter le contenu de mon bloc <tpl:Form> pour chaque champ. »

C'est cette phrase que je ne comprends pas.

D'ailleurs c'est idem pour celle-ci : « Est-ce qu'il est possible, sinon, de faire un tpl comprenant juste le HTML d'un champ de formulaire, que j’appellerais pour chaque champ en remplaçant alors les balises par les valeurs de chacun ? »

Bref comme je ne sais pas quel doit être le markup HTML final de ton plugin, j'ai du mal à comprendre comment ça s'imbrique.


Dotclear addicted since 2004

Hors ligne

#5 2015-09-24 17:15:26

Franck
Footer de merde
Lieu : Paris
Inscription : 2004-11-09
Site Web

Re : Imbriquer des balises tpl

Précision : un {{tpl:Blabla}} renvoie ce qu'il veut, ça peut-être un formulaire complet ou une simple balise HTML, voire même un attribut ou une valeur d'un attribut… Pas de limite ici.


Dotclear addicted since 2004

Hors ligne

#6 2015-09-24 17:28:15

WSH
Membre
Lieu : Lyon
Inscription : 2008-11-11
Site Web

Re : Imbriquer des balises tpl

Explication par l'exemple : mettons que je veuille arriver à ce résultat :

<form action="foo.php" method="POST">
    <div>
        <label for="foo1">Entrez votre nom</label><input type="text" required id="foo1">
        <p>Veuillez saisir votre nom complet dans ce champ.</p>
    </div>
    <div>
        <label for="foo2">Entrez votre âge</label><input type="number" min="0" max="200" id="foo2">
        <p>Veuillez saisir votre âge dans ce champ.</p>
    </div>
    <div>
        <label for="foo3">Entrez votre courriel</label><input type="mail" required id="foo3">
        <p>Veuillez saisir votre adresse électronique dans ce champ.</p>
    </div>
    <input type="submit" value="Envoyer" name="ok">
</form>

Je voudrais obtenir ce HTML à partir du template suivant :

<tpl:Form>
    <div>
        {{tpl:FormItemLabel}}
        {{tpl:FormItemField}}
        <p>{{tpl:FormItemDescription}}</p>
    </div>
</tpl:Form>

Voilà ! Je veux répéter un bout de template en fait !
Est-ce que tu vois ce que j'essaie de faire maintenant ?

Hors ligne

#7 2015-09-24 18:39:35

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Imbriquer des balises tpl

Il suffit que tes balises génèrent le code php qui va bien :
<tpl:Form>...</tplForm> génère :

<?php foreach ($_ctx->form as $f): ?>.$content.<?php endforeach; ?>

et ton {{tpl:FormItemLabel}} génère :

  <?php echo $f['label']; ?>

Dyslexics have more fnu!

Hors ligne

#8 2015-09-24 20:00:42

WSH
Membre
Lieu : Lyon
Inscription : 2008-11-11
Site Web

Re : Imbriquer des balises tpl

Merci pour ta réponse Dsls, je viens d'essayer comme tu me dis de faire, mais ça ne change rien : lorsque je fais un var_dump($content) juste avant le foreach de <tpl:Form>, j'obtiens une chaîne vide, ou du texte quand j'en rajoute dans le template, mais aucune balise : ni HTML, ni balise de template !

Voilà ce que ça donne : https://framapic.org/y1QXK0tc1t0K/c7sJrHM0

Et voilà ma fonction :

public static function form($attr, $content)
    {
        $_ctx =& $GLOBALS['_ctx'];
        $_ctx->formData->content = json_decode($_ctx->formData->form_fields)->fields;
        var_dump($content);die; // ce qui donne le résultat de l'image
        return '<?php foreach ($_ctx->formData->content as $f): ?>'.$content.'<?php endforeach; ?>';
    }

C'est normal ? oO

Dernière modification par WSH (2015-09-24 20:06:55)

Hors ligne

#9 2015-09-25 18:12:16

Dsls
Modérateur couteau-suisse
Inscription : 2004-11-18
Site Web

Re : Imbriquer des balises tpl

oui. Ce qu'il faut savoir c'est que le ta fonction renvoit du code php qui sera compilé dans une page php à part.
Si tu fais ton affichage directement dans ta fonction, il sera fait avant l'inclusion de la page php, et donc ton var_dump se fera probablement en début de page générée.

$_ctx n'existe pas quand tu es dans ta fonction, il faut que tu retournes tout le code php :

public static function form($attr, $content)
    {
    	return '<?php
        $_ctx =& $GLOBALS[\'_ctx\'];
        $_ctx->formData->content = json_decode($_ctx->formData->form_fields)->fields; 
         foreach ($_ctx->formData->content as $f): ?>'.$content.'<?php endforeach; ?>';
    }

Dyslexics have more fnu!

Hors ligne

#10 2015-09-28 17:24:17

WSH
Membre
Lieu : Lyon
Inscription : 2008-11-11
Site Web

Re : Imbriquer des balises tpl

Aaaaaaach soooooo !
C'est donc ça ! Je comprends mieux : effectivement je n'avais pas $_ctx, ce qui explique je n'obtenais rien du tout :p
Il faut donc retourner tout le code PHP dans une chaîne et non pas juste l'affichage, je n'avais pas compris ça comme ça...

Merci beaucoup Dsls !

Ps : désolé pour le temps de réponse, je n'ai pas pu regarder ta réponse plus tôt :/

Dernière modification par WSH (2015-09-28 17:35:33)

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map