Сохранение модели Y из модели X

Есть 2 таблицы. Image и Product. Связь "многие к одному".

Задача: при сабмите формы сохранить данные о продукте и данные о картинках продукта в таблицы Image и Product.

Я делаю следующим образом




//сохраняем продукт

public function actionAdd()

    {

        $model=new Product;


        if(isset($_POST['Product']))

        {

		

            $model->attributes=$_POST['Product'];

            if(isset($_POST['previewProduct'])) //TODO add previe product ability

                $model->validate();

            else if($model->save())

            {

                $this->redirect(array('product/view/','product_id'=>$model->product_id));

            }

        }


        $this->render('add',array('model'=>$model));

    } 

И в модели Product переопределяем afterSave()




 protected function afterSave()

    {

        $model=new Image;

            $model->attributes=$_POST['Image'];

            $model->image=CUploadedFile::getInstance($model,'image');


			$model->size = $model->image->size;

			$model->name = time().$model->image->name;

			

        $model->save();


    }



Есть ли иной способ сделать вышеописанную задачу?

Я все сохраняю в одном экшене.

В твоем примере это выглядело бы:




//сохраняем продукт

public function actionAdd()

    {

        $model=new Product;


        if(isset($_POST['Product']))

        {

                

            $model->attributes=$_POST['Product'];

            if(isset($_POST['previewProduct'])) //TODO add previe product ability

                $model->validate();

            else if($model->save())

            {

                $img=new Image;

                $img->attributes=$_POST['Image'];


                $img->product_id = $model->id;


                $img->image=CUploadedFile::getInstance($model,'image');


                $model->size = $model->image->size;

                $model->name = time().$model->image->name;

                        

                $img->save();


                $this->redirect(array('product/view/','product_id'=>$model->product_id));

            }

        }


        $this->render('add',array('model'=>$model));

    } 



ProductController


 public function actionAdd()

    {

        $model=new Product;

		$img=new Image;



_form


<div class="form_row">

              <label class="contact"><strong><? echo CHtml::activeLabel($img,'image'); ?></strong></label>

			 			  <?php echo CHtml::activeFileField($img, 'image'); ?>

            </div>

...

<?php echo CHtml::linkButton($update ? Yii::t('lan','Сохранить') : Yii::t('lan','Добавить'),array('id' => "submit", 'class' => "prod_details")); ?>			</div>



В html source появляется hidden поле


<input id="ytImage_image" type="hidden" name="Image[image]" value=""/>

<input id="Image_image" type="file" name="Image[image]"/>

каким образом оно сгенерилось?

В результате в $_POST приходит пустиое значение.

Странно, ты в хтмл-форме установил ‘enctype’ => ‘multipart/form-data’ ?

Файл должен быть виден скорее не в $_POST, а в $_FILES

Проверил рабочий пример, там поле hidden то же появлялось.

Все данные ор файле доступны через




$img->image=CUploadedFile::getInstance($img,'image');

//тут заполняем поля таблицы Image

$img->size = $img->image->size;

$img->name = time().$img->image->name;

$img->product_id = $model->product_id;

if($img->save())	$img->image->saveAs($imagesDir.$img->name);

все работает. Спасибо :slight_smile: