0

Yiiと一緒にプロジェクトに取り組んでいます。現在、バックエンドに取り組んでいます。モデルをロードし、その特定のモデルのデータベースの値(0から1に変更されるtinyint)を変更し、別のURLにリダイレクトする関数をコントローラーに実装しています。この関数は、CRUDジェネレーターによって生成された「削除」関数と同じように使用したいと思います。だから、「削除」機能に刺激を受けて、私は「受け入れる」機能のためにこれを試しています:

    public function actionAccept($id) {
    if(Yii::app()->request->isPostRequest)
    {
        $model = $this->loadModel($id);
        $model->testimonial_accepted = '1';
        $model->save();

        // if AJAX request we should not redirect the browser
        if(!isset($_GET['ajax']))
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
    }
    else
        throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');
    }

次のように、ビューで「accept」関数を呼び出しています。

     array('label'=>'Accept Client', 'url'=>'#', 'linkOptions'=>array('submit'=>array('accept','id'=>$model->id),'confirm'=>'Are you sure you want to accept this item?')),

実行時にエラーは発生しません。適切なモデルをロードしますが、データベース(testimonial_accepted)の値は変更されません。理由はわかりますか?私は何が間違っているのですか?

前もって感謝します、

Supialios。

4

2 に答える 2

0

まず、これが機能するかどうかを確認します。

$model->save( false );

それが機能する場合、これは、検証が失敗したためにモデルのデータが保存されないことを意味します(たとえば、モデルのルールを確認し、最終的に新しいシナリオを定義します)。

この場合、 saveメソッドの代わりにupdateを使用する方が適切だと思います。

$model->setAttribute( 'testimonial_accepted', 1 );
$model->update( array( 'testimonial_accepted' ) );
于 2012-08-06T12:11:08.623 に答える
0

リンクでは、パスは次の形式である必要があり<controller>/<action>ます。たとえば、コントローラー名が次のようになっているとしますfoo

array('submit'=>array('foo/accept','id'=>$model->id)

@Borisに同意します。更新を使用する必要があります。さらに、データ操作コードは、MVCのベストプラクティスに従うためにモデルに含める方がよいため、次のようになります。

コントローラ:

        $model = $this->loadModel($id);
        $model->acceptTestimonial(); // a model function
        $this->redirect(array('action_you_choose'));

モデル:

public function acceptTestimonial()
{
    $this->testimonial_accepted = '1';
    $this->update(array('testimonial_accepted'));
}
于 2012-08-06T12:42:02.693 に答える