0

温度データの簡単な折れ線グラフを生成しようとしています。データベース内のテーブルは次のようになります。

CREATE TABLE temperature(
      id INTEGER PRIMARY KEY NOT NULL,
      locationId INTEGER,
      value REAL NOT NULL,
      createDate DATETIME NOT NULL,
      FOREIGN KEY(locationId) REFERENCES location(id));

と列、私が興味を持っているのは:createDatevalueです。

私はEFlotを使おうとしました。これは、例として次のように、配列の配列の形式でデータを持っていることを期待しています。

            'data'=>array(
                array(1,1),
                array(2,7),
                array(3,12),
                array(4,32),
                array(5,62),
                array(6,89),
            ),

このような静的配列を使用すると、ブラウザに次のようなスクリプトデータが表示されます。

... [{'label':'line','data':[[1,1],[2,7],[3,12],[4,32],[5,62],[6,89]], ...

グラフは自然に正常に機能します。

ただし、モデルから動的にデータを定式化することはできません。私は例えば次のことを試みました:

$arr = Yii::app()->db->createCommand('SELECT id, value FROM temperature')->queryAll();
....
'data'=>$arr,

これは次のように評価されます:

... $.plot($('#yw2'), [{'label':'line','data':[{'id':'949','value':'20.812'},{'id':'950','value':'20.875'},{'id':'951','value':'21.125'},{'id':'952','value':'21.25'},{'id':'953','value':'21.312'},{'id':'954','value':'21.375'}], ....

グラフは機能しません。

最終的な目標はモデルの関数を持つことだと思うので、次のように使用できます。

...
'data'=>$model->getGraphData(),
....

しかし、そのような関数をどのように構築するのでしょうか?このグラフを機能させるには、何を返す必要がありますか?

4

1 に答える 1

0

わかりました、私はそれを整理しました。

  1. モデルに、次の関数を追加しました。

    public function getGraphData()
    {
            $criteria=new CDbCriteria;
        $criteria->addCondition('createDate > datetime(\'now\', \'-1 day\', \'localtime\')');
    
            $sort = new CSort();
            $sort->defaultOrder='createDate';
    
            return new CActiveDataProvider($this, array(
                    'criteria'=>$criteria,
                    'sort'=>$sort,
                    'pagination'=>false,
            ));
    }
    
  2. そして、ビューで

    foreach($model->getGraphData()->getData() as $row) {
                    $data[]=array($row['id'],$row['value']);
            };
    
    $this->widget('application.extensions.EFlot.EFlotGraphWidget',
        array(
            'data'=>array(
                array(
                    'label'=> 'line',
                    'data'=>$data,
                    'lines'=>array('show'=>true),
                    'points'=>array('show'=>true),
                ),
            ),
            'options'=>array(
                    'legend'=>array(
                        'position'=>'nw',
                        'show'=>true,
                        'margin'=>10,
                        'backgroundOpacity'=> 0.5
                        ),
            ),
            'htmlOptions'=>array(
                   'style'=>'width:800px;height:400px;'
            )
        )
    );
    

そしてそれは動作します:-)

于 2013-01-10T19:33:20.383 に答える