Ne pas afficher les mots clés qui ne sont rattachés à aucun élément

Dans mot-dist.html, un menu liste les autres mots-clés du même groupe. Ce que je désire c’est ne faire apparaitre que les mots-clés attribué à au moins un article.

Dans le squelette mot par défaut, le menu de navigation affiche tous les mots-clés du même groupe. Cela peut poser deux problèmes. Le premier, une énumération trop longue, qu’on peut résoudre par un critère limitant le nombre d’occurences affichées. Le deuxième est l’affichage de mots-clés auquels aucun article (ou rubrique, site, etc.) n’est lié. Celà arrive lorsque l’on saisit toute une liste de mots-clés au début de la construction d’un site. Donc voici le principe qui permet de n’afficher que les mots-clés ayant au moins un article lié.

la boucle expliquée :

Menu de navigation mots-clés : les autres mots-clés du meme groupe : rajout : exclusion des mots non attribues

Le squelette débute une boucle pour placer du « code HTML optionnel avant » :

<B_mots_freres>
<h2 class="structure"><:mots_clefs_meme_groupe:></h2>

<div class="menu">
<div class="divers">
<div class="menu-titre">

Le squelette affiche le nom du groupe de mots-clés comme titre du menu dans le « code HTML optionnel avant » :

        <BOUCLE_groupe(GROUPES_MOTS) {id_groupe} {doublons}>
         #TITRE
	</BOUCLE_groupe>
</div>

<ul class="menu-liste">

Le squelette débute une boucle (MOTS) : la liste triée des mots du groupe :

		
			<BOUCLE_mots_freres(MOTS) {type} {doublons} {par titre}>

Rajout_1 : je sélectionne les articles auquels des mots du groupe [{type} ci-dessus] sont attribués, mais je n’affiche rien :

   		       <BOUCLE_existe(ARTICLES) {id_mot}>
		       </BOUCLE_existe>

Retour à l’affichage des données par défaut pour la boucle (MOTS) ici en « code HTML optionnel après » de ma boucle (ARTICLES), donc pour les mots ayant au moins un article attribué :

<li class="menu-item">

	<a href="#URL_MOT" title="[(#DESCRIPTIF|textebrut|entites_html)]">
               #DESCRIPTIF
        </a></li>

Rajout_2 : je termine ma boucle (ARTICLES) d’après le « code HTML optionnel » :

				
</B_existe>

Le squelette clos enfin la boucle « (MOTS) dans ce groupe » :

			</BOUCLE_mots_freres>

La totale qui peut remplacer la boucle « Menu de navigation mots-cles » de mot-dist.html :

<!-- Menu de navigation mots-cles : les autres mots cles du meme groupe (avec rajout d'exclusion des mots non attribues -->

<B_mots_freres>
<h2 class="structure"><:mots_clefs_meme_groupe:></h2>

<div class="menu">
<div class="divers">
<div class="menu-titre">
	<BOUCLE_groupe(GROUPES_MOTS) {id_groupe} {doublons}>[(#TITRE|supprimer_numero)]
	</BOUCLE_groupe>
	</div>

	<ul class="menu-liste">
				
			<BOUCLE_mots_freres(MOTS) {type} {doublons} {par titre}>
			<BOUCLE_existe(ARTICLES) {id_mot}>
			</BOUCLE_existe>
	<li class="menu-item">

				<a href="#URL_MOT" title="[(#DESCRIPTIF|textebrut|entites_html)]">#DESCRIPTIF</a></li>
</B_existe>
			</BOUCLE_mots_freres>

		
			
	</ul>
</div>
</div>

Maintenant que le principe est connu on peut le décliner

Voici un cas avec des rubriques :

Vous avez des succursales dont vous voulez une présentation par départements (provinces, cantons, comtés, régions, districts...). Chaque succursale bénéficie d’un rubrique mais un département peut avoir plusieurs succursales et un autre aucune. Votre structure est bougeante, donc vous avez saisi un groupe de mots-clés recensant tous vos territoires potentiels. Seulement vous ne voulez pas afficher la liste des territoires vides, ça fait mauvais genre si ce n’est « pauvre ». La boucle expliquée ; n’hésitez pas à la nettoyer pour l’utiliser. Celà évitera l’affichage de caractères inutiles dans votre page.

<dt>
                      <B_departements>#PUCE groupes par d&eacute;partements
                      <BOUCLE_departements(RUBRIQUES) {racine} {id_groupe=1}>

		<dd><B_liste_departements><br>
		<BOUCLE_liste_departements(MOTS) {id_groupe=1} {par titre} {unique}>
<!--rajout debut-->
<BOUCLE_existe_departements(RUBRIQUES) {id_mot}>
</BOUCLE_existe_departements>
<!--suite boucle normale-->	                                    	
                                    	
                                    	[<br>(#TITRE)<br>]
<!--suite et fin rajout-->
</B_existe_departements>		

<!--retour boucle normale-->

		        <B_groupes_departements>

			<BOUCLE_groupes_departements(RUBRIQUES) {id_mot}>
		        
                                <a href=#URL_RUBRIQUE>
				<div class ="chapo">#TITRE</div>
				[<div class="texte">(#DESCRIPTIF)</div>]
                               	</a>
			</BOUCLE_groupes_departements>
                       
 </BOUCLE_liste_departements>

                        </BOUCLE_departements>
<dt>

Un autre cas légèrement modifié, toujours avec des rubriques :

Vous avez une radio. Vous avez divisé arbitrairement votre semaine en 7 jours pour en faire autant de groupes de mots-clés. Chacun est divisé de 1/2 h en 1/2 h (8 h 30, 9 h 00, 9 h 30... 23 h 30 etc. [1]). Malheureusement, une émission qui démarre à 18 h 00 ne se remplace pas systématiquement par une autre à 18 h 30 et certaines émissions peuvent se partager le même créneau à des semaines différentes. Voici une adaptation — à habiller— de la boucle précédente ; ici pour le dimanche (id_groupe=7) qui termine cette semaine (mais elle peut terminer le mercredi ou le mardi à votre choix) :

<B_dimanche>
#PUCE dimanche
<BOUCLE_dimanche(RUBRIQUES) {racine} {id_groupe=7}>

<BOUCLE_liste_dimanche(MOTS) {id_groupe=7} {par titre} {unique}>

<BOUCLE_groupes_dimanche(RUBRIQUES) {id_mot}>
<a href=#URL_RUBRIQUE><div>#TITRE</div></a>
</BOUCLE_groupes_dimanche>

</BOUCLE_liste_dimanche><br></B_liste_dimanche>

</BOUCLE_dimanche>

Notes

[1Il faut penser aussi aux pauvres couche-tard.

Discussion

3 discussions

  • 3

    Bonjour,
    j’aimerais fabriquer une boucle MOTS qui affiche les seuls mots clés liés à un article pour :
    -  les 24 derniers articles rédigés (!par date)
    -  du groupe de mot numéro 3

    Et je galère.
    Des pistes SVP ??
    Merci.

    • Quelque chose comme ça peut-être :

      <BOUCLE_article(ARTICLES){0,23}{!par date}>
      <BOUCLE_mot(MOTS) {id_groupe=3} {id_article?}>
      #TITRE
      </BOUCLE_mot>
      </BOUCLE_article>
    • Presque, merci. Le truc, c’est que je ne souhaite pas voir s’afficher X fois le même mot clé. Il faudrait qu’il ne s’affiche qu’une seule fois

    • Je me réponds :

      <BOUCLE_article(ARTICLES){!par date}{0,24}>
      <BOUCLE_mot(MOTS) {id_groupe=3} {id_article?}{unique}>
      #TITRE
      </BOUCLE_mot>
      </BOUCLE_article>

      Merci encore @DD :)

    Répondre à ce message

    • La liste n’étant plus accessible par ce lien, voici le message en question :

      Problématique : Permettre une recherche dans le site des articles selon
      les mots clefs qui leurs sont affecté.

      Apparence : Afficher une liste déroulante avec le titre des groupes de
      mot clef non clicables et le titre des mots avec entre parenthèse le
      nombre d’articles liés.
      Challenge : ne pas afficher les mots clefs sans article.

      Code :

      <B_RechercheMot>
      <form action="/spip.php?page=mot" method="post">
      	<select id="recherchemot" name="id_mot" class="formrecherche" 
      onchange="return submit(this);">
      	<option value="0">Recherche mots clefs</option>
      	<BOUCLE_RechercheMot(GROUPES_MOTS){par titre}>
      	<optgroup label="[(#TITRE|supprimer_numero)]">
      		<BOUCLE_Mots(MOTS mots_articles){id_groupe}{par titre}{id_article>0}>
      			<option 
      value="#ID_MOT">#TITRE<BOUCLE_ArticleMot(ARTICLES){id_mot}></BOUCLE_ArticleMot>(#TOTAL_BOUCLE)<//B_ArticleMot></option>
      		</BOUCLE_Mots>
      	</optgroup>
      		
      	</BOUCLE_RechercheMot>
      		</select>
      </form>
      </B_RechercheMot>

      Décortication :

      La BOUCLE_RechercheMot va parcourir les groupes de mot
      Et les afficher dans

      <optgroup label="[(#TITRE|supprimer_numero)]">

      C’est une balise HTML qui sert précisément à afficher un texte non
      clicable dans une liste déroulante pour séparer celle-ci en plusieurs
      groupes (voir http://www.aliasdmc.fr/balise/zone_html_optgroup.html).

      La BOUCLE_Mots va cherche les mots clef du groupe en cours.
      Mais il y a une GROSSE astuce.
      Au lieu de faire :

      <BOUCLE_Mots(MOTS){id_groupe}{par titre}>

      C’est :

      <BOUCLE_Mots(MOTS mots_articles){id_groupe}{par titre}{id_article>0}>

      (MOTS mots_articles) : permet de demander à SPIP de faire la jointure
      entre la table des mots et la table mots_articles (celle qui dit que tel
      mot et affecté à tel article).
      id_article>0 permet de ne renvoyer QUE les mots qui ont effectivement
      au moins un article.

      <BOUCLE_ArticleMot(ARTICLES){id_mot}></BOUCLE_ArticleMot>(#TOTAL_BOUCLE)<//B_ArticleMot> 

      affiche le nombre d’articles du mot en cours.

    • Merci, ton astuce m’a bien aidé, ça marche !

      J’en avais besoin pour trier les mots clés qui ne sont liés à aucun document :

      <BOUCLE_galeries(MOTS mots_documents) {tout} {par titre}{id_documents>0}>
                      <li>
                          <a href="[(#SELF|parametre_url{galerie,#TITRE})]">#TITRE</a>    
                      </li>
                  </BOUCLE_galeries>

      Bonne continuation

    Répondre à ce message

  • 1

    Etant donné que Google ropose toujours cette vieille page lorsqu’on se pose la question, voici donc une réponse moderne : jointer les tables.
    On jointe la table MOTS avec la table mots_articles dans laquelle on cherche un identifiant supérieur à 0. Si 0, pas d’article attribué.

    Pour jointer les tables c’est très simple

    <BOUCLE_mots_freres(MOTS mots_articles) {id_article>0} {type} {par titre}>
    </BOUCLE_mots_freres>
    • Hello,

      Sauf que si j’ai un article en cours de rédaction, la table n’est pas vide et le mot apparait !
      Comment éviter cela ?

      Merci

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom