[ar] [ca] [cpf] [de] [en] [es] [fr] [it]

Ce forum d’entraide est recommandé pour les utilisateurs et utilisatrices occasionnels de SPIP (Système de publication pour l’Internet). Avant de poser une question, faites une recherche sur ce site, consultez les liens utiles. Si vous ne trouvez pas de réponse, postez votre message dans la rubrique appropriée, avec un titre explicite.

Sujets : 23974 Sujets résolus :  39 %

83 visiteurs en ce moment


Accueil > Forums de discussion >  Création de squelettes > Faire un ET logique sur 2 critères dans une boucle

Faire un ET logique sur 2 critères dans une boucle Résolu

par PBII - 3 septembre 2003 00:27 - Réponse(s) : 9

Je voudrais avoir tous les articles récents de 2 secteurs (le 2 et le 3). Est il possible de faire un "ET" logique sur 2 valeurs pour un même critère.

J’imaginais bien une syntaxe de ce style :

<BOUCLE_articles_recents(ARTICLES){id_secteur=2 OR id_secteur=3} {par date} {inverse} {0,15}>

Je sais que si je déplace mes rubriques 2 et 3 et que je les met en sous-rubrique d’une rubrique 4 cela règlerait ce problème (un id_secteur=4 ferait alors l’affaire). Mais pour d’autres raisons, mes rubriques 2 et 3 doivent rester à la racine.

Egalement, si je fais 2 boucles (pour secteur 2 et 3) j’aurrai bien tous les articles, mais ils seront triés par date séparément, hors je ne le veux pas.

Voir en ligne - PBII


  • Essaie {id_rubrique==^(3|4)$} (c’est une expression régulière, d’où la syntaxe bizarre).


  • < #2 > Faire un ET logique sur 2 critères dans une boucle  ˆ
    par survivreausida.net - 19 septembre 2003 09:42

    Comment EXCLURE plusieurs critères dans une boucle :

    Pour sélectionner les mots qui n’appartiennent pas aux groupes de mots-clés 7-10.

    Je ne comprend pas complètement l’expression régulière indiquée. S’agit-il de :

    id_groupe !=^(7|8|9|10)$

    ou id_groupe= !^(7|8|9|10)$

    ou encore id_groupe != !(7|8|9|10)$

    Fil, un petit décodage de l’expression régulière permettrait d’en comprendre le principe pour les autres cas de figure.


  • Solution et décodage :

    {id_groupe!==^(9|10|7)$}

    ! : not
    == : regexp
    ^ / $: debut/fin de l'expression
    ( ... | ... )  : alternative

  • Est-ce que l’astuce de l’expression régulière fonctionne aussi avec une comparaison de chaine par exemple :
    Je veux tous les articles récents sauf ceux qui on le mot clé _edito ou _important.
    Ma syntaxe ne marche pas : voici ce que j’ai mis :

    < BOUCLE_quoi_de_neuf(ARTICLES) par date inverse doublons titre_mot !==^("_edito"|"_important")$0,5>

  • (#TITRE
  • < / BOUCLE_quoi_de_neuf>

    (Note : ce n’est pas un ou exclusif que je cherche)

    Merci


  • < #5 > Faire un ET logique sur 2 critères dans une boucle  ˆ
    par Avi Philippe - 1er novembre 2004 12:22

    Essai de solution :

    Dans cette solution il s’agit de trouver les articles qui ont en commun des mots clés, sachant que ces mots clés se trouvent dans des groupes de mots clés différents. (Je sens déjà que certains grincent des dents mais cela correspond à l’utilisation que je souhaite en faire). En clair, je veux récupérer la liste des articles qui ont les mêmes mots clés dans n groupe de mot clé mais il faut pour cela qu’il y est au moins un mot clé choisi pour chaque groupe de mot clés.

    Dans la page en question il s’agit de recevoir les mot clés par url ou post. Le premier mot clé sera rangé dans un id_mot (autant utiliser SPIP et ses boucles efficaces). Les suivants seront sous la forme id_mot2 , id_mot3 ... Le nombre ne semble pas être limité. Pour ma part j’en fais 4.

    Le script est le suivant (voir les remarques à l’interieur du script pour des explications) :

    <?php
           <?$mots_cle1=array();
           // trouve tous les articles ayant id_mot mais ausii dans id_mot1 selectionné et mettre dans tableau $mots_cle1
           // le id_mot1 fait parti du grp de mot clé 9 pour l exemple
           <BOUCLE_art1(ARTICLES){id_mot}>
                   $mots_cle1[#ID_ARTICLE] = array(<BOUCLE_mots1(MOTS){id_article}{id_groupe=9}{", "}>'[(#ID_MOT|texte_script)]'</BOUCLE_mots1>);
           </BOUCLE_art1>
           // range dans un tableau
           $list_art_cle1 = array();$j=0;
           // dans le tableau mots_cle1 contenant les articles avec id_mot ET tous les mots clés du grp 9
           // cherche l'article avec en particulier le mot clé id_mot1
                   foreach ($mots_cle1 as $cle => $element)
                           {
                                   $key = (array_search($id_mot1 , $element));
                                   if ($key === false)
                                   {
                                   // permet une verif
                                   //echo "il n'y pas d'id dans cette ligne = ".$key."<br>";
                                   }
                                   else
                                   {
                                   //permet une verif
                                   //echo "id à la ligne = ".$key."<br>";
                                           if (array_key_exists('0', $element))
                                                   {
                                                   $list_art_cle1["$j"] = $cle;$j++;
                                                   }
                                   }
                           }              
                    // pour une vérif
                    //echo '<pre> annee<br>';
                    //print_r($list_art_cle1);
                    //echo '</pre>';

    ?>

    On peut donc faire autant de fois que nécessaire ce script en changeant id_mot1 par id_mot2 ainsi que tous les indices 1 en 2 puis 1 en 3 autant de fois qu’il y a de ET.

    On récupère ainsi les tableaux et on trouve ce qu’ils ont en commun : les articles tant cherchés.

    <?php
                   // la fonction suivante permet de recuperer les articles communs aux tableaux precedement créés
                   // exemple sur 3 tableaux
                   $intersec = array_intersect ($list_art_cle1 , $list_art_cle3 , $list_art_cle3);
                   // affichage des articles concernés par le ET sur les mots clés
                   foreach ($intersec as $element)
                   {
                           $SQL ="SELECT * FROM `shim_spipnet`.spip_articles WHERE id_article='" . $element . "' ";
                           $res = mysql_query($SQL);
                           while($valeur=mysql_fetch_array($res))
                           {
    ?>
              <a href="article.php3?id_article=<? echo $valeur['id_article']; ?>"><? echo $valeur["titre"]; ?></a> <BR>
    <?php
                           }

                   }
    ?>

    En esperant que cette contribution serve à certains.
    Merci à l’équipe de SPIP.

    Voir en ligne - geea.org


  • < #6 > Faire un ET logique sur 2 critères dans une boucle  ˆ
    par richard - 3 novembre 2004 10:12

    Bonjour

    j’aime bien cette solution de ^(1|2|6)$ que je trouve trés efficace... Mais, y a t il moyen de faire de meme en appelant plusieur rubriue dans ma barre d’adresse...

    ma boucle est comme ça :
    ...

    si je veux que la boucle agisse sur plusieurs rubrique ? comment doit on faire ? ^puisqu’on ne peut pas mettre ^(1|2|6)$ dans la barre d’adresse...

    Merci d’avance


  • Une autre solution beaucoup plus simple est la suivante (sauf erreur de ma part...) :
    Par exemple pour une intersection sur 3 mots clefs on écrit simplement :

    <BOUCLE_1(ARTICLES){id_rubrique}{titre_mot=mot1}>
    <BOUCLE_2(ARTICLES){id_rubrique}{id_article=#ID_ARTICLE}{titre_mot=mot2}>
    <BOUCLE_3(ARTICLES){id_rubrique}{id_article=#ID_ARTICLE}{titre_mot=mot3}>

    #TITRE

    </BOUCLE_3>
    </BOUCLE_2>
    </BOUCLE_1>

    Explication : on récupère tous les articles qui nous intéresse ayant le mot clef mot1, puis la deuxième boucle est une boucle qui ne prend qu’un élement, un des articles en question, mais qui le refiltre avec le deuxième mot,etc...


  • < #8 > Faire un ET logique sur 2 critères dans une boucle  ˆ
    par arno - 1er décembre 2010 16:34

    Il faut utiliser le crière “IN”

    Dans l’exemple précédent cela donne :

    <BOUCLE_articles_recents(ARTICLES){id_secteur IN 2,3} {par date} {inverse} {0,15}>

    Cela doit être valable sur les versions de SPIP au delà de 1.8 (de mémoire)


  • Bonjour,

    Je n'arrive pas à utiliser l'expression reguliere pour une liste de valeurs possible de ma variable (ici ID_ARICLE) ...
    Je souhaiterais mettre deux valeurs dans ma conditions, c'est à dire que l'inclusion se fasse pour les articles 7, 34, 21. Quelqu'un sait quelle est la syntaxe ?
    Ci-dessou mon code, pour l'article 7 uniquement

    [(#ID_ARTICLE|=={7}|oui) <INCLURE{fond=fichierX}{id_article}>]

    J'ai essayé en vain :

    [(#ID_ARTICLE|=={^(7|34|21)$}|oui) <INCLURE{fond=fichierX}{id_article}>]


    Merci !



    Répondre à la question

    « Faire un ET logique sur 2 critères dans une boucle  »

    Mots-clés

    Vous pouvez étiqueter cette page de forum avec les mots-clés qui vous semblent les plus appropriés ; ils permettront aux prochains visiteurs du site de mieux se repérer :


    Installation, mise à jour

    Utilisation de l’espace privé

    Administration, gestion, configuration du site

    Créer ses squelettes

    Qui êtes-vous ?