[moka同学笔记]二、Yii2.0课程笔记(魏曦老师教程)
一、在标签tags的model中
//使用正则表达式,把标签字符串转换成数组
public static function string2array($tags)
{
return preg_split('/\s*,\s*/',trim($tags),-1,PREG_SPLIT_NO_EMPTY);
} //把数组转换成字符串
public static function array2string($tags)
{
return implode(', ',$tags);
} //处理需要新增的标签
public static function addTags($tags)
{
if(empty($tags)) return ; foreach ($tags as $name)
{
$aTag = Tag::find()->where(['name'=>$name])->one();
$aTagCount = Tag::find()->where(['name'=>$name])->count(); if(!$aTagCount)
{
$tag = new Tag;
$tag->name = $name;
$tag->frequency = 1;
$tag->save();
}
else
{
$aTag->frequency += 1;
$aTag->save();
}
}
} //处理需要删除的标签
public static function removeTags($tags)
{
if(empty($tags)) return ; foreach($tags as $name)
{
$aTag = Tag::find()->where(['name'=>$name])->one();
$aTagCount = Tag::find()->where(['name'=>$name])->count(); if($aTagCount)
{
if($aTagCount && $aTag->frequency<=1)
{
$aTag->delete();
}
else
{
$aTag->frequency -= 1;
$aTag->save();
}
}
}
} //更新标签
public static function updateFrequency($oldTags,$newTags)
{
if(!empty($oldTags) || !empty($newTags))
{
$oldTagsArray = self::string2array($oldTags);
$newTagsArray = self::string2array($newTags); self::addTags(array_values(array_diff($newTagsArray,$oldTagsArray)));
self::removeTags(array_values(array_diff($oldTagsArray,$newTagsArray)));
}
}
二、标签model的使用位置分析

在post的model中
class Post extends \yii\db\ActiveRecord
{
private $_oldTags; public function afterFind()
{
parent::afterFind();
$this->_oldTags = $this->tags;
} public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
Tag::updateFrequency($this->_oldTags, $this->tags);
} public function afterDelete()
{
parent::afterDelete();
Tag::updateFrequency($this->tags, '');
}
[moka同学笔记]二、Yii2.0课程笔记(魏曦老师教程)的更多相关文章
- [moka同学笔记]三、Yii2.0课程笔记(魏曦老师教程)关联字段增加搜索
关联字段增加搜索 post表关联adminuser表,通过post.author_id adminuser.id关联,在YII2.0生成搜索,关联字段搜索时,需要输入关联字段author的id才能搜 ...
- [moka同学笔记]一、Yii2.0课程笔记(魏曦老师教程)
第一节 第二节 课程内容
- [moka同学笔记]八、Yii2.0课程笔记(魏曦老师教程)[授权]
数据库表创建 在执行yii rbac/init之前,需要在 \console\controllers\RbacController.php中 <?php namespace console\co ...
- [moka同学笔记]七、Yii2.0课程笔记(魏曦老师教程)[新增管理员,重置密码]
- [moka同学笔记]六、Yii2.0课程笔记(魏曦老师教程)[徽章气泡]
- [moka同学笔记]五、Yii2.0课程笔记(魏曦老师教程)[审核功能]
- [moka同学笔记]四、Yii2.0课程笔记(魏曦老师教程)[匿名函数的使用操作]
在评论页面中index.php中 [ 'attribute'=>'status', 'value'=>'status0.name', 'filter'=>Commentstatus: ...
- Yii2.0学习笔记:创建登录表单
第一步:在model层创建一个EntryForm.php文件 复制以下代码,注意model的文件.方法.类的命名规范(大小写) <?php namespace app\models; use Y ...
- Yii2.0学习笔记:第一个页面Saying Hello
Controller目录下创建TestController.php 复制下面代码,yii跟tp一样,全程命名空间 <?php namespace app\controllers; use yii ...
随机推荐
- lua以xpcall实现try/catch功能
-- 打印错误信息 local function __TRACKBACK__(errmsg) ); print("-------------------------------------- ...
- Atitit 颜色平均值cloor grb hsv模式的区别对比
Atitit 颜色平均值cloor grb hsv模式的区别对比 使用hsv模式平均后会变得更加的靓丽一些..2 public class imgT { public static void main ...
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...
- 基于 flow.ci 实现 PHP 项目自动化持续集成
高效程序员的习惯之一--让开发流程自动化.Automating shapes smarter future. 这是一个关于如何快速实现 PHP 项目自动化持续集成的快速指导.无论你是否使用过持续集成, ...
- KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常 ...
- LigerUI Tree
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=utf ...
- js中如果省略分号那么它是如何运行的
在javascript工作中,我们几乎不会去省略分号:为了不必要的麻烦以及代码的规范,那么如果我们省略:会发生呢?预知详情请听下回分解. 看代码! 片段一: 1 var a 2 = 3 8 4 con ...
- 将 PAGE_VERIFY 数据库选项设置为 CHECKSUM
此规则检查 PAGE_VERIFY 数据库选项是否已设置为 CHECKSUM.为 PAGE_VERIFY 数据库选项启用 CHECKSUM 后,SQL Server 数据库引擎会在向磁盘中写入页面时计 ...
- 【转】中间代码opcode的执行
原文链接:http://www.orlion.ga/941/ 原文:http://www.nowamagic.net/librarys/veda/detail/1543 假如我们现在使用的是CLI模式 ...
- nyoj 925 国王的烦恼(最小生成树)
/* 题意:N个城市中每两个城市有多条路径连接,可是因为路径存在的天数是有限的!以为某条路经不存在了 导致N个城市不能连通了,那么村名们就会抗议!问一共会有多少次抗议! 思路:最小生成树....我们用 ...