起初 - 我是Yii框架的新手。我自己做了一些研究,但是找不到我问题的精确解决方案。
假设有两个相关的模型 - 产品和图像。单个产品可能分配了多个图像。创建能够管理此类方案的创建/更新表单的最佳方法是什么?
Image模型包含各种字段以及图像文件的路径,因此它不仅仅是路径本身的“容器”。更重要的是 - 我需要为每个上传的图像生成缩略图,并将其路径存储在同一模型中。
我需要实现的与Django中已知的管理内联功能非常相似 - 产品创建/更新表单中应该有一个部分允许用户添加/修改/删除图像。
我尝试了multimodelform扩展,但我无法上传文件。完成任务的最佳方法是什么,而不必手动构建整个file-upload-enabled-multiple-model-form结构?
答案 0 :(得分:0)
详细解决方案取决于您使用的是CActiveForm还是CHtml表单。由于您有2个相关模型,我假设您使用的是CActiveForm,并指出您需要记住的一些事项。
对于这个例子,我将假设一些定义 带有字段ID,名称的产品 与ProductImage上的“图像”具有一对多关系的产品 带有字段id,productId,路径
的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/