FlashMessage เป็นตัวแจ้งสถานะต่างๆ ตามที่ต้องการ เช่น แจ้งบันทึกข้อมูลหรือแก้ไขข้อมูล โดยหลักการก็ใช้ข้อมูลเก็บไว้ใน session การทำงานจะแบ่งเป็น 2 ส่วนคือ กำหนดค่า
,แสดงผล
กำหนดค่า
เราสามารถกำหนดค่าในส่วนที่ต้องการได้ เช่น เมื่อมีการบันทึกข้อมูลเสร็จเราต้องการแจ้งเตือนไปยังผู้ใช้ว่า "บันทึกข้อมูลเสร็จเรียบร้อย" ก็ทำการกำหนดค่าลงไปดังนี้
<?php
Yii::$app->getSession()->setFlash('alert',[
'body'=>'ลงทะเบียนงานวิจัยเสร็จเรียบร้อย! เจ้าหน้าที่จะติดต่อกลับไปเร็วที่สุด..',
'options'=>['class'=>'alert-success']
]);
?>
หากต้องการแจ้งเตือนแบบต่างๆ สามารถกำหนดได้ ดังนี้
alert-success
,alert-info
,alert-warning
,alert-danger
ตัวอย่างการใช้งานกับ actionCreate
<?php
public function actionCreate()
{
$model = new Research();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('alert',[
'body'=>'ลงทะเบียนงานวิจัยเสร็จเรียบร้อย! เจ้าหน้าที่จะติดต่อกลับไปเร็วที่สุด..',
'options'=>['class'=>'alert-success']
]);
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
?>
การแสดงผล
เราจะใช้ \yii\bootstrap\Alert
เป็น widget ของ Bootstrap ซึ่งมีมากับ yii2 อยู่แล้ว เราสามารถนำโค้ดนี้ไปไว้ที่ใหนก็ได้ที่เราต้องการแสดงผลของ alert ขึ้นมา
<?php
use yii\helpers\ArrayHelper;
?>
<?php if(Yii::$app->session->hasFlash('alert')):?>
<?= \yii\bootstrap\Alert::widget([
'body'=>ArrayHelper::getValue(Yii::$app->session->getFlash('alert'), 'body'),
'options'=>ArrayHelper::getValue(Yii::$app->session->getFlash('alert'), 'options'),
])?>
<?php endif; ?>
แสดงผลทีละหลายๆ ค่า
ในการกำหนดค่าเราสามารถกำหนดกี่ตัวก็ได้ แต่อย่าให้ key ซ้ำกัน ตามตัวอย่างผมตั้ง alert1,alert2
<?php
Yii::$app->getSession()->setFlash('alert1',[
'body'=>'ลงทะเบียนงานวิจัยเสร็จเรียบร้อย! เจ้าหน้าที่จะติดต่อกลับไปเร็วที่สุด..',
'options'=>['class'=>'alert-success']
]);
Yii::$app->getSession()->setFlash('alert2',[
'body'=>'ลงทะเบียนงานวิจัยเสร็จเรียบร้อย! เจ้าหน้าที่จะติดต่อกลับไปเร็วที่สุด..',
'options'=>['class'=>'alert-info']
]);
?>
ส่วนแสดงผล
ส่วนนี้มันจะมี funciton getAllFlashes()
เพื่อดึงข้อมูล flashMessage ทั้งหมด จากนั้นเราก็ทำการวนลูปโดยใช้ foreach เพื่อมาแสดงผล
<?php foreach (Yii::$app->session->getAllFlashes() as $message):; ?>
<?= \yii\bootstrap\Alert::widget([
'body'=>ArrayHelper::getValue($message, 'body'),
'options'=>ArrayHelper::getValue($message, 'options'),
])?>
<?php endforeach; ?>