0

これは簡単な回避策を備えた一般的な問題であると私は信じています (願っています) ので、これは非常に抽象的なものにしておきます。次のように、gii によって生成された管理ページを変更しました。検索フォームは、特定のユーザーに関連するレコードを選択するように変更されています。これは機能し、グリッドを検索すると正常に更新されます。

グリッドの出力をカスタマイズして、ユーザー データを反映する各レコードなど、さまざまなユーザー関連データを含めました。

グリッド フィルター (ウィジェットの上部) を使用すると、フィルターの結果は良好ですが、ユーザーの元のフィルターが失われます。

したがって、ユーザーにクエリを実行すると、いくつかの結果が選択され、これらの結果を他の基準でフィルター処理する場合は、ユーザーがフィルター処理した結果ではなく、データセット全体から生成された結果が生成されます。

補足として、 http://www.yiiframework.com/extension/remember-filters-gridview/をインストールしてみました

上記で指定したようにフィルタリングすると機能しないため、実際にはいくつかの結果が生成されますが、ページを更新すると、前のセッションから両方のフィルターが保存されているため、結果はまったく同じです。

これが明確であることを願っています、そして助けてください!ありがとうございました

4

2 に答える 2

1

コードは常に役に立ちますが、私が正しく理解していれば、ユーザー メッセージを表示するために同様のことを行います。ログインしたユーザーに送信されたメッセージのみを検索するように初期フィルターを設定し、次にユーザーが件名と送信者でメッセージをフィルター処理できるようにする必要もあります。モデルや基準の名前がわからないので、簡単な例を次に示します。

コントローラ:

public function actionIndex()
{
    $model = new Message('search');
    $model->unsetAttributes();

    if(isset($_GET['Message']))
        $model->attributes = $_GET['Message'];

    // Set default filter
    $model->msg_to = Yii::app()->user->id;

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

意見:

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=> 'message-grid',
    'dataProvider'=> $model->search(),
    'filter'=> $model,
));

モデル:

public function search()
{
    $criteria = new CDbCriteria;

    $criteria->compare('from',$this->from);
    $criteria->compare('msg_to',$this->msg_to);
    $criteria->compare('from_name',$this->from_name,true);
    $criteria->compare('subject',$this->subject,true);
    $criteria->compare('body',$this->body,true);
    $criteria->compare('read',$this->read);

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

デフォルト フィルターの条件が非常に複雑な場合、次のようにモデルに名前付きスコープを作成するのが最善の方法です。

public function scopes()
{
    return array(
        'inbox' => array(
            'condition' => 't.msg_to = :user_id',
            'params' => array(':user_id' => Yii::app()->user->id),
            'order' => 'min(t.read) ASC, t.posted_on DESC',
        ),
    );

}

そのスコープを使用する$model->inbox()->search()には、代わりに CGridView に書き込み、次の行$model->search() も削除する必要があります$model->msg_to = Yii::app()->user->id;

最後に 1 つ: $_GET 変数などを使用して条件にユーザーからの入力が必要な場合は、「パラメーター化された名前付きスコープ」を使用できます。このページのセクションを参照してください: http://www.yiiframework.com/doc/guide/1.1/en/database.ar#named-scopes同じ方法でそれらを使用します:$model->inbox()->search()

于 2013-02-05T10:46:41.190 に答える
0

答えは、コードの条件によって異なる場合があります。

1 ) user_id の形式は GET または POST ですか? POST の場合、.CGridView は GET 用であるため、GET に変更する必要があります。

2) 私たちは 2 つの別々のフォームで作業しているため、それぞれのケースで操作の実行に必要な引数を受け取るかどうか、コードを検証する必要があることに注意してください。そうでない場合は、URL、セッション、または Cookie を次のように変更する必要があります。必要なすべてのデータを常に受信します。

3) CgridView は現在の URL にフィルターを追加し、AJAX に送信します。user_id を選択するためのフォームは通常の HTTP GET (AJAX 用ではない) であり、ユーザー ID を取得するためのフォーム フィールドの名前は user_id であると思います。

a) フィルター フィールドの名前は CGridView "model_name['attribute_name']" で、コントローラーでは次のようになります。

public function actionAdmin($user_id="") {
    ...
    if (!empty($user_id)) $model->user_id = intval($user_id);
    if (isset($_GET['model_name'] ) $model->attributes = $_GET['model_name'];
    ...
}

b) フォームのユーザー ID が CGridWiew 列としても使用できる場合:

public function actionAdmin($user_id="") {
   ...
   if (isset($_GET['model_name'] ) {
       if (! isset($_GET['model_name']['user_id']) && ! empty($user_id) ) {
          $_GET['model_name']['user_id'] = $user_id;
       }          
        $model->attributes = $_GET['model_name'];
   } elseif (!empty($user_id)) $model->user_id = intval($user_id);
   ... 
}

c) あなたの actionAdmin は actionAdmin() のようなもので、ユーザー ID を取得する必要があります

yii::app()->request->getParam('user_id');
于 2013-02-06T12:02:14.590 に答える