为什么我不能在Yii中更新这个模型?

时间:2014-12-08 20:53:09

标签: php validation yii model

我正在使用Yii框架,我想通过单击调用控制器中的操作的链接来更新模型,此操作用于修改模型的某些属性,然后如果修改完成,则应该重定向到另一个动作。我的问题是模型更新没有保存,我不知道为什么,这是我的代码:

查看代码:

<table class="table table-striped">
    <thead>
        <tr>
            <th>#</th>
            <th>title</th>
            <th>category</th>
            <th>published</th>
            <th>priority</th>
            <th>in news banner</th>
            <th>publish</th>
        </tr>
    </thead>
    <tbody>
<?php
$x=0;
if(!empty($model)){

    foreach ($model as $m){
        $x++;
        echo "<tr>
            <td>$x</td>
            <td>$m->title</td>
                <td>$m->category</td>
                    <td>$m->display</td>
                        <td>$m->priority</td>
                            <td>$m->newsBanner</td>
                        <td><a href='".Yii::app()->createUrl('articles/approve', array('id'=>$m->id, 'c'=>$c))."'><button id='btn$m->id'>Publish</button></a></td>
                </tr>"; 
    }
}
?>
    </tbody></table>

行动代码:

public function actionApprove($id, $c)
    {

        $artilce = $this->loadModel($id);

        if(!empty($artilce)){

            $article->category = 'anything';
            $article->validate();
            print_r($artilce->getErrors());
            if($artilce->save())

                $this->redirect(array('pending', 'c'=>$c));
        }
    }

模型规则代码:

public function rules()
    {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('text, category, display, newsBanner, priority, title, visits, previewText, idUser, homepage', 'required'),
            array('idUser, homepage', 'numerical', 'integerOnly'=>true),
            array('visits', 'numerical'),
            array('category, priority', 'length', 'max'=>50),
            array('display, newsBanner', 'length', 'max'=>3),
            array('date', 'safe'),
            array('image', 'file', 'types'=>'jpg, jpeg, JPG, png, PNG, gif, GIF', 'allowEmpty'=>true, 'on'=>'update'),
            // The following rule is used by search().
            // @todo Please remove those attributes that should not be searched.
            array('id, text, category, display, newsBanner, priority, date, title, visits, previewText, image, caption, idUser, homepage', 'safe', 'on'=>'search'),
        );
    }

我从getErrors()获得了空数组,那么问题是什么?

1 个答案:

答案 0 :(得分:2)

validate()方法在调用后清除错误(作为默认行为)。如果你看一下官方文件,你会看到:

public boolean validate(array $attributes=NULL, boolean $clearErrors=true)
  

$ attributes :应验证的属性列表。默认为null,表示应验证适用的验证规则中列出的任何属性。如果此参数作为属性列表给出,则仅验证列出的属性。

     

$ clearErrors :是否在执行验证之前调用clearErrors

默认情况下,

$clearErrors设置为TRUE。因此,在调用getErrors()方法后,validation()方法中不会出现错误。

尝试:

if($article->validate()){
    //then save 
}

或:

$article->validate(NULL,FALSE);
//check errors