Hello i’m here a new guy.
So i have question about tag cloud which a in demo…
I make same Database and same file with ext… but then i whant to display nothing don’t show… any help?
components/TagCloud.php
<?php
Yii::import('zii.widgets.CPortlet');
class TagCloud extends CPortlet
{
public $title='Tags';
public $maxTags=20;
protected function renderContent()
{
$tags=Tag::model()->findTagWeights($this->maxTags);
foreach($tags as $tag=>$weight)
{
$link=CHtml::link(CHtml::encode($tag), array('post/index','tag'=>$tag));
echo CHtml::tag('span', array(
'class'=>'tag',
'style'=>"font-size:{$weight}pt",
), $link)."\n";
}
}
}
models/Tag.php
<?php
class Tag extends CActiveRecord {
public static function model($className=__CLASS__) {
return parent::model($className);
}
public function tableName() {
return '{{tag}}';
}
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),
array('id, name, frequency', 'safe', 'on'=>'search'),
);
}
public function relations() {
return array(
);
}
public function attributeLabels() {
return array(
'id' => 'id',
'name' => 'name',
'frequency' => 'frequency',
);
}
public function findTagWeights($limit = 20) {
$models=$this->findAll(array(
'order' => 'frequency DESC',
'limit' => $limit,
));
$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;
}
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');
}
}
And in a view…
<?php $this->widget('TagCloud', array(
'maxTags'=>Yii::app()->params['tagCloudCount'],
)); ?>