Joomla!-开源天空

2008-12-05
首页 专栏热点 Joomla! 源代码分析 中文自动标签生成Joomla!扩展制作教程(六)-自动生成文章标签


中文自动标签生成Joomla!扩展制作教程(六)-自动生成文章标签

E-mail

到目前为止我们已经完成Joomla!文章标签的后台管理,和前台文章最终页面显示和列表显示,而且我们可以通过在浏览器中访问task=createTags从而生成某一文章的标签,可是不是自动生成的。当然,你可以在后台设置crontab 的任务,定期请求一下链接,但是这不是我们想要的。我们需要一个自动生成的功能。

这显然应该通过一个插件来完成任务,最好能在文章发布的时候自动生成标签。可是目前没有这样事件接口,如果做Joomla! core hack肯定可以做到,可是以后升级的时候,每次都要记住修改相应的Joomla! core 代码是非常困难的。因此我们还考虑在上次完成的afterDisplay函数上完成。

完整的代码如下:

<?php 
defined('_JEXEC') or die('Restricted access');
require_once(JPATH_BASE.DS.'components'.DS.'com_tags'.DS.'assets'.DS.'lib'.DS.'pub_splitword_www.php');
$mainframe->registerEvent("onAfterDispatch", "addTagsStyleSheet");
$mainframe->registerEvent('onAfterDisplayContent', 'plgTags');
function addTagsStyleSheet()
{
 $document = & JFactory::getDocument();
 $document->addStyleSheet( JURI::base() . "plugins/content/tags.css", "text/css", null, array() );
}
function plgTags( &$row, &$params)
{
 if(JRequest::getVar('view')=='article'){
  $plugin =& JPluginHelper::getPlugin('content', 'tags');
  $html   = '';
  $db   = & JFactory::getDBO();
  $count=$params->get('count',5);
  $query='select * from #__tags where tag<>"NO_TAGS" and articleid='.$row->id.' limit '.$count;
  $db->setQuery($query);
  $items = $db->loadObjectList();
  if($items){
   $html.='<div class="tags"><B>Tags:</B> ';
   foreach ( $items as $item )
   {
    $html.='<span class="tag"><a href="/index.php?option=com_tags&view=list&key='.urlencode($item->tag).'" target="_blank">';
    $html.=$item->tag;
    $html.='</a></span>';     
   }
   $html.='</div>';    
  }
  else {
   _createTags($row,$params);
  }
  $row->text = $html.$row->text;
 }
 return;
}
function _createTags(&$row,&$params){
 
 $db =& JFactory::getDBO();
 $total = $params->get('count',5);
 $query = 'select * from #__tags where articleid='.$row->id;
 $db->setQuery( $query );
 $results = $db->loadObjectList();
 
 if(!$results){
  $sp = new SplitWord();
   $words=strip_tags($row->title).' '.strip_tags($row->introtext);
   $words=@iconv('utf-8','gb2312',$words);
   $words=$sp->GetIndexText($sp->SplitRMM($words));
   $words=@iconv('gb2312','utf-8',$words);
   if(strlen($words)>0){
   $url = $_SERVER['REQUEST_URI'];
   $ws = explode(" ",$words);
   $count = 0;
    foreach($ws as $w)
    {
    $query = 'insert into #__tags(tag,articleid,url) values ("'.$w.'",'.$row->id.',"'.$url.'")';
    $db->Execute($query);
    $count = $count+1;
    if($count>=$total) break;
    }  
   }
   else{
    $query ='insert into #__tags(tag,articleid,url) values("NO_TAGS",'.$row->id.',"'.$url.'"';
    $db->Execute($query);
   }
 }
}
?>

我们看到第二段代码是一个私有函数,主要功能就是查找tags表,没有标签的时候,就分词生成,如果没有合适的标签生成就在TAGS表中添加一条NO_TAGS记录。这主要是防止重复做无法生成标签的文章。

第一段程序相对原来的代码我们没有做多少改变,主要是查询语句的改变。同样,这次我们引入了插件的参数,增加了一个count参数,设置每篇文章的标签数目。

请下载附件的代码,试试。看了一下生成的标签,看来织梦的算法确实需要修改了,连“一个”,“我们”,这样的也作为标签了,单词重要度的算法需要改动。

 注意:由于使用iconv,windows下使用有问题,同样,如果没有安装这个扩展也会有问题。

Attatchments:
您还没有登录,登录后方能下载,如果您还没有注册,请点击 免费注册
相关文章:
中文tags cloud Joomla! 组件发布
中文自动标签生成Joomla!扩展制作教程(九)-tags cloud 模块完整版
中文自动标签生成Joomla!扩展制作教程(八)-tags cloud 模块
简体中文标签自动生成Joomla!组件,插件,标签云模块
中文自动标签生成Joomla!扩展制作教程(七)-com_tags管理后台分页
中文自动标签生成Joomla!扩展制作教程(五)-增加组件列表功能
中文自动标签生成Joomla!扩展制作教程(四)-创建插件
中文自动标签生成Joomla!扩展制作教程(三)-增加组件的tags生产功能
中文自动标签生成Joomla!扩展制作教程(二)-创建组件框架
中文自动标签生成Joomla!扩展制作教程(一)-前言


收藏此文章:
Digg! Reddit! Del.icio.us! JoomlaVote! Google! Live! Facebook! StumbleUpon! Yahoo! Free social bookmarking plugins and extensions for Joomla! websites!
User Reviews(5)
 如何才能自动生成?
作者:ufonba 星期二, 12 八月 2008 00:27
我不知道要如何做才能有自动生成的效果.是前台添加文章,还是后台添加文章?
 前后台都可以
作者:admin 星期二, 12 八月 2008 18:57
在第一次浏览文章的时候,标签自动生成,第二次刷新就应该显示出来了。
 不过说实话,中文分词以及计算标签的程序不够精确
作者:admin 星期二, 12 八月 2008 18:58
织梦分词算法还得改啊!
 回复:前后台都可以
作者:ufonba 星期二, 12 八月 2008 23:12
我知道我问题出在哪里了,我因为我看你写标签插件的文章,下载了下面的测试版插件,所以没有出现,争议把那篇文章下面的下载那里标示一下是BETA版,我以为是跟发布那个版本一样的.
 回复:[文章评论]--中文自动标签生成Joomla!扩展制作教程(六)-自动生成文章标签
作者:admin 星期三, 13 八月 2008 21:35
好的,谢谢!

发表您的文章评论

您的姓名 (昵称)
标题:
评分: 很差一般较好很好
评论:
验证码:
请输入验证码