Joomla!-开源天空

2008-12-05
首页 专栏热点 Joomla! 源代码分析 中文自动标签生成Joomla!扩展制作教程(三)-增加组件的tags生产功能


中文自动标签生成Joomla!扩展制作教程(三)-增加组件的tags生产功能

E-mail

在这篇文章:   中,我们制作了一个组件的框架,然后除了后台的手动管理功能外,这个组件还没有实际的功能,在这篇文章中我们来给组件添加根据文章编号,生成相应文章的标签功能。

第一步,我们要先在/components/com_tags目录中,建一个assets/lib的目录,将织梦分词算法pub_splitword_www.php和data/dede_www.csv词频文件放在相应的目录下。

第二步,在controller.php 中引入库文件,代码如下:

require_once(JPATH_BASE.DS.'components'.DS.'com_tags'.DS.'assets'.DS.'lib'.DS.'pub_splitword_www.php');
require_once(JPATH_BASE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php');

第一行是因为分词的类文件,第二行是引入文章的SEF函数。

第三步,我们在controller.php中添加一个函数 createTags,对应与task=createTags的任务。函数的代码如下:


function createTags(){
 $db =& JFactory::getDBO();
 $article_id = JRequest::getVar('aid',1);
 $query = 'select * from #__content where id='.$article_id;
 $db->setQuery( $query );
 $row = $db->loadObject();
 if($row){
  $query = 'select * from #__tags where articleid='.$article_id;
  $db->setQuery( $query );
  $item = $db->loadObject();   
  if($item){
   return JError::raiseError( 404, 'error created' );
  }   
  $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){
   $slug = '';
   $catslug = '';
   $query = 'select * from #__categories id='.$row->catid;
   $db->setQuery( $query );
   $item = $db->loadObject();  
   if($item){
    if($item->alias){
     $catslug=$row->catid.':'.$item->alias;
    }
    else{
     $catslug=$row->catid;
    }
   }
   if($row->alias){
    $slug = $row->id.':'.$row->alias;
   }
   else{
    $slug = $row->id;
   }
   $sectionid= $row->sectionid;
   $url = JRoute::_(ContentHelperRoute::getArticleRoute($slug, $catslug, $sectionid));
   $ws = explode(" ",$words);
   $count = 0;
   foreach($ws as $w)
   {
    $query = 'insert into #__tags(tag,articleid,url) values ("'.$w.'",'.$row->id.',"'.$url.'")';
    echo $query;
    $db->Execute($query);
    $count = $count+1;
    if($count>=5) break;
   }  
   $msg = 'tags created';
   $this->setRedirect('/index.php?option=com_tags&view=tags&aid='.$row->id,$msg); 
  }
  else{
   return JError::raiseError( 404, 'no tags create' );
  }
 }
 else{
  return JError::raiseError( 404, JText::sprintf( 'Article # not found', $articleid) );
 } 
}

这段函数首先检查是否有这样编号的文章,如果有,则查找tags表中,是否已经有关于这篇文章的标签,如果没有的情况下,则生成标签。最后将生成的标签分别保存在tags表中。具体的代码含义我就不详细描述了。


接下来我们修改一下models文件,以显示某一篇文章的标签。models/tags.php getData()函数修改为:

function getData()
{
 $db =& JFactory::getDBO();
 $article_id = JRequest::getVar('aid',1);
 $query='select * from #__tags where articleid='.$article_id;
 $db->setQuery( $query );
 $items = $this->_getList( $query );
 return $items;
}

现在你就可以通过浏览器,来生成并显示某一文章的标签了。比如:

http://www.maycode.com/index.php?option=com_tags&view=tags&task=createTags&aid=520

注意将aid换成你自己某篇文章的编号。执行后显示的效果如下:

你可以注意这段代码中有一些瑕疵,比如,我们在代码中写死了只选择前5个关键词,同时对于错误处理也不够严谨,然而总之能够靠程序来生成标签了,是吧!这段代码我们在以后的过程中还要完善。

你还可能注意到,实际上生成的标签中,"我们","需要"等可能并不是你需要的,这个可以通过修改织梦分词算法来实现,以后有时间再处理吧,当然你也可以登陆后台,删除你不喜欢的标签。

我们同时修改一下tags.xml文件,在site中,添加两行:

<filename>assets/lib/pub_splitword_www.php</filename>
<filename>assets/lib/data/dede_wwwdic.csv</filename>


附件中是修改后的com_tags组件,再安装来试试吧。

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


收藏此文章:
Digg! Reddit! Del.icio.us! JoomlaVote! Google! Live! Facebook! StumbleUpon! Yahoo! Free social bookmarking plugins and extensions for Joomla! websites!
User Reviews(2)
 组件使用了iconv的php扩展,在windows下使用可能会有问题。
作者:admin 星期日, 16 三月 2008 08:38
抽空看看是否有替代方式。
 更正:文中controller.php错误
作者:admin 星期日, 16 三月 2008 11:28
第23行:$query = 'select * from #__categories id='.$row->catid;

应该修改为:$query = 'select * from #__categories where id='.$row->catid;

发表您的文章评论

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