บทเรียนรู้นี้เรามาแปลง timestamp เป็น Y-m-d H:i:s หรือ format อื่นๆ ได้ตามต้องการ ปัญหาคือ ใน database เราเก็บข้อมูลแบบ timestamp ซึ่งเมื่อเรานำมาแสดงผลใน DatePicker จะไม่สามารถนำมาแสดงผลได้ถูกต้อง ดังนั้นเราจะต้องแปลงกลับไปกลับมาด้วย beforeSave() เมื่อเพิ่ม/แก้ไขข้อมูล และ afterFind() เมื่อ เลือกข้อมูลมาแสดงผล
ตัวอย่าง
เรามี field published_at เก็บข้อมูล timestamp เช่น 1532925948 แต่เราต้องการให้แสดงผลแบบ Y-m-d H:i:s เพื่อให้สามารถแสดงผลใน datetime picker ได้ เราจะทำการแก้ไข Model เพื่อเพิ่ม method beforeSave() และ afterFind() ลักษณะดังนี้
public function beforeSave($insert)
{
$name = 'published_at';
$attribute = $this->getAttribute($name);
if(!empty($attribute)){
$dateTimeObject = DateTime::createFromFormat('Y-m-d H:i:s', $attribute);
$timestamp = $dateTimeObject->getTimeStamp();
$this->setAttribute($name, $timestamp);
}
return parent::beforeSave($insert); // TODO: Change the autogenerated stub
}
public function afterFind()
{
$name = 'published_at';
$attribute = $this->getAttribute($name);
if(!empty($attribute)){
$getDate = new DateTime();
$getDate->setTimestamp($attribute);
$date = $getDate->format('Y-m-d H:i:s');
$this->setAttribute($name, $date);
}
parent::afterFind(); // TODO: Change the autogenerated stub
}
และใน _form.php เราจะทำการใส่ widget dateTimePicker() เพื่อให้สามารถเลือกวันเวลาได้
<?= $form->field($model, 'published_at')->widget(DateTimePicker::className(), [
'language' => Yii::$app->language,
'size' => 'ms',
'template' => '{input}',
'pickButtonIcon' => 'glyphicon glyphicon-time',
'inline' => false,
'clientOptions' => [
'startView' => 1,
'minView' => 0,
'maxView' => 1,
'autoclose' => true,
//'linkFormat' => 'HH:ii P', // if inline = true
'format' => 'yyyy-mm-dd HH:ii:ss', // if inline = false
'todayBtn' => true
]
]) ?>
หมายเหตุ datetimepicker สามารถติดตั้งได้จาก https://github.com/2amigos/yii2-date-time-picker-widget
ความคิดเห็น