5

YiiでCGridViewを作成しました。その行は、XMLファイルから読み取られます。モデルは使用していません。コントローラー(ファイルを読み取る場所)とビュー(グリッドを表示する場所)のみを使用しています。作成できないのは、グリッドの最初の行にあるフィルター(列ごとに1つの入力フィールド)で、特定の行のみを視覚化するためのものです。どうすればいいですか?

これは私が今まで持っているものです:

コントローラ:

<?php
class TestingController extends Controller {
    public function actionIndex() {
        $pathToTmpFiles = 'public/tmp';
        $xmlResultsFile = simplexml_load_file($pathToTmpFiles.'/test.xml');
        $resultData = array();
            foreach ($xmlResultsFile->result as $entry) {
                $chromosome = $entry->chromosome;
                $start = $entry->start;
                $end = $entry->end;
                $strand = $entry->strand;
                $crosslinkScore = $entry->crosslinkScore;
                $rank = $entry->rank;
                $classification = $entry->classification;
                $mutation = $entry->mutation;
                $copies = $entry->copies;
                array_push($resultData, array('Chromosome'=>$chromosome, \
                    'Start'=>$start,  'End'=>$end, Strand'=>$strand, \
                    'Crosslink_Score'=>$crosslinkScore,'Rank'=>$rank, \
                    'Classification'=>$classification, 'Mutation'=>$mutation, \
                    'Copies'=>$copies));
        }
        $this->render('index', array('resultData' => $resultData));
    }
}
?>

意見:

<?php
$dataProvider = new CArrayDataProvider($resultData, \
    array('pagination'=>array('pageSize'=>10,),));

$this->widget('zii.widgets.grid.CGridView', array( 'id' => 'mutationResultsGrid',
    'dataProvider' => $dataProvider, 'columns' => array(
        array(
           'name' => 'Chromosome',
           'type' => 'raw',
       ),
       array(
           'name' => 'Start',
           'type' => 'raw',
       ),
       array(
           'name' => 'End',
           'type' => 'raw',
       ),
       array(
           'name' => 'Strand',
           'type' => 'raw',
       ),
       array(
           'name' => 'Crosslink_Score',
           'type' => 'raw',
       ),
       array(
           'name' => 'Rank',
           'type' => 'raw',
       ),
       array(
           'name' => 'Classification',
           'type' => 'raw',
       ),
       array(
           'name' => 'Mutation',
           'type' => 'raw',
       ),
       array(
           'name' => 'Copies',
           'type' => 'raw',
       ),
    ),
));
?>

助けてくれてありがとうエール

4

4 に答える 4

6

ファイル:(FiltersForm.php私はコンポーネントフォルダに入れました)

/**
 * Filterform to use filters in combination with CArrayDataProvider and CGridView
 */
class FiltersForm extends CFormModel
{
    public $filters = array();

    /**
     * Override magic getter for filters
     */
    public function __get($name)
    {
        if(!array_key_exists($name, $this->filters))
            $this->filters[$name] = null;
        return $this->filters[$name];
    }

    /**
     * Filter input array by key value pairs
     * @param array $data rawData
     * @return array filtered data array
     */
    public function filter(array $data)
    {
        foreach($data AS $rowIndex => $row) {
            foreach($this->filters AS $key => $value) {
                // unset if filter is set, but doesn't match
                if(array_key_exists($key, $row) AND !empty($value)) {
                    if(stripos($row[$key], $value) === false)
                        unset($data[$rowIndex]);
                }
            }
        }
        return $data;
    }
}

あなたのコントローラーで:

...
$filtersForm = new FiltersForm;
if (isset($_GET['FiltersForm'])) {
    $filtersForm->filters = $_GET['FiltersForm'];
}
$resultData = $filtersForm->filter($resultData);

$this->render('index', array(
    'resultData' => $resultData,
    'filtersForm' => $filtersForm
)}//end action

CGridView最後に必要なもの - フィルターを構成配列に追加します。

...
'dataProvider' => $dataProvider,
'enableSorting' => true,
'filter' => $filtersForm,
...
于 2012-12-18T17:06:58.783 に答える
1

xml からデータベースに情報を保存し、YII ActiveRecord を使用してみませんか?

あなたの場合、すべてのフィルタークエリで結果セットをフィルター処理するためのライブメカニズムが必要になります。YII ActiveRecord モデルを使用する場合の search() メソッドと同様です。

したがって、すべてのフィルター呼び出しで、配列のコールバックで array_filter() のようなものを使用できます。(編集: または、一致する「行」を返すためにここでストリップで使用されるメカニズム: Yii Wiki )

または、2番目のオプションとして、xmlパーサーをフィルター入力に依存させることができますが、これは私には気分が悪いです:)。パーサーはすべてのフィルター入力を解析する必要があり、これは大きな xml ファイルでは問題になる可能性があります。

または、前述のように、情報をデータベースに保存し、標準の YII メカニズムを使用します。

于 2012-12-14T09:06:06.540 に答える
0

foreachループ内のオブジェクトで取得されたデータをその特定の列のフィルターとして使用できると仮定すると、次のように、これらの値をビューに渡すことができます。

<?php
class TestingController extends Controller {
    public function actionIndex() {
        $pathToTmpFiles = 'public/tmp';
        $xmlResultsFile = simplexml_load_file($pathToTmpFiles.'/test.xml');
        $resultData = array();
        foreach ($xmlResultsFile->result as $entry) {
            ...
            $chromosomeFilter[] = $entry->chromosome;
            ...
        }
        $this->render('index', array(
            'resultData'       => $resultData,
            'chromosomeFilter' => $chromosomeFilter,
            ...
        );
    }
}
?>

次に、その列のフィルターでその値を使用します。

...
array(
    'name'   => 'Chromosome',
    'type'   => 'raw',
    'filter' => $chromosomeFilter,
),
...

私はテストしていません、そしてそれはあなたのxmlとの構造に大きく依存します$entry->chromosome、しかしそれはあなたを正しい道に導くのを助けるかもしれませんか?

于 2012-12-13T16:23:15.140 に答える