Расширение CGridView

В очередной раз используя мощный виджет CGridView, обнаружил, что для строк нет возможности устанавливать id, хотя для class такая возможность предусмотрена. Странно, что разработчики не учли такую возможность из «коробки». Решил расширить виджет и добавить данный функционал.
Не чего сложно поэтому сразу привожу, то что получилось PGridView.php:

<?php
/**
 * Class PGridView
 * @author: Konstantin Perminov (SpiLLeR)
 * @link: http://devkp.ru
 */
Yii::import('zii.widgets.grid.CGridView');

class PGridView extends CGridView {
    /**
     * @var  string a PHP expression that is evaluated for every table body row and whose result
     * is used as the HTML id for the row. In this expression, the variable <code>$row</code>
     * stands for the row number (zero-based), <code>$data</code> is the data model associated with
     * the row, and <code>$this</code> is the grid object.
     */
    public $rowIdExpression;

    /**
     * Renders a table body row.
     * @param integer $row the row number (zero-based).
     */
    public function renderTableRow($row) {
        $idStr = '';
        $classStr = '';

        if($this->rowIdExpression !== null) {
            $data=$this->dataProvider->data[$row];
            $idStr = $this->evaluateExpression($this->rowIdExpression, array('row'=>$row, 'data'=>$data));
        }

        if($this->rowCssClassExpression !== null) {
            $data = $this->dataProvider->data[$row];
            $classStr = $this->evaluateExpression($this->rowCssClassExpression,array('row'=>$row,'data'=>$data));
        } else if(is_array($this->rowCssClass) && ($n = count($this->rowCssClass)) > 0)
            $classStr = $this->rowCssClass[$row%$n];

        echo '<tr'.(!empty($idStr) ? ' id="'.$idStr.'"' : '')
                .(!empty($classStr) ? ' class="'.$classStr.'"' : '').' >' ;

        foreach($this->columns as $column)
            $column->renderDataCell($row);
        echo "</tr>\n";
    }
}

RequiredNumberFromListValidator

На днях понадобился валидатор, который из списка атрибутов указывает количество атрибутов, которое обязательно для заполнения. Для этого расширил стандартный валидатор CRequiredValidator. По умолчанию количество обязательных полей равно 1.

Пример:
Допустим у нас в форме контактной информации пользователя есть телефон, факс и мобильный номер. Нам необходимо чтобы пользователь заполнил хотя бы одно из 3х полей. Для этого в правилах(rules) модели указываем:

array('mobile_phone, landline_phone, fax', 'RequiredFromListValidator'),

Теперь если один или более атрибутов из списка заполнены, то валидации пройдет успешно. Если нет, то будет сгенерировано стандартное сообщение CRequiredValidator. Это не совсем соответствует идеи валидатора, но я пока так и не смог решить, как лучше обрабатывать ошибки. Если у кого-то будут идеи, готов выслушать.

Примечание:
Не забывайте подключить валидатор в конфигурационном файле приложения или указывайте путь к файлу в правилах(rules) модели.

Код на гитхабе: https://github.com/SpiLLeR/blog-code/blob/master/RequiredNumberFromListValidator.php