【问题标题】:Not Updating The Image Doesn't Update The Record不更新图像不会更新记录
【发布时间】:2013-12-19 05:43:05
【问题描述】:

问题是如果我想更新其他字段而不是图像。它通过了验证并且不更新任何字段。

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

查看:

<?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 的新手,并且对此感到困惑。

【问题讨论】:

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


    【解决方案1】:

    问题出在你的actionEdit 即这里

    $model->pimg=CUploadedFile::getInstance($model,'pimg');     
             $fileName=$model->pimg;
              $model->attributes=$_POST['Product'];
            if($model->save())
            $model->pimg->saveAs('images/'.$fileName);
    

    在这里您应该检查图像是否已上传。发生的情况是 yii 无法执行这一行 $model-&gt;pimg-&gt;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;
    }
    

    添加此其他代码

    【讨论】:

    • thanx :) 你绝对正确......我已经完成了......但是上面的代码需要更多的修改如果图像没有更新它不会保存现有的图像......结果null 存储在 db 中 ... if(图像存在 && 未上传){//保存代码}else {///保存上传的图像} ......就是这样
    • 他们很高兴它有帮助:)
    • 如果这个答案是您问题的解决方案,您应该这样标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2020-05-30
    相关资源
    最近更新 更多