详细的解决方案取决于您使用的是 CActiveForm 还是 CHtml 表单。由于您有 2 个相关模型,我假设您正在使用 CActiveForm,并且会指出您需要记住的一些事情。
对于这个例子,我将假设一些具有字段 id 的定义 Product,名称 Product 与 ProductImage 上的“图像”有 ONE to MANY 关系,具有字段 id、productId、path
我还假设会有 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