站内   

Drupal如何实现“相关文章”的功能

      Drupal是一个非常好的CMS开源系统,虽然开源模块非常的多,但目前符合“相关文章”功能仅有Related Links, Relevance, Relevant Content, Similar Entries,但都多多少少不尽如人意,所以自己动手写了一个简单的Block。本文将向您介绍Drupal如何实现“相关文章”的功能。

原创文章请注明转载自咋办网,本文链接:Drupal如何实现“相关文章”的功能

预备条件: 
  • Drupal 6.x (其他版本也可以参考)
  • 启用Search模块
  • 启用CSplitter模块
  • 启用Taxonomy模块,并且文章中设置了Tag或Taxnomy(相关文章的检索条件)
步骤: 

      本人做Drupal不专业,写的东西可能不太好看,也可能还有更好的方法,在此请高手多多指导:) 我实现相关文章的功能实际上是创建了一个Block,里面写了几行代码,调用了do_search api实现的,代码的具体逻辑为,读取当前页面node,再获取其Taxonomy,然后调用do_search API获取搜索结果,将结果中的node列出来,具体步骤如下。

  1. 创建一个Block。创建Block的路径是 管理->站点创建->区块,页面上方有一个“增加区块”的链接。
  2. 区块说明:related_articles;区块标题:以下文章可能对您有所帮助,这两个其实都可以随便填,需要注意一下区块标题,如果你只是填写一个“相关文章”,可能对读者的吸引力不够,这个就看你如何吸引读者的眼球了。
  3. 区块内容:放置php代码,并将输入格式设置为PHP Code,需要注意的是,你需要启用模块中的PHP Filter,否则你是看不到PHP Code,PHP代码如下:
    <?php 
    //$current_node用来存储当前页面上的node
    //$current_node用来存储当前页面上的node的关键字
      $current_node
    = node_load(arg(1));
      $current_terms = taxonomy_node_get_terms($current_node );
    //$current_keyword用来存储合成的关键字(用于Drupal do_search API调用,检索相关文章)
      $current_keyword = '';
    //将关键字连接起来,用'OR'连接,如果直接用空格连接表示与的关系
    foreach (
    $current_terms as $local_kw)
    {
      $current_keyword  .= $local_kw->name;
      $current_keyword  .= ' OR ';
      $current_keyword  .= ' ';
    }
    //去掉前后空格
      $current_keyword = trim($current_keyword);
    //字符串长度
      $keylength = strlen($current_keyword);
    //Drupal API do_search的关键字长度大于2才执行搜索,这个设置与搜索设置中的最小关键字长度设置有关
    if(
    $keylength > 2)
    {
    //$related_results保存的是通过drupal API do_search查询结果,结果就是相关文章
      $related_results = do_search($current_keyword, 'node', $join1 = '', $where1 = '1 = 1', $arguments1 = array(), $columns2 = 'i.relevance AS score', $join2 = '', $arguments2 = array(), $sort_parameters = 'ORDER BY score DESC');
    //格式化相关文章标题及链接为ul列表
      $output .= '<ul>';
    foreach (
    $related_results as $local_item){
      $related_results = node_load($local_item->sid);
      if(
    $current_node->nid <> $related_results->nid)
      {
        $linkurl = url("node/$related_results->nid", array('absolute' => FALSE));
        $output .= '<li>';
        $output .= "<a href=\"$linkurl\">";
        $output .= $related_results->title;
        $output .= '</a>';
        $output .= '</li>';
      }
    }
    $output .= '</ul>';
    }
    //输出
    print
    $output;
    ?>
  4. 设置页面可见性:只在下列页面中显示,设置值为:node*
  5. 保存区块
  6. 在管理区块页面将区块放在content部分,区块将出现在内容最下方
  7. 由于相关文章功能对搜索功能有所依赖,如果你还没有为站点内容创建索引,那么赶快创建吧
  8. 效果如下,下面的链接来自于如何制作手机播放的RMVB格式电影这篇文章,本文最后也有相关文章列表。

    以下文章可能对您有所帮助

  9. 其他可用模块
    • Relevant Content
      relevant_content模块使用了一个Select SQL实现的查询,没有使用Search模块,也没有使用do_search API,自然也就不能对中文分词支持了,搜索结果也没有按照相关度排序,所以“相关”并非很准确。
    • Similar Entries
      similar entry找到的相关内容比较少,但是结果顺序和本文的方法是一样的,similar entry一样没有用do_search api,对中文分词支持不好,因此也有一些缺憾。
    • Relevance
      relevance模块比上面两个都要好一些,还可以根据Taxonomy、日期、时间等因素设定权重,结果还可以显示性能相关数据,relevance模块虽然没有直接使用do_search API,但是其中的SQL仍然按照relevance度排序,只是不支持中文分词。推荐使用此模块。

提示&注意事项: 
  • 启用Search 模块后,需要建立索引才能使用相关文章中调用的do_search API
  • 启用CSplitter模块会影响一些速度,建立索引的速度会很低,但是会精确得多,如果网站是中文内容,一定得启用该模块
  • 如果你的网站只有中文,没有日、韩文字,最好将CSplitter中的中日韩文字那项设置去掉,提高性能
  • Search模块需要Cron计划任务,否则要手动运行才行
参考资料: 

附件下载

    请注册并登录后下载附件:登录/注册

  欢迎订阅咋办网的Feed更新~~ 请猛击此链接

与本文最相关的内容

评论

发表新评论

此内容将保密,不会被其他人看见。
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters (without spaces) shown in the image.