问题是如果我想更新其他字段而不是图像。它通过验证,并且不更新任何字段。
但是,如果我更新图像和其他字段,它就会更新。 或者,如果我更新图像,它会更新。
视图:
<?php echo $form->labelEx($model,'pimg'); ?>
<?php echo $form->fileField($model, 'pimg',array('id'=>'imgInput',)); ?>
<?php echo $form->error($model,'pimg'); ?>
控制器:
public function actionEdit($id)
{
$model=$this->loadModel($id);
if(isset($_POST['Product']))
{
$model->pimg=CUploadedFile::getInstance($model,'pimg');
$fileName=$model->pimg;
$model->attributes=$_POST['Product'];
if($model->save())
$model->pimg->saveAs('images/'.$fileName);
$this->redirect(array('display','id'=>$model->productid));
}
$this->render('edit',array('model'=>$model,));
}
模型规则:
array('name, category, model, brand, description, price', 'required'),
array('pimg', 'file','types'=>'jpg','on'=>'create', 'allowEmpty'=>false),
array('pimg', 'file','types'=>'jpg','on'=>'update', 'allowEmpty'=>true),
我认为问题出在控制器上。 我不断收到错误:
Fatal error: Call to a member function saveAs() on a non-object in D:wampwwwtestfolderprotectedcontrollersProductController.php on line 147
line 147: $model->pimg->saveAs('images/'.$fileName);
图像出现,但随后 db 中的图像名称未显示在"选择文件"按钮渲染旁边,表示未选择任何文件。
请注意,我是 Yii 的新手,并且被困住了。
问题出在您的actionEdit
即这里
$model->pimg=CUploadedFile::getInstance($model,'pimg');
$fileName=$model->pimg;
$model->attributes=$_POST['Product'];
if($model->save())
$model->pimg->saveAs('images/'.$fileName);
在这里,您应该检查图像是否已上传。 发生的情况是 Yii 无法执行此行$model->pimg->saveAs('images/'.$fileName);
因为没有上传图像。 所以你需要把它包装在一个条件中,即
if(!empty($model->pimg))
{
$model->pimg->saveAs('images/'.$fileName);
}
所以你的最终代码应该是这样的
$model->attributes=$_POST['Product'];
$model->pimg=CUploadedFile::getInstance($model,'pimg');
if(!empty($model->pimg))
{
$fileName=$model->pimg->name;
$model->pimg->saveAs('images/'.$fileName);
}
if($model->save())
//render here
更新 1如果您希望更新时 null 不应存储在您的数据库中,那么您可以这样做
$model=$this->loadModel($id);
$prevImage=$model->pimg; //add this line
然后你在哪里使用它
if(!empty($model->pimg))
{
$model->pimg->saveAs('images/'.$fileName);
}
else{
$model->pimg=$prevIMage;
}
添加此其他代码