Здравствуйте.
У нас такая ситуация, что с формы создания элемента (объекта недвижемости) приходят данные, которые ещё надо преобразовывать.
Мы делаем так.
В контроллере
$model=new Object;
if(isset($_POST['Object']))
{
$model->attributes=$_POST['Object'];
$this->saveModel($model);
}
вызывается метод saveModel, в котором описаны все дотолнительные преобразования:
public function saveModel($model, $modelName='')
{
$model->city_name = '';
if($model->city>0){
$t_City = City::model()->findByPk($model->city);
$model->city_name = $t_City->name.' '.$t_City->Short.'.';
}elseif($model->settlement>0){
$t_Settlement = Settlement::model()->findByPk($model->settlement);
$model->settlement_name = $t_Settlement->name.' '.$t_Settlement->Short.'.';
};
$model->street_name = '';
if($model->street>0){
$t_Street = Street::model()->findByPk($model->street);
$model->street_name = $t_Street->name.' '.$t_Street->Short.'.';
};
if (isset($_POST['Object']['floors'])){
if (count($_POST['Object']['floors'])>0){
foreach($_POST['Object']['floors'] as $f_number){
$i_floor = new ObjectFloor();
$i_floor->floor = intval($f_number);
$floors[] = $i_floor;
}
$model->floors = $floors;
}
}else{
$model->floors = array();
};
//станции метро
if (isset($_POST['Object']['metroStations'])){
if (count($_POST['Object']['metroStations'])>0){
foreach($_POST['Object']['metroStations'] as $f_metro_id){
$i_mStation = MetroStation::model()->findByPk($f_metro_id);
if ($i_mStation->validate()){
$nStations[] = $i_mStation;
}
}
$model->metroStations = $nStations;
}
}else{
$model->metroStations = array();
};
$photos = CUploadedFile::getInstancesByName('Object[photos]');
$photos_title = empty($_POST['Object']['photos_title']) ? array() : $_POST['Object']['photos_title'];
$load_photos_id = empty($_POST['Object']['load_photos_id']) ? array() : $_POST['Object']['load_photos_id'];
$load_photos_title = empty($_POST['Object']['load_photos_title']) ? array() : $_POST['Object']['load_photos_title'];
$load_photos_name = empty($_POST['Object']['load_photos_name']) ? array() : $_POST['Object']['load_photos_name'];
if($model->validate()){
$model->bBids = $model->createSemilar();
$model->save();
ObjectFloor::model()->deleteAll('object='.$model->id);
foreach($model->floors as $i_floor){
$i_floor->object = $model->id;
$i_floor->save();
};
$model_photos = $model->photos;
if (!empty($model_photos)) {
foreach ($model_photos as $photo) {
if (!in_array($photo->idphotos, $load_photos_id)){
$photo->delete();
}
}
}
foreach ($load_photos_id as $key => $photo) {
$newPhoto = Photo::model()->findByPk($photo);
//$newPhoto = new Photo;
$newPhoto ->title = $load_photos_title[$key];
$newPhoto ->name = $load_photos_name[$key];
$newPhoto ->object = $model->id;
if($newPhoto ->save()){}
}
foreach ($photos as $key => $photo) {
if (!empty($photo)) {
$photoDir = Yii::getPathOfAlias('webroot').Yii::app()->params['uploadPath'].'/uploaded/photos/'.$model->id.'/';
$photoPath = $photoDir.$photo->name;
if (!is_dir($photoDir)) mkdir($photoDir, 0777, true);
if (is_file($photoPath)) unlink($photoPath);
$newPhoto = new Photo;
$newPhoto ->title = $photos_title[$key];
$newPhoto ->name = $photo->name;
$newPhoto ->object = $model->id;
if($newPhoto->validate()){
$photo->saveAs($photoPath);
$newPhoto ->save();
}
}
}
$this->redirect(array('view','id'=>$model->id));
};
}
Как видно, что дополнительно преобразуются названяи города, название улицы, этажи, станции метро, фотографии.
Ясно что такому коду в контроллере не место. Поэтому вопрос такой: где лучше писать этот код (скорее всего в модели?) и, главное, как туда перенести все преобразование: либо тупо создать функции и прямо перенести в модель весь кож, либо через get/set полей которые не существуют в базе (создадим отдельно как свойства класса) и передавать во вьюшку не реальные названия полей, а "виртуальные"?
Либо может существует какой-то другой метод?
Заранее спасибо.