A ma connaissance cela n’existe pas encore. Malheureusement
Une boucle DATA ne pourrait pas faire ça, pour SQL par ex:
<BOUCLE(DATA){source format, données}> #BALISES
sql pour envoyer une requête brute au serveur SQL (utiliser {source sql, connecteur:requete} pour envoyer la requête sur une base externe)
La partie données semble pouvoir contenir des balises comme #ENV … mais se pose le pbm des noms des champs ensuite, puisque en fonction de la table c’est id_article, id_rubrique … vraiment à tester mais c’est vrai qu’une fois j’ai eu ce questionnement et j’arrive pas à retrouver ce que j’ai fait …
A ma connaissance cela n’existe pas encore. Malheureusement
Une boucle DATA ne pourrait pas faire ça, pour SQL par ex:
<BOUCLE(DATA){source format, données}> #BALISES
sql pour envoyer une requête brute au serveur SQL (utiliser {source sql, connecteur:requete} pour envoyer la requête sur une base externe)
La partie données semble pouvoir contenir des balises comme #ENV … mais se pose le pbm des noms des champs ensuite, puisque en fonction de la table c’est id_article, id_rubrique … vraiment à tester mais c’est vrai qu’une fois j’ai eu ce questionnement et j’arrive pas à retrouver ce que j’ai fait …
On ne peux pas vraiment dire que la boucle DATA soit vraiment une bonne
idée, a quoi bon avoir un système qui gère des objets dans ce cas ?
Avoir la possibilité de gérer des objets via une variable me semble
pourtant une excellente idée, pour SPIP 3.1 ?
Non, ce n'est techniquement pas possible.
Pour que le compilateur puisse connaître les balises et critères relatifs à une boucle, il faut à la compilation qu'il connaisse le nom le l'objet de la boucle. Si on lui indique une variable, le compilateur ne pourra pas dire en analysant le squelette que le critère {truc} est inconnu (il ne peut pas savoir si truc appartient bien à l'objet, vu qu'il ne connaît pas à ce moment là l'objet).
La solution alternative est la boucle DATA, comme signalé par Maieul, mais évidemment on en revient aux mêmes problèmes : une boucle DATA ne râle jamais si on met une balise #CHOSE qui ne fait pas partie des données, vu qu'elle ne connaît pas non plus à la compilation la structure des données qu'elle recevra.
D'autre part… si tu mettrais #TITRE sur un objet qui attend un #NOM… est-ce que ça devrait afficher le titre ? ou rien du tout ? Est-ce que tu écrirais #TITRE|sinon{#NOM}|... ? et si l'objet a comme champ titre #TITLE … mince, …
Pour la plupart des objets, on ne peut pas prédire le noms de leurs champs (bon, pour le titre, on le peut : d'ailleurs, #INFO_TITRE{auteur, 2} ramènera effectivement le #NOM associé à l'auteur.)
Je me demande s’il ne serait pas utile d’introduire un nouveau truc dans SPIP, qui serait la compilation de squelettes se présentant sous forme de « chaînes » et non pas de « fichiers ». Ca permettrait de résoudre ça, et mille autres trucs.
Je me demande s'il ne serait pas utile d'introduire un nouveau truc dans
SPIP, qui serait la compilation de squelettes se présentant sous forme
de "chaînes" et non pas de "fichiers". Ca permettrait de résoudre ça,
et mille autres trucs.
Je ne connait pas le fonctionnement du compilateur, mais:
Pour que le compilateur puisse connaître les balises et critères relatifs à une boucle, il faut à la compilation qu’il connaisse le nom le l’objet de la boucle. Si on lui indique une variable, le compilateur ne pourra pas dire en analysant le squelette que le critère {truc} est inconnu (il ne peut pas savoir si truc appartient bien à l’objet, vu qu’il ne connaît pas à ce moment là l’objet).
Ne peut ont pas justement l’informer de cet objet via une variable AVANT qu’il n’analyse la boucle, il n’y a pas de mécanisme de « precompilation » ?
D’autre part… si tu mettrais #TITRE sur un objet qui attend un #NOM… est-ce que ça devrait afficher le titre ? ou rien du tout ? Est-ce que tu écrirais #TITRE|sinon{#NOM}|… ? et si l’objet a comme champ titre #TITLE … mince, …
Je pense que c’est à la personne qui créé le squelette de respecter les champs de SPIP et de ne pas attendre que le système devine tout.
Didier
Le 8 sept. 2013 à 18:50, Matthieu Marcillaud <marcimat@rezo.net> a écrit :
Le 08/09/2013 17:20, Debondt Didier a écrit :
On ne peux pas vraiment dire que la boucle DATA soit vraiment une bonne
idée, a quoi bon avoir un système qui gère des objets dans ce cas ?
Avoir la possibilité de gérer des objets via une variable me semble
pourtant une excellente idée, pour SPIP 3.1 ?
Non, ce n’est techniquement pas possible.
Pour que le compilateur puisse connaître les balises et critères relatifs à une boucle, il faut à la compilation qu’il connaisse le nom le l’objet de la boucle. Si on lui indique une variable, le compilateur ne pourra pas dire en analysant le squelette que le critère {truc} est inconnu (il ne peut pas savoir si truc appartient bien à l’objet, vu qu’il ne connaît pas à ce moment là l’objet).
La solution alternative est la boucle DATA, comme signalé par Maieul, mais évidemment on en revient aux mêmes problèmes : une boucle DATA ne râle jamais si on met une balise #CHOSE qui ne fait pas partie des données, vu qu’elle ne connaît pas non plus à la compilation la structure des données qu’elle recevra.
D’autre part… si tu mettrais #TITRE sur un objet qui attend un #NOM… est-ce que ça devrait afficher le titre ? ou rien du tout ? Est-ce que tu écrirais #TITRE|sinon{#NOM}|… ? et si l’objet a comme champ titre #TITLE … mince, …
Pour la plupart des objets, on ne peut pas prédire le noms de leurs champs (bon, pour le titre, on le peut : d’ailleurs, #INFO_TITRE{auteur, 2} ramènera effectivement le #NOM associé à l’auteur.)
Mon idée, en pseudo-code, ce serait d’étendre la fonction récupérer_fond :
en plus de recuperer_fond($nom-du-squelette, $contexte), autoriser recuperer_fond($contenu-du-squelette, $contexte);
avec $contenu-du-squelette = '<BOUCLE(TRUC){toto} … ’
à priori c’est très simple à faire puisqu’« il suffit » d’enregistrer le squelette dans un fichier md5($contenu-du-squelette).html
Bien entendu, il faudrait aussi trouver comment nommer cette nouvelle fonction, faire des tests, faire de la doc, etc.
Je me demande s'il ne serait pas utile d'introduire un nouveau truc dans
SPIP, qui serait la compilation de squelettes se présentant sous forme
de "chaînes" et non pas de "fichiers". Ca permettrait de résoudre ça,
et mille autres trucs.
Je ne sais pas si ça résoudrait le truc des boucles dynamiques, mais dans tous les cas, ce serait une super bonne chose ! Le compilateur serait non dépendant du système de fichier, et la compilation de fichiers-squelettes ne serait qu'un cas particulier de la compilation d'une chaîne en général.
Dans l'idéal, je trouverais cool que le compilateur puisse être un module autonome (pouvoir utiliser les squelettes sans rien installer de SPIP, sans base, sans tables, sans rien). Mais pour l'instant c'est tellement imbriqué avec le PATH, les plugins, etc...
Mon idée, en pseudo-code, ce serait d'étendre la fonction récupérer_fond :
en plus de recuperer_fond($nom-du-squelette, $contexte), autoriser
recuperer_fond($contenu-du-squelette, $contexte);
avec $contenu-du-squelette = '<BOUCLE(TRUC){toto} ... '
à priori c'est très simple à faire puisqu'"il suffit" d'enregistrer le
squelette dans un fichier md5($contenu-du-squelette).html
Bien entendu, il faudrait aussi trouver comment nommer cette nouvelle
fonction, faire des tests, faire de la doc, etc.
Ça ne me parait pas très compliqué de faire une implémentation rapide comme tu le dis, en générant à la volée un fichier squelette md5 correspondant à la chaine passée en fond. Pour détecter que c’est une chaine, il suffirait de se baser sur la présence d’un des caractères « <>#(){}\n » dans le fond et de décider alors que ce n’est pas un fichier (mais ça peut créer quelques incompatibilités si certains utilisent des noms de squelettes bizarres…)
La question qui vient ensuite est de savoir si c’est pertinent de créer un fichier intermédiaire à la volée. Ça a un coût perf, et on peut se dire que c’est inutile, du moment que le squelette compilé est bien mis en cache. Mais on peut voir ça comme une première étape, en attendant de répercuter dans le compilateur l’ensemble des modifs pour accepter le squelette sous forme de chaine dans la cascade des fonctions concernées.
Je ne sais pas si ça résout la question initiale de ce thread, mais c’est une fonctionnalité qui serait surement utile.
a du coup ca permettrait de faire des morceaux de chaînes dynamiques. Et on pourrait même pour le coup créer ces chaîne via un squelette. Je comprend mieux
Le 9 sept. 2013 à 09:03, Fil <fil@rezo.net> a écrit :
Mon idée, en pseudo-code, ce serait d'étendre la fonction récupérer_fond :
en plus de recuperer_fond($nom-du-squelette, $contexte), autoriser recuperer_fond($contenu-du-squelette, $contexte);
avec $contenu-du-squelette = '<BOUCLE(TRUC){toto} ... '
à priori c'est très simple à faire puisqu'"il suffit" d'enregistrer le squelette dans un fichier md5($contenu-du-squelette).html
Bien entendu, il faudrait aussi trouver comment nommer cette nouvelle fonction, faire des tests, faire de la doc, etc.
-- Fil
2013/9/8 Maïeul <maieul@maieul.net>
Le 08.09.13 22:11, Fil a écrit :
Je me demande s'il ne serait pas utile d'introduire un nouveau truc dans
SPIP, qui serait la compilation de squelettes se présentant sous forme
de "chaînes" et non pas de "fichiers". Ca permettrait de résoudre ça,
et mille autres trucs.
Ça ne me parait pas très compliqué de faire une implémentation rapide comme tu le dis, en générant à la volée un fichier squelette md5 correspondant à la chaine passée en fond. Pour détecter que c’est une chaine, il suffirait de se baser sur la présence d’un des caractères « <>#(){}\n » dans le fond et de décider alors que ce n’est pas un fichier (mais ça peut créer quelques incompatibilités si certains utilisent des noms de squelettes bizarres…)
Ouh là attention danger. Il faut plutôt changer la signature ou le nom de la fonction pour traiter l’appel « recupérer un fond indiqué en chaine » (bref en gros il faudrait lui trouver un nom ).
recuperer_code() c’est pas mal, pas plus incompréhensible en tout cas que recuperer_fond() :))
Se pose aussi la question du remplissage du cache… (bien que avec memoization, le problème disparaîtra).
Le 9 sept. 2013 à 12:21, Fil <fil@rezo.net> a écrit :
Se pose aussi la question du remplissage du cache… (bien que avec memoization, le problème disparaîtra).
Ah ça me rappelle que c’est ça qu’il faut faire dans la branche dev : remplacer la méthode de gestion actuelle du cache par celle de filecache du plugin memoization, plus robuste et plus rapide !