1

私はYiiを初めて使用しますが、これを理解するのに苦労しています。ユーザーが選択したオプションに応じて、ページに複数のCGridViewを表示したいのですが、各グリッドビューにはそのオプションのレコードのみが表示されます。この場合、オプションは、オープン、クローズ、進行中などのジョブステータスです。

配列をループして複数のグリッドビューを表示するように機能するコードがいくつかありますが、それらをフィルタリングする方法がわかりません。

$test = array(1,2,3,4,5);

foreach ($test as $value) {

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid',
    'dataProvider'=>$model->search(),   
    'columns'=>array(
        'ID',
        'CustomerCompany',
        'FirstName',
        'LastName',
        /* etc */
    ),
));

}

配列の値から各グリッドビューをフィルタリングする方法についてのアイデアはありますか?

ありがとう!

アップデート

わかりました、私は自分がやろうとしていたことをどのように行うかを理解しました。私はこのようにコントローラーでそれを処理しています:

public function actionBoard()
{
    $models = array();

    $statuses = JobStatus::model()->findAll();
    foreach ($statuses as $status)
    {
    $model=new Job('search');
    $model->unsetAttributes();  // clear any default values

    if(isset($_GET['Job']))
        $model->attributes=$_GET['Job'];
        $model->Status = $status->ID;
        $models[$status->Status] = $model;
    }

    $this->render('board',array('models'=>$models));
}

したがって、すべてのステータスを見つけ、IDフィールドを使用して検索を実行し、結果を配列に入れて、ビューに渡します。ビューでは次のように処理します。

foreach ($models as $status)
{

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid',
    'dataProvider'=>$status->search(),
    'columns'=>array(
        'ID',
        'CustomerCompany',
        'FirstName',
        'LastName',
        'Phone1',
        'Phone2',
        /* etc */
    ),
));

基本的に、「ステータス」の配列内の「ステータス」ごとにグリッドビューを作成します。動作しているようですが、私が慣れている古いASP.NETデータバインディング方法ではなく、MVC用語で考えるのに少し時間がかかりました。

4

3 に答える 3

2

さまざまなCGridViewを要求したので、ここにあります。

モデルに移動します。

次に、いくつかの新しいsearch()メソッドを作成する必要があります。

各メソッド内で、次の2つのメソッドのように、必要な値を指定します。

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

        $criteria = new CDbCriteria;

        $criteria->compare('id', $this->id);
        $criteria->compare('email', $this->email, true);
        $criteria->compare('password', $this->password);
        $criteria->compare('created', $this->created);
        $criteria->compare('lastmodified', $this->lastmodified);
        $criteria->compare('confirmed', $this->confirmed);
        $criteria->compare('is_human', 1);// this is a human

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

    public function searchB() {

        $criteria = new CDbCriteria;

        $criteria->compare('id', $this->id);
        $criteria->compare('email', $this->email, true);
        $criteria->compare('password', $this->password);
        $criteria->compare('created', $this->created);
        $criteria->compare('lastmodified', $this->lastmodified);
        $criteria->compare('confirmed', $this->confirmed);
        $criteria->compare('is_human', 0);//this is not a human, maybe a donkey ... who knows
        $criteria->compare('username', $this->username, true);

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

検索方法がわかったので、各cgridviewに必要な検索方法を使用します

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid',
    'dataProvider'=>$model->searchA(),   
    'columns'=>array(
        'ID',
        'CustomerCompany',
        'FirstName',
        'LastName',
        /* etc */
    ),
));

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'job-grid2',
    'dataProvider'=>$model->searchB(),   
    'columns'=>array(
        'ID',
        'CustomerCompany',
        'FirstName',
        'LastName',
        /* etc */
    ),
));

単純

ps:トリックとして、次のような定数を使用することをお勧めします。

const CONSTA = 1;
const CONSTB = 2;

次に、モデルで次のように使用します。

self::CONSTA

またはモデルの外:

ModelName::CONSTA

constを使用すると、値が時間の経過とともに変化した場合でも、コード全体を変更する必要はなく、プロジェクト全体でそれらの値を探す必要もありません。

于 2013-03-19T21:09:17.347 に答える
2

問題のデータ部分から始める必要があります。最初に、必要な結果を返す複数のデータプロバイダーを作成してみてください。Giiを使用して一部のモデルを自動生成した場合は、そこでメソッドを調べて、search()さまざまなクエリ条件でそのようなプロバイダーを作成する方法の例を確認できます。このコードをモデルのどこかに保持するようにしてください。たとえばsearchByStatus($status)、指定されたステータスのデータプロバイダーを返すメソッドを作成できます。

次に、コントローラーで、このメソッドから複数のデータプロバイダーをフェッチし、必要なステータスごとに1つずつ取得し、それらをビューに送信して、最後に異なるCGridViewにフィードできます。

于 2013-03-19T20:56:04.020 に答える
0

これは、同じビューの動的グリッドビューのwikiです。

于 2013-05-01T20:50:34.633 に答える