[spip-dev] Bug ? dans une boucle recherche

Bonsoir,

  SPIP 1.8, CVS à jour

  Je suis en train de regarder de près les boucles avec le critère recherche.

  Je veux générer une pagination pour afficher les résultats (c'est encore des bouts de PHP mais c'est léger). J'ai donc la boucle suivante :

<h2>Résultat de la recherche de «&nbsp;#RECHERCHE&nbsp;»</h2>
<BOUCLE_nb(ARTICLES){recherche}{id_secteur=3}{age_redac<=0}></BOUCLE_nb><?php $pagination = pagination('#TOTAL_BOUCLE',10,$debut_resultat,'recherche-%s.html?recherche=#RECHERCHE') ?><//B_nb>
<?php echo $pagination ?>

  ma variable $pagination n'est pas affectée

Si je fais :

<BOUCLE_nb(ARTICLES){recherche}{id_secteur=3}{age_redac<=0}>.</BOUCLE_nb><?php $pagination = pagination('#TOTAL_BOUCLE',10,$debut_resultat,'recherche-%s.html?recherche=#RECHERCHE') ?></B_nb>
<?php echo $pagination ?>

idem, les '.' ne sont pas affichés

Si je fais

<BOUCLE_nb(ARTICLES){recherche}{id_secteur=3}{age_redac<=0}>#ID_ARTICLE</BOUCLE_nb><?php $pagination = pagination('#TOTAL_BOUCLE',10,$debut_resultat,'recherche-%s.html?recherche=#RECHERCHE') ?></B_nb>
<?php echo $pagination ?>

c'est bon, $pagination contient bien ce que j'attends et les id des articles s'affichent

si j'enlève le critère recherche, les 3 boucles donnent le résultat attendu

Tout se passe comme si une boucle avec le critère recherche ne renvoyait rien s'il n'y a pas une balise #QUELQUECHOSE dedans

C'est curieux

Cordialement

J'ai contourné le bug de la manière suivante :

<BOUCLE_nb(ARTICLES){recherche}{id_secteur=3}{age_redac<=0}>[(#ID_ARTICLE>avale)]</BOUCLE_nb><?php $pagination = pagination('#TOTAL_BOUCLE',10,$debut_resultat,'recherche.php3?recherche=#RECHERCHE&debut_resultat=%s') ?><//B_nb>

avale étant une fct qui renvoie une chaîne vide

Cordialement

Bonsoir,

  SPIP 1.8, CVS à jour

  Je suis en train de regarder de près les boucles avec le critère
recherche.

  Je veux générer une pagination pour afficher les résultats (c'est
encore des bouts de PHP mais c'est léger). J'ai donc la boucle suivante
:

<h2>Résultat de la recherche de «&nbsp;#RECHERCHE&nbsp;»</h2>
<BOUCLE_nb(ARTICLES){recherche}{id_secteur=3}{age_redac<=0}></
BOUCLE_nb><?php $pagination =
pagination('#TOTAL_BOUCLE',10,$debut_resultat,'recherche-%s.html?
recherche=#RECHERCHE') ?><//B_nb>
<?php echo $pagination ?>

  ma variable $pagination n'est pas affectée

....

si j'enlève le critère recherche, les 3 boucles donnent le résultat
attendu

Tout se passe comme si une boucle avec le critère recherche ne
renvoyait rien s'il n'y a pas une balise #QUELQUECHOSE dedans

C'est curieux

C'est un bug, c'est corrigé mais ce n'est pas curieux.
L'ancien compilateur n'analysait pas le corps de la boucle,
ce qui fait qu'une boucle sans balise #QQCH, qui ne sert qu'à calculer le nombre N d'éléments
conformes aux critères, était compilé par N appels au serveur SQL, alors qu'un unique appel
avec COUNT ou numrows suffit (je pense que ça été la raison de l'écroulement du serveur qui
gérait la pétition Sauvons La Recheche, dès qu'elle a commencé à avoir du succès).

Le nouveau compilateur analyse ce corps et fait automatiquement cette optimisation s'il n'y pas
de balise dans le corps. J'avais malheureusement mal géré le critère recherche dans le cas du corps
sans balise, c'est donc réparé.

Désolé de la perte de temps.

      Emmanuel

Inutile de t'excuser :slight_smile: on essuie un peu les plâtres mais c'est avec des tests grandeur que l'on tombe sur les bugs :wink:

Sinon, je suis enchanté des nouvelles possibilités de personnalisation du compilo. J'ai redéfini la balise #FORMULAIRE_RECHERCHE pour rajouter un onfocus et un onblur, ça marche du tonnerre.

Merci et A+

Jean-Luc Béchennec wrote:

boah, c'est pas compliqué, tu repères la fct balise_FORMULAIRE_RECHERCHE_dist dans le code de SPIP, tu copies-colles dans mes_fonctions.php3, tu retires le _dist et tu transformes ce qui est affecté à $formulaire_recherche avec les \ de \ qui vont bien :slight_smile: et le tour est joué :slight_smile:

function balise_FORMULAIRE_RECHERCHE($p) {
  if ($p->fonctions) {
    list(, $lien) = each($p->fonctions); // le premier est un url
    while (list(, $filtre) = each($p->fonctions))
      $filtres[] = $filtre; // les suivants sont des filtres
    $p->fonctions = $filtres;
  }
  if (!$lien) $lien = 'recherche.php3';

  $formulaire_recherche = "\"<form action='$lien' method='get' class='formrecherche'><input type='text' id='formulaire_recherche' size='20' class='formrecherche' name='recherche' value='\" . _T('info_rechercher') . \"' onfocus='if (this.value == \\\"\" . _T('info_rechercher') . \"\\\") { this.value = \\\"\\\"; }' onblur='if (this.value == \\\"\\\") { this.value = \\\"\" . _T('info_rechercher') . \"\\\"; }' /></form>\"";

  $p->code = "((lire_meta('activer_moteur') != 'oui') ? '' :
  $formulaire_recherche)";

  $p->statut = 'html';
  return $p;
}

On peut donc corrigé tout le html des formulaire generé avec cela et les personnalisé à fond ou ça marche juste pour formulaire recherche

j'ai essayé ça

function balise_FORMULAIRE_INSCRIPTION($p) {
balise_distante_interdite($p);
$p->code = '((lire_meta("accepter_inscriptions") != "oui") ? "" :
  ("<"."?php include_local(\'inc-formulaires2.php3\'); lang_select(\'".$GLOBALS[\'spip_lang\']."\'); echo formulaire_inscription(\"redac\"); lang_dselect(); ?".">"))';

$p->statut = 'php';
return $p;
}

et dans inc-formulaire2.php3 j'ai modifier le code générer par le formulaire mais ça semble pas fonctionner par contre pour le moteur de recherche effectivement sa marche sans probleme

Tu n'as plus précis comme description ?

      Emmanuel

A l'heure actuelle dans inc-formulaire.php
sur function formulaire_inscription($type)
le code généré est du type:
    "<form method='get' action='$url' style='border: 0px; margin: 0px;'>\n" .
    "<div><b>"._T('form_pet_votre_nom')."</b></div>" .
    "<div><input type=\"text\" class=\"forml\" name=\"nom_inscription\" value=\"\" size=\"30\" /></div>" .
    "<div><b>"._T('form_pet_votre_email')."</b></div>" .
    "<div><input type=\"text\" class=\"forml\" name=\"mail_inscription\" value=\"\" size=\"30\" /></div>" .
    "<div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" /></div>" .
    "</form>";

dans inc-formulaire2.php c'est cette partie que j'ai modifié avec qqchose comme cela:
    "<form method='get' action='$url' >\n" .
    "<label for=\"nom_inscription\">"._T('form_pet_votre_nom')."</label>" .
    "<input type=\"text\" name=\"nom_inscription\" id=\"nom_inscription\" value=\"\" /> <br />" .
    "<label for=\"mail_inscription\">"._T('form_pet_votre_email')."</label>" .
    "<input type=\"text\" name=\"mail_inscription\" id=\"mail_inscription\" value=\"\" /> <br />" .
    "<input type=\"submit\" name=\"Valider\" value=\""._T('bouton_valider')."\" />" .
    "</form>";

oui mais en quoi ça ne fonctionne pas ?

      Emmanuel

ça ne m'affiche rien, quoi la balise #FORMULAIRE_INSCRIPTION ne genere plus rien

Le pb est ailleurs, tu as du modifier autre chose que ce que tu indiquais dans ton mail précédent.

      Emmanuel