• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با تگ
#1
سلام

من میخوام مانند بلاگ که داخل دمو فریمورک است، وقتی کاربر می‌خواهد تگی را وارد کند، به او پیشنهاد دهیم از بین تگ‌های موجود در دیتا بیس.

ولی این کد من کار نمیکنه دلیلش چیه


postcontroller

کد پی‌اچ‌پی:
    /**
     * Suggests tags based on the current user input.
     * This is called via AJAX when the user is entering the tags input.
     */
    
public function actionSuggestTags()
    {
        if(isset(
$_GET['q']) && ($keyword=trim($_GET['q']))!=='')
        {
            
$tags=Tag::model()->suggestTags($keyword);
            if(
$tags!==array())
                echo 
implode("\n",$tags);
        }
    } 



models/tag
کد پی‌اچ‌پی:
<?php

class Tag extends CActiveRecord
{
    
/**
     * The followings are the available columns in table 'tag':
     * @var integer $id
     * @var string $name
     * @var integer $frequency
     */

    /**
     * Returns the static model of the specified AR class.
     * @return CActiveRecord the static model class
     */
    
public static function model($className=__CLASS__)
    {
        return 
parent::model($className);
    }

    
/**
     * @return string the associated database table name
     */
    
public function tableName()
    {
        return 
'{{tag}}';
    }

    
/**
     * @return array validation rules for model attributes.
     */
    
public function rules()
    {
        
// NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        
return array(
            array(
'name''required'),
            array(
'frequency''numerical''integerOnly'=>true),
            array(
'name''length''max'=>128),
        );
    }

    
/**
     * @return array relational rules.
     */
    
public function relations()
    {
        
// NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        
return array(
        );
    }

    
/**
     * @return array customized attribute labels (name=>label)
     */
    
public function attributeLabels()
    {
        return array(
            
'id' => 'Id',
            
'name' => 'Name',
            
'frequency' => 'Frequency',
        );
    }

    
/**
     * Returns tag names and their corresponding weights.
     * Only the tags with the top weights will be returned.
     * @param integer the maximum number of tags that should be returned
     * @return array weights indexed by tag names.
     */
    
public function findTagWeights($limit=20)
    {
        
$models=$this->findAll(array(
            
'order'=>'frequency DESC',
            
'limit'=>$limit,
        ));
        foreach(
$models as $id=>$model) {
            
$postCriteria=new CDbCriteria();
            
$postCriteria->addSearchCondition('tags',$model->name);
            
$posts Post::model()->findAll($postCriteria);
            if(!
$posts) {
                unset(
$models[$id]);
            }
        }
     
        
$total=0;
        foreach(
$models as $model)
            
$total+=$model->frequency;
     
        
$tags=array();
        if(
$total>0)
        {
            foreach(
$models as $model)
                
$tags[$model->name]=8+(int)(16*$model->frequency/($total+10));
            
ksort($tags);
        }
        return 
$tags;
    }

    
/**
     * Suggests a list of existing tags matching the specified keyword.
     * @param string the keyword to be matched
     * @param integer maximum number of tags to be returned
     * @return array list of matching tag names
     */
    
public function suggestTags($keyword,$limit=20)
    {
        
$tags=$this->findAll(array(
            
'condition'=>'name LIKE :keyword',
            
'order'=>'frequency DESC, Name',
            
'limit'=>$limit,
            
'params'=>array(
                
':keyword'=>'%'.strtr($keyword,array('%'=>'\%''_'=>'\_''\\'=>'\\\\')).'%',
            ),
        ));
        
$names=array();
        foreach(
$tags as $tag)
            
$names[]=$tag->name;
        return 
$names;
    }

    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 function 
updateFrequency($oldTags$newTags)
    {
        
$oldTags=self::string2array($oldTags);
        
$newTags=self::string2array($newTags);
        
$this->addTags(array_values(array_diff($newTags,$oldTags)));
        
$this->removeTags(array_values(array_diff($oldTags,$newTags)));
    }

    public function 
addTags($tags)
    {
        
$criteria=new CDbCriteria;
        
$criteria->addInCondition('name',$tags);
        
$this->updateCounters(array('frequency'=>1),$criteria);
        foreach(
$tags as $name)
        {
            if(!
$this->exists('name=:name',array(':name'=>$name)))
            {
                
$tag=new Tag;
                
$tag->name=$name;
                
$tag->frequency=1;
                
$tag->save();
            }
        }
    }

    public function 
removeTags($tags)
    {
        if(empty(
$tags))
            return;
        
$criteria=new CDbCriteria;
        
$criteria->addInCondition('name',$tags);
        
$this->updateCounters(array('frequency'=>-1),$criteria);
        
$this->deleteAll('frequency<=0');
    }



تیبل تگ هم اینگونه ساخته شده


کد پی‌اچ‌پی:
CREATE TABLE tbl_tag
(
    
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
    
name VARCHAR(128NOT NULL,
    
frequency INTEGER DEFAULT 1
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


مرسی‌
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان