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 回答