到目前为止我们已经完成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: 您还没有登录,登录后方能下载,如果您还没有注册,请点击
免费注册