[SPIP Zone] Creation d'un critere multimot

J’essaye de realiser un nouveau critere multimo, en fait le critere realise l’intersection des objects par rapport aux mots.

<BOUCLE_intersection(ARTICLES){multimot mot1,mot2,mot3}>

function critere_multimot_dist($idb, &$boucles, $crit) {

//on recupere la liste des parametres et on la transforme en vecteur
$param = $crit->param;
$params = $param[0][0]->texte;

$mots = explode(",", $params);

$not = $crit->not;
$cond = $crit->cond;
$op = ‹ = ›;

foreach($mots as $mot) {

$texte = new Texte;
$texte->texte = « titre_mot= ».$mot;

$args = array( new Texte, array($texte));

$args[0]->texte = ‹ titre_mot ›;
$args[0] = array($args[0]);
$args[1][0]->texte = $mot;
$crit = new Critere;
$crit->op = ‹ = ›;
$crit->not = $not;
$crit->cond = $cond;
$crit->param = $args;

// Applique le critere
$res = calculer_critere_DEFAUT($idb, $boucles, $crit);

// Gestion d’erreur
if (is_array($res)) erreur_squelette($res);
}

}

Cela fonctionne tres bien sauf que je ne peut pas mettre de #ENV{listedemot} en argument du filtre ce qui est vraiment dommage.

AMAZIGH Aneglus a écrit :

J'essaye de realiser un nouveau critere multimo, en fait le critere realise l'intersection des objects par rapport aux mots.

### <BOUCLE_intersection(ARTICLES){multimot mot1,mot2,mot3}>

function critere_multimot_dist($idb, &$boucles, $crit) {

//on recupere la liste des parametres et on la transforme en vecteur
$param = $crit->param;
$params = $param[0][0]->texte;

$mots = explode(",", $params);

$not = $crit->not;
$cond = $crit->cond;
$op = '=';

foreach($mots as $mot) {

       $texte = new Texte;
       $texte->texte = "titre_mot=".$mot;

       $args = array( new Texte, array($texte));

       $args[0]->texte = 'titre_mot';
       $args[0] = array($args[0]);
       $args[1][0]->texte = $mot;
       $crit = new Critere;
       $crit->op = '=';
       $crit->not = $not;
       $crit->cond = $cond;
       $crit->param = $args;

       // Applique le critere
       $res = calculer_critere_DEFAUT($idb, $boucles, $crit);

       // Gestion d'erreur
       if (is_array($res)) erreur_squelette($res);
}

}

Cela fonctionne tres bien sauf que je ne peut pas mettre de #ENV{listedemot} en argument du filtre ce qui est vraiment dommage.

Yes, j'ai eut la même problématique sur un système de "boutique" détourné
donc, je confirme, je ne pouvais pas mettre dans l'ordre mon array via #ENV{maliste} je voulais contourner le regexp car #ENV mets des '' '10,24,62,7'
peut-être une question de sécu ?

> Cela fonctionne tres bien sauf que je ne peut pas mettre de
> #ENV{listedemot} en argument du filtre ce qui est vraiment dommage.
>
Yes, j'ai eut la même problématique sur un système de "boutique" détourné
donc, je confirme, je ne pouvais pas mettre dans l'ordre mon array via
#ENV{maliste} je voulais contourner le regexp car #ENV mets des ''
'10,24,62,7'
peut-être une question de sécu ?

Oui, enfin, c'est une question de cohérence interne du code ; mais c'est
vrai qu'il faudrait que le compilateur prévoie une méthode pour récupérer
une liste en "interprétant" les virgules, car c'est l'usage le plus courant
et le plus intuitif.

En revanche je n'ai pas d'idée de syntaxe (un filtre ne convient pas car le
résultat reste dans les '').

Peux-tu faire un ticket sur http://trac.rezo.net/trac/spip/newticket ?

-- Fil

Je dois mal m'exprimer.

Lorsque je met le critère {multimo mot1,mot2,mot3} celui ci est
correctement interprèté :

$param = $crit->param;
$params = $param[0][0]->texte; \\ ici on récupère mot1,mot2,mot3 comme
un unique paramètre du type texte

$mots = explode(",", $params); \\ ici je le transforme en vecteur

tout cela ce fait correctement et j'ai bien l'intersection que je désire.

Mais lorsque j'appelle la page avec en GET liste=mot1,mot2,mot3 (les ,
sont traduit en %quelquechose)

et que j'utilise le critère {multimot #ENV{liste}}, le critère ne
fonctionne plus: dans $params = $param[0][0]->texte il y a #ENV{liste}
comme un texte et non pas le contenu de celui ci.

On 12 Jun, 2006, at 23:04, AMAZIGH Aneglus wrote:

Je dois mal m'exprimer.

Lorsque je met le critère {multimo mot1,mot2,mot3} celui ci est
correctement interprèté :

$param = $crit->param;
$params = $param[0][0]->texte; \\ ici on récupère mot1,mot2,mot3 comme
un unique paramètre du type texte

$mots = explode(",", $params); \\ ici je le transforme en vecteur

tout cela ce fait correctement et j'ai bien l'intersection que je désire.

Mais lorsque j'appelle la page avec en GET liste=mot1,mot2,mot3 (les ,
sont traduit en %quelquechose)

et que j'utilise le critère {multimot #ENV{liste}}, le critère ne
fonctionne plus: dans $params = $param[0][0]->texte il y a #ENV{liste}
comme un texte et non pas le contenu de celui ci.

c'est à toi de lui dire d'interpreter le paramètre en faisant un truc comme cela:

  $mots = array_shift($params);
  $mots = explode(
      calculer_liste($mots, array(), $boucles, $parent)
      );

regarde dans ecrire/public/criteres.php

Pierre

c'est à toi de lui dire d'interpreter le paramètre en faisant un truc
comme cela:

        $mots = array_shift($params);
        $mots = explode(
                        calculer_liste($mots, array(), $boucles, $parent)
                        );

regarde dans ecrire/public/criteres.php

Pierre

Justement, j'ai fait un truc dans ce genre

avec le critère {multimot #ENV{liste}}

$params = calculer_liste($crit->param[0], array(),
    $boucles, $boucles[$idb]->id_parent);

print_r($params); \\ ceci affiche dans le navigateur
interdire_scripts(entites_html($Pile[0]['liste']))

$mots = explode(",", $params);

print_r($mots); \\Array ( [0] =>
interdire_scripts(entites_html($Pile[0]['liste'])) )

la je me dit dans params il y a exactement du code php, donc je fais
un eval sa fonctionne pas et si je fais une affectation non plus.

On 13 Jun, 2006, at 14:05, AMAZIGH Aneglus wrote:

c'est à toi de lui dire d'interpreter le paramètre en faisant un truc
comme cela:

        $mots = array_shift($params);
        $mots = explode(
                        calculer_liste($mots, array(), $boucles, $parent)
                        );

regarde dans ecrire/public/criteres.php

Pierre

Justement, j'ai fait un truc dans ce genre

avec le critère {multimot #ENV{liste}}

$params = calculer_liste($crit->param[0], array(),
    $boucles, $boucles[$idb]->id_parent);

print_r($params); \\ ceci affiche dans le navigateur
interdire_scripts(entites_html($Pile[0]['liste']))

$mots = explode(",", $params);

print_r($mots); \\Array ( [0] =>
interdire_scripts(entites_html($Pile[0]['liste'])) )

la je me dit dans params il y a exactement du code php, donc je fais
un eval sa fonctionne pas et si je fais une affectation non plus.

oui, excuse moi, me suis trompez sur ce point là.

calculer_liste est appelé au moment de la première phase de calcul du cache. A ce moment là, on ne connait pas la valeur de #ENV (ou de la balise englobante), les phases de calcul du cache sont expliquées sur spip-contrib.net/spikini (qq part dans la colonne de gauche).

donc ce que calculer_liste te retourne, c'est le code php qui calculera la valeur de ENV "plus tard" (quand le cache html sera calculé), donc si tu veux faire un traitement dessus, ce que tu dois mettre dans le where est donc du code php non interpreté (regarde dans ecrire/public/criteres.php comme je disais).

Mais alors, dans ce cas (je suis pas sûr parce que j'ai pas le début de la conversation sur prq tu fais ton critère), ça revient à utiliser le critère IN et là tu auras le problème que Romy décrit...

Pierre

calculer_liste est appelé au moment de la première phase de calcul du
cache. A ce moment là, on ne connait pas la valeur de #ENV (ou de la
balise englobante), les phases de calcul du cache sont expliquées sur
spip-contrib.net/spikini (qq part dans la colonne de gauche).

Je travaille sur la 1.9 j'ai regarde l'article correspondant
http://doc.spip.org/@Le-compilateur-de-squelettes (y a rien
d'intéressant sur l'article de spikni (en tout cas en diagonale))

donc ce que calculer_liste te retourne, c'est le code php qui
calculera la valeur de ENV "plus tard"

le problème c'est qu'il doit pas le calculer plus tard... je renvoie
plus bas le code de mon critère.

utiliser le critère IN

le critère IN réalise "une union" mais ce que je veux faire c'est
l'intersection.

### <BOUCLE_intersection(ARTICLES){multimot mot1,mot2,mot3}>

function critere_multimot_dist($idb, &$boucles, $crit) {

//on récupère la liste des paramètres et on la transforme en vecteur
$param = $crit->param;
$params = $param[0][0]->texte;

$mots = explode(",", $params);

$not = $crit->not;
$cond = $crit->cond;
$op = '=';

foreach($mots as $mot) {

       $texte = new Texte;
       $texte->texte = "titre_mot=".$mot;

       $args = array( new Texte, array($texte));

       $args[0]->texte = 'titre_mot';
       $args[0] = array($args[0]);
       $args[1][0]->texte = $mot;
       $crit = new Critere;
       $crit->op = '=';
       $crit->not = $not;
       $crit->cond = $cond;
       $crit->param = $args;

       // Applique le critere
       $res = calculer_critere_DEFAUT($idb, $boucles, $crit);

       // Gestion d'erreur
       if (is_array($res)) erreur_squelette($res);
}

}