2015-04-03 4 views
2

Je voudrais faire un module personnalisé avec une liste de tags. Lorsqu'une étiquette est cliquée, le visiteur accède à une page de catégorie qui affiche les articles associés à cette étiquette.Filtrer les articles par étiquette dans une catégorie - Joomla et K2

Je ne suis pas un expert en joomla, je pensais à une solution comme un lien comme celui-ci que je voudrais ajouter aux étiquettes à l'intérieur du module:

href="http://mywebsite.com/index.php/itemlist/tag/tokio%20city?category=places" 

Est-ce possible? Ou comment pourrais-je réaliser ce résultat? Merci!

Répondre

1

Ceci est un peu plus compliqué que juste une chaîne de requête dans l'URL car vous devez également modifier un modèle. Si vous voulez le garder aussi simple que possible, je vous recommanderais de créer un nouveau modèle K2 en utilisant des remplacements de modèles et de modifier le modèle de catégorie afin qu'il lise les paramètres de chaîne de requête et affiche uniquement les articles déjà filtrés par le catégorie et en outre par le tag via une chaîne de requête.

C'est juste un bref comment faire, maintenant avec un peu plus de détails: lil

1) Créer un nouveau modèle K2 à l'aide du modèle overrides.

Dans votre modèle, s'il n'existe pas déjà, créez une structure de dossiers /templates/your_template/html/com_k2/templates/default. Le "par défaut" peut être remplacé par n'importe quel nom si vous voulez avoir plus de modèles K2, mais vous devez définir le nouveau modèle pour chaque catégorie que vous avez manuellement.

Maintenant, prenez le contenu de "/ components/com_k2/templates/default" et copiez-le dans le nouveau dossier dans votre modèle. Maintenant, K2 utilise les modèles de votre dossier /templates/your_template/html/com_k2/. N'hésitez pas à google plus de détails si vous ne comprenez pas les remplacements de modèles, c'est très important lors de la personnalisation d'un modèle.

2) Modifier votre fichier de vue de la catégorie pour accueillir la liste à vos chaînes de requête

Le fichier qui vous intéresse est maintenant en /templates/your_template/html/com_k2/templates/default/category.php. Ouvrez ce fichier et essayez de comprendre ce qui est important:

Line 141 
<?php foreach($this->leading as $key=>$item): ?> 
Line 169 
<?php foreach($this->primary as $key=>$item): ?> 
Line 197 
<?php foreach($this->secondary as $key=>$item): ?> 
Line 226 
<?php foreach($this->links as $key=>$item): ?> 

C'est ce qui compte. Dans ces quatre boucles foreach, il y a tous les éléments. Ensuite, vous pouvez placer le contenu de chacune de ces boucles dans une condition if pour vérifier si la balise souhaitée est spécifiée dans l'URL. Pour afficher un exemple, voici le code <div id="itemListPrimary">. Vous pouvez remplacer cette div entière dans le fichier category.php avec le code suivant et cela fonctionnera parfaitement. Je viens de l'écrire et de le tester.

<div id="itemListPrimary"> 

    <?php foreach ($this->primary as $key=>$item): ?> 

     <?php 
     # Get the value of the "tag" query string 
     $jInput = JFactory::getApplication()->input; 
     $myTag = $jInput->get('tag', null, 'STRING'); // Joomla 1.6+ 
     //$myTag = JRequest::getVar('tag'); // for Joomla 1.5 

     # If the tag is empty, the query string is not specified and we'll go standard way without any tag filter 
     if (empty($myTag)) { 

      // Define a CSS class for the last container on each row 
      if ((($key+1)%($this->params->get('num_secondary_columns'))==0) || count($this->secondary)<$this->params->get('num_secondary_columns')) 
       $lastContainer= ' itemContainerLast'; 
      else 
       $lastContainer=''; 
      ?> 
      <div class="itemContainer<?php echo $lastContainer; ?>"<?php echo (count($this->secondary)==1) ? '' : ' style="width:'.number_format(100/$this->params->get('num_secondary_columns'), 1).'%;"'; ?>> 
       <?php 
        // Load category_item.php by default 
        $this->item=$item; 
        echo $this->loadTemplate('item'); 
       ?> 
      </div> 
      <?php if(($key+1)%($this->params->get('num_secondary_columns'))==0): ?> 
      <div class="clr"></div> 
      <?php endif; 

     # Otherwise the tag is set so we'll filter the articles by the tag 
     } else { 

      # Get an array of all the tags that the current article in the loop has 
      $articleTags = array(); 
      foreach ($item->tags as $tag) { 
       $articleTags[] = $tag->name; 
      } 

      # Check if the article has the tag specified in the URL as a query string 
      if (in_array($myTag, $articleTags)) { 

       # Now the default content of the foreach loop comes as written in the default K2 category.php template 

       // Define a CSS class for the last container on each row 
       if ((($key+1)%($this->params->get('num_secondary_columns'))==0) || count($this->secondary)<$this->params->get('num_secondary_columns')) 
        $lastContainer= ' itemContainerLast'; 
       else 
        $lastContainer=''; 
       ?> 
       <div class="itemContainer<?php echo $lastContainer; ?>"<?php echo (count($this->secondary)==1) ? '' : ' style="width:'.number_format(100/$this->params->get('num_secondary_columns'), 1).'%;"'; ?>> 
        <?php 
         // Load category_item.php by default 
         $this->item=$item; 
         echo $this->loadTemplate('item'); 
        ?> 
       </div> 
       <?php if(($key+1)%($this->params->get('num_secondary_columns'))==0): ?> 
       <div class="clr"></div> 
       <?php endif; 
      } 
     } ?> 

    <?php endforeach; ?> 
</div> 

3) Comprendre comment les URL fonctionneront

Mon typique URL de catégorie est:

http://mywebsite.com/category-name 

Pour afficher uniquement les articles avec une étiquette spécifiée, utilisez:

http://mywebsite.com/category-name?tag=your-tag 

Par exemple, si vous voulez afficher uniquement les articles avec le tag "Tokio City", utilisez:

http://mywebsite.com/category-name?tag=Tokio City 

Terminé.

Voilà les bases de ce dont vous avez besoin. C'est tout ce dont vous avez besoin si vous n'utilisez que des articles primaires (aucun lien principal ou secondaire ou liens). Bien sûr, il y a beaucoup plus de choses que vous pourriez vouloir prendre soin de:

  • un avis s'il n'y a pas d'article avec l'étiquette spécifiée
  • pas de code redondant, je l'ai écrit comme ça pour le bien de la simplicité et la lisibilité
  • SEO - espaces et des caractères spéciaux dans les URL
  • en vous assurant qu'aucun div vide seront imprimées

Mais ce serait bien plus de code et je voulais garder les choses simples & lisible pour vous. Je pense que je vous ai donné plus que suffisant pour un début, alors allez-y et faites-le, bonne chance :)

+0

Vous êtes vraiment, vraiment familier avec ces deux plates-formes! Merci pour cette réponse incroyable, je voulais le mettre à profit avant de donner un retour. L'extrait que vous avez écrit fonctionne très bien, j'ai seulement deux autres questions: 1. maintenant ma requête affiche les articles dans une colonne, je suppose que cela doit être fait avec des "articles primaires", mais ça va, je suppose que je peux en CSS, ou devrais-je utiliser des articles secondaires pour afficher les résultats? 2. Existe-t-il une documentation pour ces fonctions standard, afin que je puisse en apprendre plus? :) Merci encore, vous êtes incroyable. –

+0

Voilà ce que j'ai fait ces deux dernières années :) Vous pouvez définir le nombre de colonnes pour chaque catégorie et chaque type d'articles (derniers, primaires, secondaires, liens) dans les paramètres de catégorie K2 ou utiliser votre CSS personnalisé pour cela, les deux fonctionne bien :) Personnellement, je vous recommande d'utiliser un seul type d'articles, disons primaire, car l'utilisation de plusieurs types pourrait vous causer des problèmes inattendus. Je ne pense pas qu'il existe une documentation pour cela, c'est plus ou moins juste un peu de connaissances PHP et K2. – TeeJay

+0

Merci encore! :) –