[spip-dev] compilo, boucle et array of array

Comme amélioration possible du compilo, serait il possible de boucler sur une liste PHP (une array, en VO) plutot que forcément sur du SQL?
Ca permetterait de simplifier la gestion MVC de manière propre.

M.

Salut,

J'y ai pensé aussi, j'ai vite regardé le code sur le moment.
Mais je n'etais pas sûr si ca vallait le coup de se donner le mal de le faire. Si apparement ca interesse plus que juste moi, pourquoi pas.

Mais où inserer l'abstraction?

Pierre

Mathieu Lecarme wrote:

Pierre Andrews a écrit :

Salut,

J'y ai pensé aussi, j'ai vite regardé le code sur le moment.
Mais je n'etais pas sûr si ca vallait le coup de se donner le mal de le faire. Si apparement ca interesse plus que juste moi, pourquoi pas.

Il faut surtout voir si ça a une chance d'être intégré dans le core.

Mais où inserer l'abstraction?

Les langages de templates utilisent tous un truc appelé contexte, le compilo aussi (c'est la dedans que sont stocké les #MACHIN qui viennent pas de boucles), il suffirait de pouvoir piocher et écrire dedans.

M.

Hello,

Le probléme est le suivant, dans inc-compilo.php3:
- ligne 265 à 277 on fait une boucle while avec un spip_abstract_fetch
et
- ligne 287 à 334 on fait la requette à mysql.

Dans un sens, je pense qu'il faudrait remplacer cela:
- soit par une boucle générique sur un tableau retourné plus tôt par soit un appel mysql soit un appel à une fonction
- soit en allant dans spip_abstract_fetch et spip_abstract_select (ce qui me parrait moins intuitif)

Alors 2 questions se posent:

- quand est-ce qu'on sait quand il faut faire un query et quand on doit appeler une fonction. Il faut donc que la syntaxe de l'ecriture des boucles soit compatible avec cela.

- comment appeler la fonction, surtout quels critéres lui passer.

Deux problémes se posent dans l'implementation:
- quelle est la perte de performance si on doit passer la requette sql dans un tableau, puis reparcourir le tableau?
- quelle est la perte de performance à faire de la reflexion et trouver le bon nom de fonction à appeler?
- la recursivité est traitée comme un cas special. Il faut aussi trouver comment le rendre compatible avec l'appel d'une fonction.

Si tu veux juste t'amuser à "piocher" dans le contexte, tu peux implementer ta propre balise et faire des appels à index_pile comme tu veux. Le problème est que tu pers un peu de la "souplesse" de faire ca en syntaxe spip => tu dois coder une nouvelle balise à chaque coup.

Pierre

Mathieu Lecarme wrote:

Pierre Andrews a écrit :

Hello,

Le probléme est le suivant, dans inc-compilo.php3:
- ligne 265 à 277 on fait une boucle while avec un spip_abstract_fetch
et
- ligne 287 à 334 on fait la requette à mysql.

Dans un sens, je pense qu'il faudrait remplacer cela:
- soit par une boucle générique sur un tableau retourné plus tôt par soit un appel mysql soit un appel à une fonction
- soit en allant dans spip_abstract_fetch et spip_abstract_select (ce qui me parrait moins intuitif)

Alors 2 questions se posent:

- quand est-ce qu'on sait quand il faut faire un query et quand on doit appeler une fonction. Il faut donc que la syntaxe de l'ecriture des boucles soit compatible avec cela.

- comment appeler la fonction, surtout quels critéres lui passer.

je pensais passer par un tableau, plutot qu'une fonction, mais c'est pas bête.

Deux problémes se posent dans l'implementation:
- quelle est la perte de performance si on doit passer la requette sql dans un tableau, puis reparcourir le tableau?

surtout pas!!!
Si tu veux généraliser, tu utilises un objet qui a une methode next() comme ça tu peux utiliser le SQL proprement ou lire les lignes d'un tableau.

- quelle est la perte de performance à faire de la reflexion et trouver le bon nom de fonction à appeler?

une fois en cache, c'est pas grave.

- la recursivité est traitée comme un cas special. Il faut aussi trouver comment le rendre compatible avec l'appel d'une fonction.

Si tu veux juste t'amuser à "piocher" dans le contexte, tu peux implementer ta propre balise et faire des appels à index_pile comme tu veux. Le problème est que tu pers un peu de la "souplesse" de faire ca en syntaxe spip => tu dois coder une nouvelle balise à chaque coup.

euh, il faut que je regarde comme il faut, je suis plus trop, là.

M.

Mathieu Lecarme wrote:

je pensais passer par un tableau, plutot qu'une fonction, mais c'est
pas bête.

mais comment tu remplis le tableau?
Ce que je pensais, c'etait un truc du genre:

<BOUCLE_blabla(MAFONCTION) {id_rubrique} {par date} {0,1}>
blabla #CHAMP
</BOUCLE_blabla>

spip se rend compte qu'il n'existe pas de table MAFONCTION (elle n'est
pas déclarée dans le fichier de config),
alors, il regarde si la fonction est déclarée.

Si c'est la cas, alors il va faire un appel à la fonction:

$critere = ('id_rubrique' => 10);

$result = $mafonction($critere);

et s'attend à ce que l'on puisse faire:

$ligne = next($result);

où ligne sera une hash table "nom_champ => valeur", comme si on avait
une requette mysql.

> Deux problémes se posent dans l'implementation: - quelle est la
> perte de performance si on doit passer la requette sql dans un
> tableau, puis reparcourir le tableau?
>
>
surtout pas!!! Si tu veux généraliser, tu utilises un objet qui a une
methode next() comme ça tu peux utiliser le SQL proprement ou lire
les lignes d'un tableau.

> - quelle est la perte de performance à faire de la reflexion et
> trouver le bon nom de fonction à appeler?
>
>
une fois en cache, c'est pas grave.

il faut pas toujours se reposer sur le cache :wink:

> - la recursivité est traitée comme un cas special. Il faut aussi
> trouver comment le rendre compatible avec l'appel d'une fonction.
>
> Si tu veux juste t'amuser à "piocher" dans le contexte, tu peux
> implementer ta propre balise et faire des appels à index_pile comme
> tu veux. Le problème est que tu pers un peu de la "souplesse" de
> faire ca en syntaxe spip => tu dois coder une nouvelle balise à
> chaque coup.
>
>
euh, il faut que je regarde comme il faut, je suis plus trop, là.

va voir:
www.spip-contrib.net/spikini/NouveauCompilo

Pierre