Вход Регистрация
Файл: system/controllers/tags/model.php
Строк: 169
<?php

class modelTags extends cmsModel{


    public function 
filterTarget($controller$subject$id){

        
$this->filterEqual('target_controller'$controller);
        
$this->filterEqual('target_subject'$subject);
        
$this->filterEqual('target_id'$id);

        return 
$this;

    }

    public function 
addTags($tags_string$controller$subject$id){

        
$tags_string trim($tags_string);
        if (!
$tags_string) { return false; }

        
$tags explode(","$tags_string);

        
$tags_ids = array();
        
$tags_inserted = array();

        foreach(
$tags as $tag){

            
$tag mb_strtolower(trim($tag));

            if (!
$tag){ continue; }

            if (
in_array($tag$tags_inserted)){ continue; }

            
$tag_id $this->registerTag($tag);

            if (!
$tag_id) { continue; }

            
$this->insert('tags_bind', array(
                
'tag_id' => $tag_id,
                
'target_controller' => $controller,
                
'target_subject' => $subject,
                
'target_id' => $id,
            ));

            
$tags_inserted[] = $tag;
            
$tags_ids[] = $tag_id;

        }

        
$this->recountTagsFrequency($tags_ids);

        
cmsCache::getInstance()->clean("tags.tags");

        return 
true;

    }

    public function 
recountTagsFrequency($tags_ids=array()){
    
        
$this->
            
select('t.id''tag_id')->
            
select('COUNT(i.tag_id)''frequency')->
            
joinRight('tags''t''t.id = i.tag_id')->
            
groupBy('t.id');

        if (
$tags_ids){
            
$this->filterIn('t.id'$tags_ids);
        }

        
$binds $this->get('tags_bind');

        if (
is_array($binds)){
            foreach (
$binds as $item){
                if (
$item['frequency']){
                    
$this->update('tags'$item['tag_id'], array('frequency' => $item['frequency']));
                } else {
                    
$this->deleteTag($item['tag_id']);
                }
            }
        }

        
cmsCache::getInstance()->clean("tags.tags");

    }

    public function 
updateTags($tags_string$controller$subject$id){

        
$this->filterTarget($controller$subject$id);
        
$this->deleteFiltered('tags_bind');

        return 
$this->addTags($tags_string$controller$subject$id);

    }

    public function 
registerTag($tag){

        
$id $this->insertOrUpdate('tags', array('tag' => $tag));

        if (!
$id) { return $this->getTagId($tag); }

        return 
$id;

    }

    public function 
getTagId($tag){

        return 
$this->filterEqual('tag'$tag)->getFieldFiltered('tags''id');

    }

    public function 
getTagTargets($tag_id){

        
$binds $this->filterEqual('tag_id'$tag_id)->get('tags_bind');

        if (!
$binds) { return false; }

        
$targets = array();

        foreach (
$binds as $bind){
            
$targets[$bind['target_controller']][] = $bind['target_subject'];
        }

        return 
$targets;

    }

    public function 
getTagsForTarget($controller$subject$id){

        
$this->useCache('tags.tags');

        
$this->filterTarget($controller$subject$id);

        
$this->select('t.tag''tag');

        
$this->join('tags''t''t.id = i.tag_id');

        return 
$this->get('tags_bind', function($item$model){
            return 
$item['tag'];
        });

    }

    public function 
getTagsIDsForTarget($controller$subject$id){

        
$this->useCache('tags.tags');

        
$this->filterTarget($controller$subject$id);

        
$this->select('t.tag''tag');

        
$this->join('tags''t''t.id = i.tag_id');

        return 
$this->get('tags_bind', function($item$model){
            return 
$item['tag_id'];
        });

    }

    public function 
getTagsStringForTarget($controller$subject$id){

        
$tags $this->getTagsForTarget($controller$subject$id);

        if (
$tags) { $tags implode(', '$tags); }

        return 
$tags;

    }

    public function 
getTagsCount(){

        return 
$this->getCount('tags');

    }

    public function 
getTags(){

        
$this->useCache('tags.tags');

        return 
$this->get('tags');

    }

    public function 
getTag($tag_id){

        
$this->useCache('tags.tags');

        return 
$this->getItemById('tags'$tag_id);

    }

    public function 
getMaxTagFrequency(){

        
$this->useCache('tags.tags');

        return 
$this->getMax('tags''frequency');

    }

    public function 
updateTag($tag_id$tag){

        
cmsCache::getInstance()->clean("tags.tags");

        return 
$this->update('tags'$tag_id$tag);

    }

    public function 
deleteTag($tag_id){

        
$this->delete('tags'$tag_id);

        
$this->filterEqual('tag_id'$tag_id)->deleteFiltered('tags_bind');

        
cmsCache::getInstance()->clean("tags.tags");

    }

    public function 
deleteTags($controller$subject$id){

        
$tags_ids $this->getTagsIDsForTarget($controller$subject$id);
        
        if (!
$tags_ids) { return; }
        
        
$this->filterIn('tag_id'$tags_ids);

        
$this->deleteFiltered('tags_bind');
        
        
cmsCache::getInstance()->clean("tags.tags");

        
$this->recountTagsFrequency($tags_ids);

        return 
true;

    }

    public function 
mergeTags($child_id$parent_id){

        
$this->
            
filterEqual('tag_id'$child_id)->
            
updateFiltered('tags_bind', array(
                
'tag_id' => $parent_id
            
));

        
$this->recountTagsFrequency(array($parent_id));

        
$this->deleteTag($child_id);

        
$this->removeDoubles($parent_id);

    }

    public function 
removeDoubles($tag_id){

        
$this->
            
select('COUNT(i.tag_id) as qty')->
            
filterEqual('tag_id'$tag_id)->
            
groupBy('target_controller, target_subject, target_id')->
            
get('tags_bind', function($item$model){

                if (
$item['qty'] > 1){
                    
$model->delete('tags_bind'$item['id']);
                }

            });

        
cmsCache::getInstance()->clean("tags.tags");

    }


}
Онлайн: 0
Реклама