maxxdev
(Maxx)
1
Есть 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();
}
Есть ли иной способ сделать вышеописанную задачу?
rosko
(A)
2
Я все сохраняю в одном экшене.
rosko
(A)
3
В твоем примере это выглядело бы:
//сохраняем продукт
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));
}
maxxdev
(Maxx)
4
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 приходит пустиое значение.
rosko
(A)
5
Странно, ты в хтмл-форме установил ‘enctype’ => ‘multipart/form-data’ ?
Файл должен быть виден скорее не в $_POST, а в $_FILES
maxxdev
(Maxx)
6
Проверил рабочий пример, там поле 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);
все работает. Спасибо 