Canvas js Как собрать данные sh из базы данных на график в Yii2 - PullRequest
0 голосов
/ 18 апреля 2020

Я работаю над yii2. Я установил библиотеку canvas js, попытался запустить пример примера диаграммы. Теперь я хочу получить sh данные из моей базы данных. Я могу просматривать отдельные данные из моей БД, но я хочу поместить все данные при обновлении базы данных, т.е. у меня есть кнопка, и по этой кнопке моя таблица обновляется в течение этого периода. Я хочу обновить свою диаграмму, чтобы показать обновленное значение (я).

Примечание: Диаграмма должна отображать тренд

Ниже приведен код моего контроллера, из которого я вставляю данные в свою таблицу

public function actionData()
{
    try {
        $cust_met_data = Yii::$app->db->createCommand(
            "SELECT m.`meter_id` , m.`msn` , 
                  m.`cust_id` , m.`device_id` FROM `mdc_meter_cust_rel` m ")->queryAll();
    } catch (Exception $e) {
    }

    $slave_id = $cust_met_data[0]['device_id'];
    $address = 0;
    $count = 14;
    $msn = $cust_met_data[0]['msn'];
    $cust_id = $cust_met_data[0]['cust_id'];

    // my base URL
    $api_url = 'https://localhost:44337/api/rtu/GetData/' . $slave_id . '/' . $address . '/' . $count;


    $curl = curl_init($api_url);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    $curl_response = curl_exec($curl);

    $json = json_decode($curl_response);

    if($json->{0} == '06')
    {
        Yii::$app->getSession()->setFlash('error', '
 <div class="alert alert-error alert-dismissable">
 <button aria-hidden="true" data-dismiss="alert" class="close" type="button">×</button>
 <strong>No Communication! </strong> Meter Data is Unavailable.</div>');

        return $this->redirect(['index']);
    }
    else
    {
        $vol_1 = $json->{0};
        $vol_2 = $json->{1};
        $vol_3 = $json->{2};
        $curr_1 = $json->{3};
        $curr_2 = $json->{4};
        $curr_3 = $json->{5};
        $kwh = $json->{6};

        $model = new MdcmetersData();
        $model->load(Yii::$app->request->post());
        $model->data_date_time = date('Y-m-d H:i:s');
        $model->device_id = $slave_id;
        $model->msn = $msn;
        $model->cust_id = $cust_id;
        $model->voltage_p1 = $vol_1;
        $model->voltage_p2 = $vol_2;
        $model->voltage_p3 = $vol_3;
        $model->current_p1 = $curr_1;
        $model->current_p2 = $curr_2;
        $model->current_p3 = $curr_3;
        $model->kwh = $kwh;

        if($model->save())
        {
            return $this->redirect(['index', 'model' => $model]);
        }
        else
        {
            return $this->redirect(['index']);

        }

    }




}

Индекс. php

<script type="text/javascript" src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
<?PHP
  $model = $dataProvider->getModels()[0];
  $model['data_date_time'];

  $dataPoints1 = array(
  array("label"=> $model['data_date_time'], "y"=> $model['kwh']),

  );

 ?>
<div id="chartContainer1" style="width: 100%; height: 300px;display: inline-block;"></div>
<p>
    <?= Html::a('Get Meter Data', ['data'], ['class' => 'btn btn-success']) ?>
</p>



<script>
window.onload = function () {
 var chart = new CanvasJS.Chart("chartContainer1", {
    animationEnabled: true,
    theme: "light2",
    title:{
        text: "kWh of Meter"
    },
    legend:{
        cursor: "pointer",
        verticalAlign: "center",
        horizontalAlign: "right",
        itemclick: toggleDataSeries
    },
    data: [{
        type: "column",
        name: "kwh",
        indexLabel: "{y}",

        showInLegend: true,
        dataPoints: <?php echo json_encode($dataPoints1, JSON_NUMERIC_CHECK); ?>
    }
    ]
});
chart.render();

function toggleDataSeries(e){
    e.dataSeries.visible = !(typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible);
    chart.render();
}
};

Выходной сигнал диаграммы

enter image description here

Показано только одно значение, но на самом деле у меня есть несколько значений.

Я искал решение, но все, что я нашел, - это традиционный способ получения данных sh. то есть в PHP я должен выполнить запрос, а затем выполнить действие над ним. Пример показан здесь PHP Данные диаграммы из базы данных

Как я могу это сделать? Любая помощь будет высоко ценится

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Вы просите только первую запись. Вам нужно будет получить их все.

Самое простое решение:

<?PHP
  // final data array
  $dataPoints1 = [];
  // loop through dataprovider for every $model
  forech(dataProvider->getModels() as $index => $model) {
    // data gets added to specific keys 
    $array['label'] = $model['data_date_time'];
    $array['y'] = $model['kwh'];
    // for every $model a sub array gets added
    $dataPoints1[$index] = $array;
  }
 ?>

Но это не красиво.

1 голос
/ 18 апреля 2020

Поскольку вы получаете первую запись для заполнения из $dataProvider

$model = $dataProvider->getModels()[0];

, это должно быть

$model = $dataProvider->getModels();

Помимо этого, я бы упростил задачу и вытащил данные сделав в модели отдельную функцию stati c, вызовите ее из контроллера и передайте данные в представление для отображения диаграмм.

...