Небольшие хитрости с Yii CGridView, или как избавиться от написания кода в строке для eval.

Всем нам не раз досаждала такая пакость, как необходимость писать большущие строки в представлении столбца в CGridView. А для чего? А чтобы не потерять переменные $data и (в меньшей степени) $row. Так вот, в нашу эпоху трайтов и анонимных функций (спасибо PHP 5.4+) можно больше не городить чего-то вроде:

array(
'name' => 'quantity',
'header' => 'Количество',
'type' => 'raw',
'value' => 'что-тосовершенноадское с $data->value $data->quantity etc',
),

А воспользоваться более элегантными вещами, через анонимную функцию и трайт, например.


//....

$controller = $this;

// ...

array(
'name' => 'quantity',
'header' => 'Количество',
'type' => 'raw',
'value' => function($data, $row) use ($controller) {
    return $controller->renderPartial('basketCols/__quantity', array('data' => $data), true);
},
),

Что происходит? А всё просто — мы можем для ячеек использовать свои собственные представления, из отдельных файлов, в которые спокойно передаем ту же $data, и там с ней работаем как с обычной переменной в шаблоне. При этом $data может являться, например, моделью, полученной для CGridView из CArrayDataProvider (или CActiveDataProvider). Если вам там надо просто сформировать какую-то дикую ссылку, то не надо даже извращения с $controller — просто юзайте статический вызов CController::createUrl(‘some paths’, array(‘param’ => ‘some param’)).

При этом внутри анонимной функции может быть сколь угодно сложный код, для которого не теряется читаемость, подсветка, и прочее, как это происходило бы в случае стандартной строки для eval. И более того, вы больше не будете вынуждены выискивать ошибку, которую вы допустили в процессе написания кода внутри строки.