listbehavior Easy working with status-like attributtes of active record (represent text and html for integer values)

  1. Requirements
  2. Usage
  3. Additional
  4. History

Let's assume you have active record with Status attribute. Status can be Created, Confirmed and Rejected. In database table you have column status_id and store ID of each status according to some map, e.g.
ID Status
0 Created
10 Confirmed
20 Rejected


There are two ways of storing text representation of statuses:

  1. create additional table in database, e.g. tbl_status (id, text), create Status model and setup relation
  2. store in php code as constants (and this extension should help)

If you have many statuses or they are changing frequently I suggest to use first way.
But if statuses more or less fixed and you don't want to create additional table/model you can try ListBehavior. With it you can easliy use constants (such as STATUS_CREATED etc.), show text and html representations and get array with all values (for dropdown).


Developed and tested on Yii 1.1.10


1.Copy ListBehavior.php into protected/components folder.
2.Create your class extending ListBehavior like this:

class StatusBehavior extends ListBehavior 
    const CREATED                = 1;
    const CONFIRMED              = 10;
    const CANCELLED              = 20;

    public function data()
        return array(
            self::CREATED          => array('text' => 'Created',     'color' => 'gray'),
            self::CONFIRMED        => array('text' => 'Confirmed',   'color' => 'green'),  
            self::CANCELLED        => array('text' => 'Rejected',    'color' => 'red'),  

   /* or if you need only text
    public function data()
        return array(
            self::CREATED          => 'Created',
            self::CONFIRMED        => 'Confirmed',
            self::CANCELLED        => 'Rejected',  

You can put this file to models directory as it's looks like tiny model.

3.Attach your behavior to active record (attribute parameter is requred):

class Document extends CActiveRecord
    public function behaviors()
        return array(      
           'status' => array(
                'class' => 'StatusBehavior',
                'attribute' => 'status_id',

4.That's it! Now you can use it via $model->status->text and $model->status->html.

$model = Document::model()->findByPk($pk);
echo $model->status->html;

Or in columns property of CGridView:

$this->widget('zii.widgets.grid.CGridView', array(
  'columns' = array(
       'type' => 'raw',
       'header' => 'Document Status',
       'value' => '$data->status->html',

To get array with all possible values (e.g. for dropdown in form):

$listData = Document::model()->status->getList();
echo $form->activeDropDownList($model, 'status_id', $listData);


  • you can change html representation via parameter htmlTemplate. It's default value is:
<span style="color: {color}">{text}</span>

There can be any tokens taken from array keys of data() method.

  • you can change text for not-found values via undefinedText param.
  • you can easily use constants like this way:
if($model->status_id == StatusBehavior::CREATED) {


May, 8
Redesigned and fixed #8032

April, 23
Initial release

All comments are welcome!