Expression régulière...

Olivier GENDRIN <o.gendrin <at> novactive.com> writes:

> Montre tes boucles de test, normalement ça devrait

fonctionner.

Voici une parmi d'autres testées :

<code>
<!-- Bloucle liste des 10 dernieres breves -->
<BOUCLE_breves(BREVES) {titre_mot!==^invisible}
{par date}{inverse} {doublons} {0,10}>
  <li class="menu_item_breve">
    <em>[- (#DATE|affdate_court)]</em> :
    <a href="#URL_BREVE">#TITRE</a>
  </li>
</BOUCLE_breves>
</code>

Merci :slight_smile:

PS. J'ai du couper l'instruction de la boucle parce que
le formulaire d'envoi de messages de la liste sur internet
n'accepte pas les lignes dépassant les 80 caractères...

_______________________________________________

tu peux écrire ...}{... comme ceci ...} {...

celà ne gêne ni spip, ni l'impression, ni le mail

claude

Cet été, pensez aux cartes postales de laposte.net !

claude delattre <claude.delattre <at> laposte.net> writes:

tu peux écrire ...}{... comme ceci ...} {...
celà ne gêne ni spip, ni l'impression, ni le mail

Merci Claude, je vais essayer, mais ce n'est pas toujour évident...

Bon, voici une bonne nouvelle dans ce feuilleton, où je crains
qu'on ait mis la main sur un bug de SPIP lorsqu'il s'agit de filtrer,
dans une boucle, des mots-clés, ou groupe de mots-clés,
par la négation :

<code>
<BOUCLE_breves(BREVES) {type_mot!=invisible}>
  <!-- blabla -->
</BOUCLE_breves>
</code>

<code>
<BOUCLE_breves(BREVES) {titre_mot!=invisible}>
  <!-- blabla -->
</BOUCLE_breves>
</code>

<code>
<BOUCLE_breves(BREVES) {titre_mot!==^invisible}>
  <!-- blabla -->
</BOUCLE_breves>
</code>

Aucun de ces codes ne fonctionne correctement... :frowning:

Bon, j'ai regardé du côté de Php, histoire de voir si je pouvais
contourner le bug, et je crois bien avoir trouvé une méthode
qui a l'air de bien fonctionner jusqu'à là... mais bon, ceci implique
une certaine compléxite dans la boucle SPIP, et je me demande
jusqu'à quel point ce n'est pas pénalisant en terme de réactivité...

Enfin, voici le résultat de mes explorations...

Tout d'abord une boucle SPIP adaptée à cette nouvelle méthode,
je reprends celle de l'exemple précédent pour conserver un peu
de cohérence dans le suivi de ce fil de discussion :

<code>
<!-- Bloucle liste des 10 dernieres breves -->
<BOUCLE_breves(BREVES) {par date}{inverse} {doublons} {0,10}>
  <!-- On verifie, par une fonction Php "breve_mot_invisible", -->
  <!-- que la breve n'est pas associee a un mot-cle commencant -->
  <!-- par "invisible", si c'est le cas, on ne l'affiche pas -->
  [<li class="menu_item_breve">
    (#ID_BREVE|breve_mot_invisible|=={1}|?{
    <em>[- (#DATE|affdate_court)]</em> :
    <a href="#URL_BREVE">#TITRE</a>,''})
  </li>]
</BOUCLE_breves>
</code>

Voici maintenant les codes Php que j'ai réussi à pondre,
ce n'est peut-être pas fait dans les règles de l'art, car j'ai encore
beaucoup beaucoup de lacunes avec ce langage, pour ne pas dire
que je suis carrément nul, mais apparement ça a l'air de fonctionner,
alors bon, si vous voyez des choses à corrigier ou à améliorer,
n'éhsitez surtout pas à le signaler, tout ce qui pourrait simplifier
et/ou rendre le code plus performant, est le bienvenue :slight_smile:

<code>
function titre_mot($id_mot) {
// Fonction pour retourner le "titre" d'un mot-cle ($id_mot)
  $requete = mysql_query("SELECT titre FROM spip_mots
WHERE id_mot=$id_mot");
  $titre = mysql_fetch_assoc($requete);
  mysql_free_result($requete);
  return $titre[titre];
}

function breve_mot_invisible($id_breve) {
// Fonction pour retourner "faux" (= 0 zero) si le titre
// d'un mot-cle d'une breve ($id_breve) commence par "invisible",
// dans tous les autres cas elle returne "vrai" (= 1).
  $mots = array();
  $requete = mysql_query("SELECT id_mot FROM spip_mots_breves
WHERE id_breve=$id_breve");
  while ($ligne = mysql_fetch_assoc($requete))
array_push($mots,$ligne);
  mysql_free_result($requete);
  $res = 1;
  foreach ($mots as $val) {
    $titre = titre_mot($val[id_mot]);
    if (ereg ("^invisible",$titre)) {$res = 0;};
  }
  return $res;
}
</code>

Donc, il y a deux fonctions, la principale intérroge la base MySql
pour récupérer tous les mots-clés associés à la brève dont le
"id_breve" est passé en argument, puis une boucle traite
chaque mot clé pour extraire son titre, à partir de la seconde
fonction qui, à son tour, intérroge la base de données, enfin,
le résultat est testé par une expréssion régulière afin de s'assurer
qu'il ne commence pas par le mot "invisible", si c'est le cas,
la fonction retourne "faux" (= 0), sinon, elle retourne "vrai" (= 1)...

Voilô... j'espère que je ne me suis pas trop compliqué la vie,
en tout cas ça marche bien pour l'instant chez moi, faudra voir
en situation réelle en ligne...

Merci à tous pour vos participations constructives :slight_smile:

Le 17 août 06, à 15:45, FredoMkb a écrit :
je crains
qu'on ait mis la main sur un bug de SPIP lorsqu'il s'agit de filtrer,
dans une boucle, des mots-clés, ou groupe de mots-clés,
par la négation :

ce n'est pas un bug mais une histoire de logique, les differentes solutions que tu as essayé ne donnerais pas logiquement parlant le resultat escompté (me rappelle plus le raisonnement)

je viens de donner la solution dans le thread "Récupérer les rubriques n'ayant pas tel mot-clé" avec l'usage d'une boucle d'exclusion via le critere {doublon}

@+
Nicolas RIQUOIS
http://www.caferoller.com