私は最近 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を使用しようとすると検索とページネーションがリセットされるためです。