1

長いテキストで申し訳ありませんが、私の問題は長いです:-)私はこのようなグリッドを作りました

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        array(
            'name'=>'title',
            'type'=>'raw',
            'value'=>'CHtml::link(CHtml::encode($data->title), $data->url)'
        ),
        array(
            'name'=>'create_time',
            'type'=>'raw',
            'value' => 'Yii::app()->dateFormatter->format("yyyy", $data->create_time)',
        ),
    ),
));

そして、タイトルのフィルタリングのように、テキストフィールドで日付でフィルタリングしたい。コードでコントローラを作成しました

$model=new Post('search');

if(isset($_GET['Post']))
    $model->attributes=$_GET['Post'];
    $this->render('admin',array(
        'model'=>$model,
            ));

モデルの検索方法

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

        $criteria->compare('title',$this->title,$partialMatch=true);

        $criteria->compare('create_time',$this->create_time,$partialMatch=true);

        return new CActiveDataProvider('Post', array(
            'criteria'=>$criteria,
            'sort'=>array(
                'defaultOrder'=>'status, update_time DESC',
            ),
        ));
    }

ルールを忘れない()

array('title, create_time', 'safe', 'on'=>'search')

今日の日付で 2 つのレコードがあります。タイトル フィルタリングは正常に機能しますが、「create_time」列のフィルター テキスト フィールドに「2015」と入力して Enter キーを押すと、「結果が見つかりません」というメッセージが表示されます。

私はこれを試しました:

array(
        'name'=>'create_time',
        'type'=>'raw',
        'value' => 'Yii::app()->dateFormatter->format("dd MMMM yyyy", $data->create_time)',
        'filter' => CHtml::listData(Post::model()->findAll(array('order'=>'create_time')), 'create_time', 'create_time'),
        ),

それはうまくいくようですが、私のデータベースでは create_time はinteger(11) (必須) であり、listdata の値は日付ではなく数値であり、年だけでなく完全な日付を表します。私は、create_time レコードの値から一意の年の値を持つ配列を作成しました。$rok['2015'] => '2015' のような配列を出力します

$model_post = new Post;
$wyniki = $model_post::model() -> findAllBySql('SELECT create_time FROM tbl_post');
for($i=0;$i<count($wyniki);$i++)
{
    $rok_temp[$i] = Yii::app()->dateFormatter->format("yyyy", $wyniki[$i]->create_time);
    $rok[$rok_temp[$i]] = $rok_temp[$i];
}
$rok = array_unique($rok);

$rok を送信して表示し、

array(
            'name'=>'create_time',
            'type'=>'raw',
            'value' => 'Yii::app()->dateFormatter->format("dd MMMM yyyy", $data->create_time)',
            'filter' => $rok,
            ),

$criteria->compare('create_time',Yii::app()->dateFormatter->format("yyyy", $this->create_time));

しかし、フィルタリングすると「結果が見つかりません」と表示されます。私は何を間違えたのですか?

4

1 に答える 1

1

時刻は UNIX タイムスタンプとして保存されます。したがって、フィルターからの入力を UNIX にも変更するには、何らかの変換を行う必要があります。まず、モデルで年を保持する変数を作成します

class MyModel extends ... {
    public $create_year;
}

次に、この変数をルールに追加します。

array('create_year', 'safe', 'on' => 'search')
array('create_year', 'numerical', 'integerOnly' => true)

次に、その年の変換ルールをsearch()ieに追加します

public function search() {
    ...
    if ($this->create_year) {
        $criteria->addBetweenCondition('create_time',
            strtotime($this->create_year.'-01-01 00:00:00'),
            strtotime($this->create_year.'-12-31 23:59:59')
        );
    }
    ...
}

最後に、フィルターをドロップダウンに変更して、無効なエントリを減らします。

'filter' => CHtml::activeDropDownList(
    $model, 
    'create_year',
    array_combine(range(1900, 2099), range(1900, 2099),
    array('prompt' => 'Any year')
)
于 2015-05-04T09:50:21.437 に答える