Limit a CGridView field to some preset length.

You are viewing revision #5 of this wiki article.
This version may not be up to date with the latest version.
You may want to view the differences to the latest version or see the changes made in this revision.

« previous (#3)next (#6) »

Sometimes text inside a gridview column is just too long. That's why I figured out a way to make the column smaller while still providing the information.

How about the example just below. Hover over the text to see what happens:

Create test acco...

Right: the full text appears when you hover over the text.

That's great for the backoffice grid views where you often show tons of information. If you want fancier effects, you can achieve them using bootstrap tooltips for instance in a similar way. The purpose of this article is to present a method to do this (which in itself already works!).

The method consists of: 1) Creating a new formatter method. 2) Refer to the formatter method in the CGridView column specification.

1) a) Create the formatter method:

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
     * as the span title.
     *
     * To be used in GridViews for instance.
     * @param string $value
     * @return string  Encoded and possibly html formatted string ('span' if the text is long).
     */
    public function formatShortText($value) {
        if(strlen($value)>$this->shortTextLimit) {
            $retval=CHtml::tag('span',array('title'=>$value),CHtml::encode(mb_substr($value,0,$this->shortTextLimit-3,Yii::app()->charset).'...'));
        } else {
            $retval=CHtml::encode($value);
        }
        return $retval;
    }
}

1) b) Make sure that your formatter class is used by adjusting the project configuration: Specify the new formatter as class for the 'format' component in config.php:

'components'=>array(
        'format'=>array(
            'class'=>'YFormatter',
        ),
    ),

2) In the gridview, specify 'shortText' as the formatter (because we called our formatter method 'formatShortText'):

'columns'=>array(
	array('name'=>'description',
		  'type'=>'shortText'),
),

That's it. As you can imagine it is pretty easy to add other similar formatters.