[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 : 24009 Sujets résolus :  39 %

82 visiteurs en ce moment


Accueil > Forums de discussion >  Création de squelettes > Afficher les objets ayant tous les critères

Afficher les objets ayant tous les critères

par aleks - 21 mars 2012 20:45 - Réponse(s) : 11

Bonjour,

Je cherche à afficher les résultats d’une boucle correspondant à tous les critères (genre d’opérateur ET logique). Typiquement :

  • Afficher les articles ayant tous les mots-clefs

... et, c’est bête, mais pas moyen !

<BOUCLE_a(ARTICLES) {id_mot IN 1,2}> me sort les articles qui ont soit le mot 1 soit le mot 2. Moi je voudrais les articles qui ont 1&2 (donc).

alors un <BOUCLE_b(ARTICLES){id_mot=1}{id_mot=2}> fonctionne. Mais je vois mal comment je peux coder ça si mes mots sont dans un array (GET ou ENV).

J’avais vu traîner un sujet là-dessus il y a quelques temps, mais j’ai eu beau retourner le forum dans tous les sens, pas moyen de remettre la main dessus...

Help ?


  • Bonsoir

    Alors peut-être que je connais...mais désolé pas d’exemples sous la main et pas essayé..

    Il vous faut peut-être écrire <BOUCLE_a(ARTICLES) {id_mot IN !(!1,!2)}>c’est du booléen !.
    ou autre chose de similaire en gardant l’idée :

    Une somme ou "OU" complémentée d’arguments complémentés est égale à un "ET" entre les 2 arguments.
    En espérant que spip réagisse bien là-dessus...? ..


  • <BOUCLE_a(ARTICLES) {id_mot !={id_mot!={1},id_mot!={2}}}>

     ?


  • Malheureusement pas !

    Vu que {id_mot==^(1|2)$} fonctionne pour un OU (équivalent de IN), j’ai tenté également {id_mot==^(1&2)$}pour faire un ET, sans succès...

    Merci pour ton aide


  • C’est un peu tordu, mais en faisant un tableau des mots-clés non désirés, à utiliser comme critère pour exclure ces mots de la sélection :

    mettons que la liste des mots soit obtenue par #GET{mots} :

    1. #SET{exclus,#ARRAY}
    2. <BOUCLE_exclus(MOTS)>
    3. [(#GET{mots}|find{#ID_MOT}|non)
    4. #SET{exclus,#GET{exclus}|push{#ID_MOT}}
    5. ]
    6. </BOUCLE_exclus>
    7.  
    8. <BOUCLE_a(ARTICLES) {id_mot !IN #GET{exclus}}>
    9. ...
    10. </BOUCLE_a>

    Télécharger

    Bon c’est un peu capillo-tracté, une bonne petite expression régulière serait une solution plus élégante.


  • Merci !

    Mais j’ai un peu de mal à suivre... :D

    En supposant que mon article A est lié à une dizaine de mots (de id_mot= 1 à 10 pour faire simple). Si je recherche les articles liés aux mots clefs 1 & 2, la boucle devrait m’afficher l’article A.

    Mais j’ai l’impression que ton #GET{exclus} va me squizzer mes mots 3 à 10 ! Et du coup me zapper l’article A des résultats... Je me trompe ?


  • Ah oui, j’ai fait quelques essais chez moi : résultats farfelus. Soit j’ai fait une erreur de syntaxe, soit c’est le principe qui est mauvais.

    Bon, il y aura bien un pro des expressions régulières pour te dépanner !


  • Le plugin critère mots apporte une solution en introduisant un nouveau critère {mots_selon_id}, spécifique aux mots clefs et aux articles.

    Demeure toujours la question pour transposer ça aux objets en général. Donc pouvoir faire un ET dynamique dans une requête...

    Et s’il y a du pro de l’expression régulière qui passe par là...


  • Basiquement, je voudrais pouvoir générer dynamiquement ce genre de requête :

    critere=xx
    AND critere=yy
    AND critere=zz
    etc.

    Mais dans une boucle, je ne vois pas comment faire...


  • C’est vraiment tarabiscoté, et surtout je n’ai aucune idée de la gourmandise de cette boucle, mais ça semblerait marcher :

    • S’il y a plusieurs critères dans l’environnement, on trie dans notre table selon les différents critères et on repère les doublons :
      1. <BOUCLE_criteres(CONDITION){si #ENV{critere}|count|>{1}}>
      2. <BOUCLE_a(TABLE)>
      3. [(#SET{critere,[(#ENV{critere}|table_valeur{#COMPTEUR_BOUCLE|moins{1}})]})]
      4. <BOUCLE_b(TABLE){critere=#GET{critere}}>
      5. [(#GET{doublon}|find{#ID_CHAMP}|oui)#SET_PUSH{resultats,#ID_CHAMP}]<br />
      6. #SET_PUSH{doublon,#ID_CHAMP}
      7. </BOUCLE_b>
      8. </BOUCLE_a>

      Télécharger

    • Puis on affiche les résultats :
      1. <BOUCLE_resultats(TABLE){id_champ IN #GET{resultats}}{autres critères...}>
      2. #TITRE etc.
      3. </BOUCLE_resultats>
      4. </BOUCLE_criteres>

      Télécharger

    • Si un seul critere on affiche directement les résultats :
    1. <BOUCLE_critere(CONDITION){si #ENV{critere}|count|=={1}}>
    2. <BOUCLE_c(TABLE){critere=#ENV{critere}}{autres critères...}>
    3. #TITRE etc.
    4. </BOUCLE_c>
    5. </BOUCLE_critere>

    Télécharger

    S’il y a mieux, je suis très preneur !


  • Bonsoir,

    Je tente ma chance :

    1. <BOUCLE_test(MOTS) {id_mot IN #GET{mots}} {id_article} {doublons}>
    2. </BOUCLE_test>
    3.  
    4. <BOUCLE_afficher(MOTS) {id_mot IN #GET{mots}} {doublons}>
    5. </BOUCLE_afficher>
    6. Cette partie s'affiche si l'article n'est pas associé à tous les mots contenus dans l'array.
    7. </B_afficher>
    8. Cette partie s'affiche si l'article est associé à tous les mots.
    9. <//B_afficher>

    Télécharger

    Je n’ai pas testé... Je serais curieux de savoir si ça passe !


  • D’ailleurs, l’expression régulière semble difficilement possible : les regex des boucles interrogent les champs sql un à un, non ? Ca expliquerait que le "AND" ne fonctionne pas.

    (je dis une bêtise ?)




Répondre à la question

« Afficher les objets ayant tous les critères »

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 ?