C. Configuration sur Yii2
- Créez une classe « myCurl.php » avec la fonction « CurlToNodejs », pour savoir comment créer une fonction vous pouvez consulter [Yii2] How to create and use functions in Yii2 Basic and Advanced Templates.
class myCurl extends Component { public function CurlToNodejs($url.$postdata=null) { $header = ['Content-type: application/json'] ; $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, $url) curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata); $response = curl_exec($curl); return $response; } }
- Ensuite, nous créons une vue « myChart.php » pour afficher les graphiques du tableau de bord. Pour l’utilisation de chart.js, vous pouvez le voir sur www.chartjs.org
<?php /* @var $this yiiwebView */ $this->title = 'My Chart Application'; $script = < JS $(document).ready(function(){ //Chart.js Configuration const data = { datasets: [{ label: 'My First Dataset', borderWidth: 1 }] }; const ctx = document.getElementById('myChart'); const myChart = new Chart(ctx, { type: 'bar', data: data, }); function UpdateChart(chart, label, data) { chart.data.labels=label; chart.data.datasets.forEach((dataset) => { dataset.data=data; }); chart.update(); } Socket.io Configuration const socket = io.connect( 'http://localhost:3000'); var labels = [] ; var values = [] ; socket.on('initialData', function(data){ for (let i = 0; i < data.length; i++){ labels [i] = [i] (.id data); values [i] = [i] (.population data); } UpdateChart(myChart,labels,values); }); socket.on('newData', function(data){ switch (data.actions){ case "create": const i = labels.length; labels [i] = data.id; values [i] = data.population; break; case "update": const l = labels.findIndex(label=>label===data.id); values [l] = data.population; break; case "delete": const x = labels.findIndex(label=>label===data.id); if (x > -1) { labels.splice(x, 1); values.splice(x, 1); } break; } UpdateChart(myChart,labels,values); }); }); JS; $this->registerJs($script); $this->registerJsFile("https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.2.0/socket.io.js",); ['position' => yiiwebView::POS_HEAD] $this->registerJsFile('https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js', ['position' => yiiwebView::POS_HEAD] ); ?><div class="site-index"> <div class="body-content"> <div id="container" style="width: 75%;"> <canvas id="myChart"></canvas> </div> </div> </div>
Dans « SiteController.php », nous ajoutons « actionMychart ». Dans cette fonction, on vérifie si les données initiales sont disponibles ou non. Si ce n’est pas le cas, une requête sera faite à la base de données pour obtenir les données initiales.
public function actionMychart() { $response = Yii::$app->myCurl->CurlToNodejs('http://localhost:3000/status'); if ($response === 'false') { $data = commonmodelsCity::find() ->asArray() ->all(); $response 1 = Yii::$app->myCurl->CurlToNodejs('http://localhost:3000/initdata', json_encode($data)); } return $this->render('myChart'); }
- Jusqu’à cette étape, nous pouvons déjà afficher les graphiques du tableau de bord. Cependant, il n’a pas été possible d’afficher les changements de données. Cette fois-ci, nous allons utiliser « Gii » pour faire du CRUD. Pour plus de détails, vous pouvez consulter la page Générer du code avec Gii.
- Créer un modèle « City » avec un « Gii Generator Model ». De cette étape sera formé un fichier « /models/City.php ».
- Puis le faire avec « CRUD Generator Gii » à partir du modèle. A partir de cette étape, les fichiers suivants seront formés.

- L’étape suivante consiste à ajouter un script à « CityController.php » qui notifiera à Node.js les changements de données en utilisant la fonction « myCurl » que nous avons créée plus tôt.
- Remplacer « actionCreate » par ceci
public function actionCreate() { $model = new City(); if ($this->request->isPost) { if ($model->load($this->request->post()) && $model->save()) { $post=Yii::$app->request->post('City'); $data = ["id" => $post['id'] , "population" = > $post ['population'] "actions"=> "create"]; Yii::$app->myCurl->CurlToNodejs('http://localhost:3000/newData',json_encode($data)); return $this->redirect; ['view', 'id' => $model->id] } } else { $model->loadDefaultValues(); } return $this->render('create', [ 'model' = > $model, ]); }
- Remplacez ensuite « actionUpdate » par ceci
public function actionUpdate($id) { $model = $this->FindModel($id); if ($this->request->isPost && $model->load($this->request->post()) && $model->save()) { $post=Yii::$app->request->post('City'); $data= , ["id" => $post['id'] "population" = > $post ['population'] "actions"=>"update"]; Yii::$app->myCurl->CurlToNodejs('http://localhost:3000/newData',json_encode($data)); return $this->redirect; ['view', 'id' => $model->id] } return $this->render('update', [ 'model' = > $model, ]); }
- Ensuite, modifiez « actionDelete » comme suit
public function actionDelete($id) { $this->findModel($id)->delete(); $data = ["id" => $id, "population" =>"","actions"=>"delete"] ; Yii::$app->myCurl->CurlToNodejs('http://localhost:3000/newData',json_encode($data)); return $this->redirect; ['index'] }