詳細な解決策は、CActiveForm または CHtml フォームを使用しているかどうかによって異なります。関連する 2 つのモデルがあるため、CActiveForm を使用していると仮定し、留意すべき点を指摘します。
この例では、いくつかの定義 Product をフィールド id、name Product で、ProductImage の「images」と 1 対 MANY の関係を持ち、フィールド id、productId、path を含む ProductImage と仮定します。
また、アップロード/編集は1回ですが、複数の削除があると想定しています
ビューは次のとおりです。
$form = $this->beginWidget(
'CActiveForm',
array(
'id' => 'upload-form',
'enableAjaxValidation' => false,
'htmlOptions' => array('enctype' => 'multipart/form-data'),
)
);
echo $form->labelEx($product, 'name');
echo $form->fileField($product, 'name');
echo $form->error($product, 'name');
echo $form->checkBoxList($product, 'path', $product->images);
echo $form->labelEx($productImage, 'path');
echo $form->fileField($productImage, 'path');
echo $form->error($productImage, 'path');
$this->endWidget();
そしてあなたの行動
public function actionUpdate($productId) {
$product = Product::model()->findByPk($productId)->with('images');
$productImage = new ProductImage();
if(isset($_POST['Item']))
{
$product->attributes=$_POST['Product'];
foreach($product->images as $im) {
if(in_array($im->path, $_POST['Item']['Image']))
$im->delete();
}
$productImage->image=CUploadedFile::getInstance($productImage,'path');
if($productImage->save())
{
$productImage->image->saveAs('some/new/path');
// redirect to success page
}
}
$this->render('update', array(
'product'=>$product,
'productImage'=>$productImage,
));
}
このソリューションはテストされていないため、バグがあることに注意してください。ただし、独自のフォームを作成する方法についてのアイデアが得られるはずです。
リソース:
http://www.yiiframework.com/wiki/2/how-to-upload-a-file-using-a-model/
http://www.yiiframework.com/wiki/384/creating-and-updating-model-and-its-related-models-in-one-form-inc-image