[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, '');
    }

 

posted @ 2016-11-14 17:01  mokal同学  阅读(717)  评论(0编辑  收藏  举报