2015-06-19 4 views
0

Я работаю над приложением Yii 1.1.16 и имеют следующие трудности:Как заполнить данные, предоставленные моделью CActiveRecord в Yii?

Существует модель FooModel на основе CActiveRecord. За это таблица bar_table базы данных с очень неудобной структурой данных:

id: integer 
some_column: string 
data: string <- JSON 

Это означает, что я получаю почти целые данные в виде строки JSON. (Да, это безумие, но теперь я принимаю его как указано.)

В представлении данные должны быть переданы в CGridView виджетом и показаны в виде таблицы. Это означает, что я должен изменить данные, чтобы отобразить их.

Я вижу в возможности/места, чтобы сделать это:

  1. На уровне модели, вероятно, в классе модели. Затем виджет получит модифицированные данные и обработает их, как обычно.
  2. На уровне видимости, вероятно, в файле вида. Тогда мне придется модифицировать данные, полученные мной из модели, и передать их каким-то образом виджету.

Что такое лучший подход (или, может быть, есть гораздо более элегантной и как это осуществить?

ответ

0

Вот уродливое решение (некрасиво, потому что общественное свойство используется), в любом случае это работает:

модель класса Foo

class Foo extends CActiveRecord { 
    ... 
    public $buz; 
    ... 
    public function findAll($condition, $params=array()) { 
     $resultData = parent::findAll($condition='', $params); 
     foreach ($resultData as $key => $insuranceExternal) { 
      $data = json_decode($insuranceExternal->getAttribute('data'), true); 
      $insuranceExternal->setAttribute('myAdditionalProperty', $data['baz']['buz']); 
     } 
     return $resultData; 
    } 
} 

вид

$dataProvider = $model->search(); 
$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'my-grid', 
    'dataProvider'=>$dataProvider, 
    'filter'=>$model, 
    'columns'=>array(
     ... 
     'myAdditionalProperty', 
    ), 
)); 
0

можно использовать метод "afterFind"/событие для обработки данных JSon

class Foo extends CActiveRecord { 

    protected function afterFind() 
    { 
    $this->data = json_decode($this->data); 
    }