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巧获服务器端信息
Dec 06 PHP
php与php MySQL 之间的关系
Jul 17 PHP
PHP 实用代码收集
Jan 22 PHP
PHP OPCode缓存 APC详细介绍
Oct 12 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
Aug 11 PHP
分享PHP守护进程类
Dec 30 PHP
php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案
May 31 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
Dec 02 PHP
php + ajax 实现的写入数据库操作简单示例
May 16 PHP
PHP获取类私有属性的3种方法
Sep 10 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和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
深入理解javascript的执行顺序
2014/04/04 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
Python 开发Activex组件方法
2009/11/08 Python
pyside写ui界面入门示例
2014/01/22 Python
Python MySQLdb Linux下安装笔记
2015/05/09 Python
python抽象基类用法实例分析
2015/06/04 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
2016/03/19 Python
一文总结学习Python的14张思维导图
2017/10/17 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
Python中按值来获取指定的键
2019/03/04 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
python解析xml简单示例
2019/06/21 Python
python 制作简单的音乐播放器
2020/11/25 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
自荐信结尾
2013/10/27 职场文书
社区包粽子活动方案
2014/01/21 职场文书
高一军训决心书
2015/02/05 职场文书
优秀团员主要事迹范文
2015/11/05 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
分析Netty直接内存原理及应用
2021/06/14 Java/Android
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫