首先-我是Yii框架的新手。我自己做了一些研究,但我找不到一个精确的解决方案。
假设有两个相关的模型——Product和Image。单个产品可以分配多个图像。创建能够管理这种模式的创建/更新表单的最佳方法是什么?
Image模型由各种字段组成,以及图像文件的路径,因此它不仅仅是路径本身的"容器"。更重要的是,我需要为每个上传的图像生成缩略图,并将其路径存储在同一模型中。
我需要实现的是非常类似于Django中已知的admin内联功能-在产品创建/更新表单中应该有一个部分允许用户添加/修改/删除图像。
我尝试了multimodelform扩展,但我无法让文件上传工作。什么是最好的方法来完成它,而不必手动构建整个支持文件上传的多模型表单结构?
具体的解决方案取决于您是使用CActiveForm还是html表单。因为你有2个相关的模型,我假设你正在使用CActiveForm,并会指出一些你需要记住的事情。
对于这个例子,我将假设一些定义带有字段id, name的产品与ProductImage上的"图像"有一对多关系的产品包含字段id, productId, path的ProductImage
我也假设有一次上传/编辑,但多次删除
视图如下:
$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,
));
}
现在请注意,这个解决方案没有经过测试,所以会有bug,但它应该给你一个关于如何编写自己的表单的想法。
资源: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