บทเรียนรู้นี้เรามาแปลง 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

 

ความคิดเห็น

หากบทเรียนรู้มีความผิดพลาดประการใด หรือมีข้อเสนอแนะกรุณาแจ้ง contact@programmerthailand.com