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 相关文章推荐
使用php来实现网络服务
Sep 15 PHP
PHP 日期时间函数的高级应用技巧
Oct 10 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
Apache中php.ini的设置方法
Feb 28 PHP
深入PHP中的HashTable结构详解
Jun 13 PHP
php使用strtotime和date函数判断日期是否有效代码分享
Dec 25 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
CodeIgniter视图使用注意事项
Jan 20 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
ThinkPHP5 的简单搭建和使用详解
Nov 15 PHP
PHP中的访问修饰符简单比较
Feb 02 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
又一个php 分页类实现代码
2009/12/03 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
php创建session的方法实例详解
2015/01/27 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
js控制input输入字符解析
2013/12/27 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
JavaScript对象创建模式实例汇总
2016/10/03 Javascript
关于Vue.js一些问题和思考学习笔记(2)
2016/12/02 Javascript
javascript中this关键字详解
2016/12/12 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
Python 3中的yield from语法详解
2017/01/18 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
Python如何实现动态数组
2019/11/02 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
Hotels.com印度:酒店预订
2019/05/11 全球购物
进修护士自我鉴定
2013/10/14 职场文书
教师的实习自我鉴定
2013/12/17 职场文书
物控部经理职务说明书
2014/02/25 职场文书
意外伤害赔偿协议书范文
2014/09/23 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
教师节标语大全
2014/10/07 职场文书
80后婚前协议书范本
2014/10/24 职场文书
实习工作表现评语
2014/12/31 职场文书
工作简历自我评价
2015/03/11 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技