Changes
Title
unchanged
Limit a CGridView field to some preset length.
Category
unchanged
How-tos
Yii version
unchanged
Tags
unchanged
CGridView, width, column, tooltip
Content
changed
[...]
1) a) Create the formatter method:
```php
class YFormatter extends CFormatter {
/* @var int The text length limit for the ShortText formatter. */
public $shortTextLimit= 20;
/**
*
* Text formatter shortening long texts and displaying the full text[...]
*/
public function formatShortText($value) {
$retval=CHtml::encode($value);
if(strlen($value)>$this->shortTextLimit) {
$retval=CHtml::tag('span',array('title'=>$
retval
ue),CHtml::encode(
mb_substr($value,0,$this->shortTextLimit-3
).'...'),Yii::app()->charset).'...'));
} else {
$retval=CHtml::encode($value);
}
return $retval;[...]
That's it. As you can imagine it is pretty easy to add other similar formatters.
Well, too bad that we can not set some parameters for the format from within the gridview setup, isn't it? Ok, I have a solution for it.
First we add an extra method to our implementation of the formatter which overrides the default one, we also update our shortText formatter, and we change our gridview setup.
```php
class YFormatter extends CFormatter {
[...]
/**
* Override the default format function to allow paramters to the formatter.
*
* (non-PHPdoc)
* @see CFormatter::format()
*/
public function format($value,$type)
{
$params=null;
if(is_array($type)) {
$params=$type;
$type=$type['type'];
}
$method='format'.$type;
if(method_exists($this,$method)) {
if($params===null) {
return $this->$method($value);
} else {
return $this->$method($value,$params);
}
} else {
throw new CException(Yii::t('yii','Unknown type "{type}".',array('{type}'=>$type)));
}
}
/** Added '$params' */
public function formatShortText($value,$params=array()) {
if(isset($params['length'])) {
$len=$params['length'];
} else {
$len=$this->shortTextLimit;
}
if(strlen($value)>$len) {
$retval=CHtml::tag('span',array('title'=>$value),CHtml::encode(mb_substr($value,0,$len-3,Yii::app()->charset).'...'));
} else {
$retval=CHtml::encode($value);
}
return $retval;
}
```
And a slightly modified way to define this type in our column:
```php
'columns'=>array(
array('name'=>'description',
'type'=>array('type'=>'shortText','length'=>30,),
),
```
So now we can set the length of our field. You can do use the same method for setting paramters for a datetime formatter, ... .