不更新图像不会更新记录

时间:2013-12-19 05:43:05

标签: yii-extensions yii yii-components yii-events

问题是我是否要更新其他字段而不是图像。它通过验证,不会更新任何字段。

但是,如果我更新图像和其他更新的字段。或者,如果我更新图像,则会更新。

查看:

<?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:\wamp\www\testfolder\protected\controllers\ProductController.php on line 147

 line 147:  $model->pimg->saveAs('images/'.$fileName);

图像出现,但是选择文件按钮旁边没有出现来自db的图像名称,表示没有选择文件。

请注意,我是Yii的新手,我坚持这一点。

1 个答案:

答案 0 :(得分:2)

问题出在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;
}

添加其他代码