按类别内的标签过滤文章 - Joomla和K2

时间:2015-04-03 12:25:24

标签: php joomla filter tags joomla-k2

我想制作一个带有标签列表的自定义模块。单击标记后,访问者将被导航到类别页面,该页面将显示带有该标记的文章。

我不是joomla专家,我正在考虑像这样的超链接这样的解决方案,我会添加到模块内的标签:

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

这可能吗?或者我怎么能实现这个结果? 谢谢!

1 个答案:

答案 0 :(得分:1)

这比URL中的查询字符串要复杂得多,因为您还需要调整模板。

如果您想让它尽可能简单,我建议您使用模板覆盖创建新的K2模板并编辑类别模板,以便它可以读取查询字符串参数并仅显示已经过滤的文章类别以及标签通过查询字符串。

这只是一个简短的操作方法,现在还有更多细节:

1)使用模板覆盖创建新的K2模板。

在模板中,如果它尚未存在,请创建文件夹结构/templates/your_template/html/com_k2/templates/default。 "默认"如果您想拥有更多K2模板,可以使用任何名称替换,但您必须将新模板设置为您手动拥有的每个类别。

现在从" / components / com_k2 / templates / default"中获取内容。并将其复制到模板中的新文件夹。现在,K2正在使用/templates/your_template/html/com_k2/文件夹中的模板。如果您不了解模板覆盖,请随时提供更多详细信息,这在定制模板时非常重要。

2)编辑您的类别视图文件以容纳查询字符串的列表

您感兴趣的文件位于/templates/your_template/html/com_k2/templates/default/category.php。打开此文件,尝试了解其中重要的内容:

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): ?>

这才是最重要的。在这四个foreach循环中,有所有项目。然后,您可以将每个循环的内容包装到if条件中,以检查它是否具有URL中指定的所需标记。

为了向您展示示例,这是<div id="itemListPrimary">的代码。您可以使用以下代码替换category.php文件中的整个div,它将完美地工作。我刚刚编写并测试过它。

<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)了解网址的工作方式

我的典型类别网址是:

http://mywebsite.com/category-name

要仅显示具有指定标记的文章,请使用:

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

例如,如果您只想显示带有&#34; Tokio City&#34;的文章。标签,使用:

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

完成。

这是您需要的基础知识。如果您只使用主要文章(没有主要和次要或链接),您只需要它。当然,您可能需要处理更多的事情:

  • 如果没有带有指定标签的文章
  • ,则发出通知
  • 没有多余的代码,我为了简单和可读性而这样写了
  • SEO - 网址中的空格和特殊字符
  • 确保不会打印空div

但那会是更多的代码,我想保持简单&amp;对你来说可读。我想我已经给你足够的开始了,所以继续完成它,祝你好运:)