Всем нам не раз досаждала такая пакость, как необходимость писать большущие строки в представлении столбца в 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. И более того, вы больше не будете вынуждены выискивать ошибку, которую вы допустили в процессе написания кода внутри строки.