ThinkPHP添加更新标签的方法


Posted in PHP onDecember 05, 2014

本文实例讲述了ThinkPHP添加更新标签的方法。分享给大家供大家参考。具体分析如下:

我们知道,thinkphp的拓展案例blog,只告诉我们怎样去添加标签tag,却没有删除和更新标签的方法,我在前面的《彻底删除thinkphp3.1案例blog标签的方法》为拓展案例blog写了一个删除标签的方法,接下来将写一个标签的更新方法.

一般情况下,我们写博客后,很少去改动标签了,但是如果我们改动标签如,删除,添加,减少标签怎么办呢?这无疑造成think_tag和think_tagged两个表垃圾信息的积累,好了,言归正转.

在更新标签时我们来了解两个参数:

$oldtags:更新前,存在thinphp_tag表中标签

$newstags:更新时,插入thinphp_tag之前,表单提交过来的标签

更新文章时,标签可能会有以下几种变化:

1、$newstags与$oldtags部分相同-> 添加或减少或修改标签,标签的个数和名称和原来部分相同。

2、$newstags与$oldtags完全相同->不修改标签

3、$newstags与$oldtags完全不同 ->添加或减少标签,并且标签的个数和名称和原来完全不同

对于2我们只要通过判断比较过滤即可,对于1、3通过判断比较后,再作删除或添加处理:

删除:要删除的标签名,在thinphp_tag已存在,当标签的count=1时,就把它删除掉,当count>1时,就减少1(count-1).

添加:要添加的标签名称,如果thinphp_tag表中已存在则count(count >1)在原来的基础上+1即count+1,如果不存在(count =0),则添加新标签,count+1.具体函数如下:

public function updateTag($vo,$module) {  

 $recordId= trim($vo['id']);  

  

if($vo['keywords']==''){//如果没有标签,则把原来的标签删除  

     $this->deltag($recordId);      

   }else{  

      $newtags = explode(' ', $vo['keywords']);//获取更新的标签并转为数组(keywords是这里的标签字段,在thinkphp的拓展案例blog为tags,注意)

  

   $condition['recordId'] = $recordId;//当有多个标签时,将查询多篇日记,而不是一篇  

  

 $tagged=M('Tagged');  

  

  $tag=M('Tag');           

  

  $taggedlist= $tagged->where($condition)->select();  

  

if($taggedlist !==false){  

  

foreach ($taggedlist as $key => $value) {  

  

  $tagId=trim($value['tagId']);  

  

  $tagvo=$tag->where('id='.$tagId)->find();  

  

  $oldtags[]=$tagvo['name'];//获取原来的标签  

  

  }     

  

   $result=count(array_diff(array_diff($newtags,$oldtags),array_diff($oldtags,$newtags)));      

  

   $result1=count(array_diff($newtags,$oldtags));//返回更新前后TAG的差值数  

  

  $result2=count(array_diff($oldtags,$newtags));//返回更新前后TAG的差值数 

  

  if(($result1 !== $result2) || ($result !==0)){//2与原来的完全相同->过滤掉             

  

   $array_intersect=array_intersect($oldtags,$newtags);//取得交值  

  

   $oldtags_diff=array_diff($oldtags,$array_intersect);//原来的标签,被更新后已无用,需要删除的  

  

    $newtags_diff=array_diff($newtags,$array_intersect);//修改的标签,需要添加的  

  

//删除或者count-1     

  

     if(count($oldtags_diff) !==0){   

  

     foreach ($oldtags_diff as $name) {  

  

     $tagvo=$tag->where("module='$module' and name='$name'")->find();  

  

     $count=intval($tagvo['count']);//获取标签的数量  

  

if($count==1){  

  

    $tag->where('id='.$tagvo['id'])->delete();  

  

    $tagged->where('tagId='.$tagvo['id'].' and recordId='.$recordId)->delete();  

  

 }elseif($count > 1){  

   $tag->where('id='.$tagvo['id'])->setDec('count',1);//标签数量减1  

  

   $tagged->where('tagId='.$tagvo['id'].' and recordId='.$recordId)->delete();//删除tagged中相关数据   

 } 

  } 

}  

//添加更新的标签    

  

if(count($newtags_diff) !==0){  

  

   foreach ($newtags_diff as $v) {  

  

       $v = trim($v);           

  

       if (!emptyempty($v)) {  

  

        // 记录已经存在的标签  

  

     $map['module'] = $module;  

  

        $map['name'] = $v;  

  

        $tagg = $tag->where($map)->find();  

  

       if ($tagg) {//如果现在保存的标签与之前相同的标签累加  

  

       $tagId = $tagg['id'];  

  

          $tag->where('id=' . $tagg["id"])->setInc('count', 1);//count统计加1(这个函数有三个参数,默认加1)  

  

          } else {//如果是新添的标签,标签+1  

  

                   $t = array();  

  

                   $t["name"] = $v;  

  

                   $t["count"] = 1;  

  

                   $t["module"] = $module;  

  

                   $result = $tag->add($t);  

  

                   $tagId = $result;  

  

            }  

      }  

                 //记录tag信息  

    $t = array();  

  

      $t["module"] = $module;  

  

      $t["recordId"] = $recordId;//保存news的ID  

  

      $t["tagTime"] = time();  

  

      $t["tagId"] = $tagId;//保存tag的ID  

  

      $tagged->add($t);  

  

     }  

  

    }   

     }  

     }  

     }  

}

使用方法:
public  function update() {  

$Blog=D('Blog');  

$vo=$Blog->create();  

$this->updateTag($vo,'Blog');//更新前调用  

if (false === $vo) {  

 $this->error($Blog->getError());  

     }  

   // 更新数据  

   $list = $Blog->save();  

   if (false !== $list) {  

     //print_r($list);  

       

     $this->success('编辑成功!');  

   } else {  

       //错误提示  

       $this->error('编辑失败!');  

   }  

}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
PHPMYADMIN 简明安装教程 推荐
Mar 07 PHP
php xml 入门学习资料
Jan 01 PHP
php设计模式 State (状态模式)
Jun 26 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
PH P5.2至5.5、5.6的新增功能详解
Jul 14 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
浅谈php常用的7大框架的优缺点
Jul 20 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 #PHP
php树型类实例
Dec 05 #PHP
Yii框架form表单用法实例
Dec 04 #PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 #PHP
Yii分页用法实例详解
Dec 04 #PHP
Yii配置文件用法详解
Dec 04 #PHP
yii实现图片上传及缩略图生成的方法
Dec 04 #PHP
You might like
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
PHP cron中的批处理
2008/09/16 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
php函数与传递参数实例分析
2014/11/15 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
2014/04/29 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
Vue 事件处理操作实例详解
2019/03/05 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
让python json encode datetime类型
2010/12/28 Python
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
Python正则表达式常用函数总结
2017/06/24 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python 获取div标签中的文字实例
2018/12/20 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
团组织关系介绍信
2014/01/12 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
工厂无线对讲系统解决方案
2022/02/18 无线电