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 采集心得技巧
May 15 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
Nov 24 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
Jun 12 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
php把数组值转换成键的方法
Jul 13 PHP
Symfony核心类概述
Mar 17 PHP
PHP session 会话处理函数
Jun 06 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
May 05 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新闻发布系统教程
2014/05/09 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
在Laravel框架里实现发送邮件实例(邮箱验证)
2016/05/20 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
JavaScript中的alert()函数使用技巧详解
2014/12/29 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
[00:11]战神迅矛
2019/03/06 DOTA
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
简单上手Python中装饰器的使用
2015/07/12 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
不可错过的十本Python好书
2017/07/06 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
calendar在python3时间中常用函数举例详解
2020/11/18 Python
python中reload重载实例用法
2020/12/15 Python
美国最大的袜子制造商和零售商:Renfro Socks
2017/09/03 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
DOUGLAS波兰:在线销售香水和化妆品
2020/07/05 全球购物
逃出克隆岛观后感
2015/06/09 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
nginx从安装到配置详细说明(安装,安全配置,防盗链,动静分离,配置 HTTPS,性能优化)
2022/02/12 Servers
教你如何让spark sql写mysql的时候支持update操作
2022/02/15 MySQL