แปลง Timestamp เป็น Y-m-d H:i:s ด้วย beforeSave() และ afterFind()

wave
มานพ กองอุ่น 30 ก.ค. 2018 14:19:08 8,619

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

เขียนบทเรียนรู้ของคุณ

รายละเอียด
  • ดู 8,619
  • รักเลย 0
  • หมวดหมู่ Yii Framework 2 (Yii2)
  • เขียนเมื่อ
  • แก้ไขเมื่อ
  • Tags yii2 yii framework2 beforesave afterfind
ข้อมูลผู้เขียน
มานพ กองอุ่น

มานพ กองอุ่น

เป็นสมาชิกเมื่อ: 18 ธ.ค. 2009

เนื้อหาที่เกี่ยวข้อง