0

私は最近 Yii を使い始めましたが、非常に感銘を受けました。ただし、CGridView の Ajax URL の作成方法に関して、奇妙な問題に直面しています。私が試みているのは、初めて検索してから、ページネーションのリンクをクリックして検索結果のいくつかのページを先に進めてから、もう一度検索することです。ただし、グリッドが次の形式でリクエストを送信するのは 2 回目です。

http://127.0.0.1/myapp/backend/customers/index/XDEBUG_SESSION_START/1/Accounts%5BaccountID%5D//Accounts%5Bname%5D//Accounts%5Baddress%5D/address+1/Accounts%5Bbirthday%5D//Accounts%5BclientType%5D//Accounts%5Bemail%5D//Accounts%5Bbalance%5D//Accounts%5BhasAccess%5D//Accounts_page/3/ajax/yw1?ajax=yw1&Accounts%5BaccountID%5D=&Accounts%5Bname%5D=&Accounts%5Baddress%5D=&Accounts%5Bbirthday%5D=&Accounts%5BclientType%5D=&Accounts%5Bemail%5D=&Accounts%5Bbalance%5D=&Accounts%5BhasAccess%5D=&Accounts_page=1

この URL の半分が書き換えられていることがわかります (これは、ページネーション リンクをレンダリングするときに CPagination によって作成されます)。ただし、Yii の gridview js は新しいクエリをページネーション リンクに追加するため、URL 内の変数が以前の値と新しい値の両方で重複することになります。この結果、コード実行が CUrlManager.php の 411 行目に到達すると、

$_REQUEST[$name]=$_GET[$name]=$value;

$_GET 変数の値が失われます ($value には、URL の書き換えられた部分に含まれる URL の古い値が含まれます (SEO フレンドリー))。そして、私は再び以前の検索結果に行き着きます。

私が使っているルール

 'urlManager' => array(
            'urlFormat' => 'path',
            'rules' => array(
                '<module:\w+>/<controller:\w+>/<action:\w+>"=>"<module>/<controller>/<action>',
                '<controller:\w+>/<id:\d+>' => '<controller>/view',
                '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            ),
            'showScriptName' => false,
            'caseSensitive' => true,
        ),

モデルの検索機能

  */
    public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria = new CDbCriteria;

        $criteria->compare('accountID', $this->accountID, true);
        $criteria->compare('name', $this->name, true);
        $criteria->compare('balance', $this->balance, true);
        $criteria->compare('address', $this->address, true);
        $criteria->compare('birthday', $this->birthday, true);
        $criteria->compare('clientType', $this->clientType, true);
        $criteria->compare('email', $this->email, true);
        $criteria->compare('createAt', $this->createAt, true);
        $criteria->compare('hasAccess', $this->hasAccess);

        return new CActiveDataProvider($this, array(
                    'criteria' => $criteria,
                ));
    }

モデルの動作

    public function behaviors() {
    return array('CAdvancedArBehavior' => array(
            'class' => 'application.extensions.CAdvancedArBehavior'));
}

actionIndex コード

    public function actionIndex()
    {
        if (isset($_POST['attribute']))
        {

            $attribute =$_POST['attribute'];
            $attribute = @explode('_',$attribute);

                $row = Accounts::model()->findByPk($attribute[1]);
                if($row != null )
                {

                                $row->save();

                }




        $dataProvider= new Accounts('search');
                $dataProvider->unsetAttributes();  // clear any default values
        if(isset($_GET['Accounts']))
            $dataProvider->attributes=$_GET['Accounts'];

            $this->render('index', array('model' => $dataProvider));
    }

 } 

私のビューファイル:

$this->widget('zii.widgets.grid.CGridView', array(
       'dataProvider' => $model->search(),
        'filter' => $model,
        'columns' => array(
            array (
                'name' => 'accountID',
                'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')
            ),
            array(
                'name' => 'name',
                'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')

            ),
            array(
                'name' => 'address',
                'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')

            ),

            array(            // display 'create_time' using an expression
            'name'=>'birthday',
            'value'=>'date("M j, Y", strtotime($data->birthday))',
            'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')
            ),

             array(
                'name' => 'clientType',
                'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')

            ),

            array(
                'name' => 'email',
                'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')

            ),
            array(
                'name' => 'balance',
                'type' => 'raw',
                'header' => 'Balance',
                'value' =>'($this->grid->owner->widget("application.extensions.jeditable.DsJEditableWidget", array(
                 "model" => $this->grid->dataProvider,
                 "name" => "balance_".$data->accountID,
                 "value" => $data->balance,
                 "jeditable_type" => "text",
                ),true))',
            ),

            array(            // 
                'class' => 'JToggleColumn',
                'name' => 'hasAccess',
                'filter' => array(1=>'Yes', 0=>'No'),
                'checkedButtonImageUrl'=> Yii::App()->baseUrl.'/images/checked.png', // checked image
                'uncheckedButtonImageUrl'=> Yii::App()->baseUrl.'/images/unchecked.png', // unchecked image
                'checkedButtonLabel'=>'Yes', // tooltip
                'uncheckedButtonLabel'=>'No', // tooltip
                'htmlOptions'=>array('style'=>'text-align:center;min-width:60px;')
            ),
        )

    )

使いたくない

'ajaxUrl' => $this->createUrl('index')

リクエストURLにクエリデータがないため、jtogglecolumnを使用しようとすると検索とページネーションがリセットされるためです。

4

1 に答える 1

1

私は同じ問題に遭遇し、いろいろ遊んだ後、Nginx の設定が間違っていることがわかりました。これが誰かを助けることを願っています

Nginx.conf

location / {

        index  index.php index.html;
        try_files $uri $uri/ /index.php?$args;
        #try_files $uri $uri/ /index.php$uri;    #Use the default config as above

    }
于 2013-03-21T08:40:55.893 に答える