
Home
» Talus' Works » Talus' TPL » Général & Support » Utilisation un peu différente des TPL » Lecture du Sujet » Page 1 | Forum Fermé - Sujet Fermé |
|
|
|
|
Salut, Me revoilà car j'ai besoin d'un avis/conseil. Je gère plusieurs sites, tous ont une interface d'admin, j'en ai créé une qui fonctionne avec des modules, je qu'a choisir/créé les modules que je souhaite pour chaque site en les ajoutant à l'admin. Afin de simplifier la gestion de l'affichage des modules, je souhaite utiliser les TPL's. Même si chaque module à sa fonction, les éléments utilisés cotés HTML reste toujours les mêmes : tableau, formulaire, texte, etc... C'est pourquoi je me suis dit plutôt que de créer un TPL par page de chaque module, pourquoi ne pas créer des TPL de chaque élément (tableau, form, etc...) afin de pouvoir générer l'affichage "à la volée" sans repasser à chaque fois par l'édition HTML. Pour essayer d'être clair, voici un exemple : formulaire.html
Code TPL
<form action="{FORM_LIEN}" method="{FORM_METHOD}">
<block name="input">
{input.PRESENTATION} <input type="{input.TYPE}" name="{input.NAME}" value="{input.VALUE}" />
</block>
<block name="textarea">
{textarea.PRESENTATION} <textarea name="{textarea.NAME}">{textarea.VALUE}</textarea>
</block>
<block name="select">
{select.PRESENTATION} <select name="{textarea.NAME}">
<block name="select.option">
<option value="{option.VALUE}">{option.TEXT}</option>
</block>
</block>
</form>
tableau.html
Code TPL
<table>
<block name="tr">
<tr>
<block name="tr.td">
<td>
{td.TEXT}
</td>
</block>
</tr>
</block>
</table>
texte.html
Code TPL
{TEXT}
A partir de ces TPL's, on pourrait générer n'importe quel page, par exemple :
Code TPL
Pour poster une news, remplissez le formulaire suivant :
<form action="news.php" method="post">
Titre : <input type="text" name="titre" value="" />
Type de news : <select name="type"><option value="1">Actu</option><option value="2">Mise à jour</option></select>
Message : <textarea name="message"></textarea>
Source : <input type="text" name="source" value="" />
<input type="submit" name="Envoyer" value="Envoyer" />
</form>
Précédentes news :
<table>
<tr>
<td>
News 1
</td>
<td>
Apercu 1
</td>
</tr>
<tr>
<td>
News 2
</td>
<td>
Apercu 2
</td>
</tr>
</table>
Je n'ai pas testé en l'état car pour moi il y a 2 problèmes : - Par exemple dans le formulaire comment faire pour afficher les éléments dans l'odre que l'on veut et autant de fois que l'on veut ? Découper chaque élément du formulaire dans un TPL distinct ? - Et le vrai problème pour moi est le suivant : Comment parser un même TPL plusieurs fois dans la même page sans qu'il reprenne les mêmes valeurs ? Si je définie un formulaire que le parse, que se passe t'il si je refais la même opération avec des valeurs différentes ? Xavier. Dernière édition le 20/08/2009, à 16:46, par Talus |
|
|
|
|
|
Hello, Pour suivre ta logique, je ferais carrément autre chose : l'utilisation de fonctions TPL (pour une fois qu'on peut leur trouver une utilité, à celles là :D). Ceci devrait déjà répondre à ta deuxième question... Pour la première, à priori, faire plusieurs fonctions... ? Bref, la solution envisageable : les fonctions. :D Dev' de Talus' Works |
|
|
|
|
J'y ai pensé aux fonctions TPL, mais le problème c'est qu'elles se font appeler depuis un TPL, or tout l'intérêt de la chose est justement de ne pas refaire de TPL mais de tout gérer en PHP à chaque nouveau module de créer en se basant sur les TPL existants. Je continue d'étudier le truc. Edit : Je viens de tester l'exemple que j'ai mis plus haut résultat : Dernière édition le 18/08/2009, à 13:49, par Xas |
|
|
|
|
|
C'est à dire ? Avec ta méthode, tu dois toujours faire un include des tpl que tu donnes, non ? C'est donc exactement la même chose : le tpl, tu l'encapsules dans une fonction avec arguments (les dites variables), avec des sous fonctions (pour emuler les blocs, car ils ne passeraient pas sinon...)... Que tu inclues et appel après... Je songe sinon à changer completement le comportement des fonctions, et faire comme symfony, c'est à dire lors de l'inclusion, donner la possibilité de déclarer des variables pour cette inclusion... Dev' de Talus' Works |
|
|
|
|
En fait, mon test est le suivant : Les TPL (j'ai découpé tous éléments du formulaire dans un TPL différent) : formulaire_form_open.html :
Code TPL
<form action="{FORM_LIEN}" method="{FORM_METHOD}">
formulaire_input.html :
Code TPL
<input type="{INPUT_TYPE}" name="{INPUT_NAME}" value="{INPUT_VALUE}" />
formulaire_select.html :
Code TPL
<select name="{SELECT_NAME}">
<block name="select">
<option value="{select.VALUE}">{select.TEXT}</option>
</block>
</select>
formulaire_textarea.html :
Code TPL
<textarea name="{TEXTAREA_NAME}">{TEXTAREA_VALUE}</textarea>
formulaire_form_close.html :
Code TPL
</form>
A partir de ces TPL, je souhaite générer n'impmorte quel formulaire depuis PHP, ex :
Code PHP
<?php
Ce qui génère :
Code TPL
<form action="admin/index.php" method="post"><input type="text" name="test" value="" /><select name="type">
<option value="1">Actu</option>
<option value="2">Mise à jour</option>
</select><input type="text" name="titre" value="Mon titre" /><select name="action">
<option value="1">Actu</option>
<option value="2">Mise à jour</option>
<option value="1">Mimer</option>
<option value="2">Courir</option>
</select></form>
Et le problème vient des blocs, on voit bien que le 2ème <select> contient les options du 1er <select> en plus de ces propres options. Il faudrait donc détruire les anciens blocks via PHP (j'arrive pas a trouver dans quel array tu stocks tes blocks). J'espère que c 'est plus clair. Dernière édition le 20/08/2009, à 16:47, par Talus |
|
|
|
|
|
Oui j'ai bien vu, pour ca que je te parlais en fait des fonctions... Comme ca, à chaque appel, ca met une variable différente... Mais pour les fonctions, les blocs ne sont pas vraiment disponible (on ne peut pas passer un bloc en paramètre d'une fonction). Pour ca que j'ai évoqué l'idée de faire comme avec Symfony, et leur système d'inclusions partielles... 'Faut que je regarde ca de plus près... (Pour l'idée, voir mon post sur les idées en vrac) Dev' de Talus' Works |
|
|
|
|
En fait tu parles de faire un truc dans le style : Au lieu de :
Code TPL
<select name="{SELECT_NAME}">
<block name="select">
<option value="{select.VALUE}">{select.TEXT}</option>
</block>
</select>
Faire :
Code TPL
<function name="select" arg="SELECT_NAME" arg="etc...">
<select name="{SELECT_NAME}">
<block name="select">
<option value="{select.VALUE}">{select.TEXT}</option>
</block>
</select>
</function>
<call name="select" arg="SELECT_NAME" arg="etc..."/>
Ouai c'est vrai que ça pourrrait marcher, est-ce que les arguments peuvent être des tableaux ? Si c'est le cas, je pourrais tenter un truc dans le genre :
Code TPL
<function name="select" arg="SELECT_NAME" arg="MON_ARRAY">
<select name="{SELECT_NAME}">
<foreach ary="{$MON_ARRAY}">
<option value="{VALUE,MON_ARRAY['VALUE']}">{VALUE,MON_ARRAY['TEXT']}</option>
</foreach>
</select>
</function>
<call name="select" arg="SELECT_NAME" arg="MON_ARRAY"/>
Et coter PHP :
Code PHP
<?php
Et donc plus de problème avec les blocs vu que je ne cré que des strings qui peuvent sans problème être modifier pour la suite de la page. T'en penses quoi ? Edit : Je vais tester, je te tiens au courant ;) ReEdit : Premier constat, il faut faire un fichier avec toute les fonctions et le parser dès le début sinon cela redéclare à chaque fois la fonction et ça bug (normal). Donc, pour l'instant, il me met une erreur lorsqu'il veut faire le foreach : "<b>Warning</b>: Invalid argument supplied for foreach() in <b>/www/admin/cache/fonction.html.php</b> on line <b>3</b><br />" Je ne vois pas d'erreur, mon fonction.html :
Code TPL
<function name="select" arg="SELECT_NAME" arg="OPTION">
<select name="{SELECT_NAME}">
<foreach ary="{$OPTION}">
<option value="{VALUE,OPTION['VALEUR']}">{VALUE,OPTION['TEXT']}</option>
</foreach>
</select>
</function>
Ce qui donne en compiler :
Code PHP
<?php function __tpl_select(Talus_TPL $tpl, $SELECT_NAME, $OPTION){ ?>
Et mon PHP :
Code PHP
<?php
Si t'as une idée, je suis preneur ;) (à mon avis c'est sur la syntaxe {VALUE,OPTION['VALEUR']} que je bug mais je vois pas là ^^) Dernière édition le 20/08/2009, à 16:48, par Talus |
|
|
|
|
|
Bon, on va tenter un truc : dans le fichier de compilation de la fonction, juste après la déclaration (function __tpl_select(Talus_TPL $tpl, $SELECT_NAME, $OPTION) {), rajoute var_dump($OPTION); pour voir ? Dev' de Talus' Works |
|
|
|
|
Ca m'affiche : string(6) "OPTION"
Code PHP
<?php function __tpl_select(Talus_TPL $tpl, $SELECT_NAME, $OPTION){
Ce sont les fonctions qui n'accepteraient pas les tableaux ? Edit : Non c'est bon ça marche, c'est moi qui avait fait une erreur, comme un boulet, pour l'appel de fonction j'avais fait :
Code TPL
<call name="select" arg="SELECT_NAME" arg="OPTION" />
Au lieu de :
Code TPL
<call name="select" arg="{$SELECT_NAME}" arg="{$OPTION}" />
Je continue mes tests pour voir si cette technique marche nikel ;) ReEdit : Ouai donc c'est bon, tout marche nikel, on peut enchainer les selects sans problème, il en est de même pour tout ce qui est boucle, merci de ton aide ;) ReReEdit : Ah y'a une chose qui est dommage, c'est qu'apparement on ne peut pas appeller une fonction directement depuis une variable :
Code TPL
<call name="{$FONCTION}" arg="{$NAME}" arg="{$TEXT}" arg="{$TYPE}" />
Donne en HTML :
Code TPL
<call name="$tpl->vars['FONCTION']" arg="$tpl->vars['NAME']" arg="$tpl->vars['TEXT']" arg="$tpl->vars['TYPE']" />
Alors que si on met le nom en dur, ça éxécute bien la fonction, bon c'est pas dur à contourner suffit d'utiliser des if et de lancer la fonction en concéquence mais dans une future MAJ, ca serait pas mal qu'on puisse le faire ;) Dernière édition le 20/08/2009, à 16:49, par Talus |
|
|
|
|
|
C'est une idée, pourquoi pas... Dev' de Talus' Works |
| Forum Fermé - Sujet Fermé |