MaskedInput และ Validate หมายเลขประจำตัวประชาชนแบบ AJAX Validation ใน Yii Framework 2

คู่มือการเรียนรู้ Yii Framework 2 (Yii2)

บทเรียนดีๆ สำหรับผู้ที่ต้องการแบ่งปัน บทเรียนของคุณอาจมีค่าสำหรับอีกหลายๆ คน

beta version

MaskedInput และ Validate หมายเลขประจำตัวประชาชนแบบ AJAX Validation ใน Yii Framework 2

มานพ กองอุ่น yii maskinput validation ajax หมายเลขประจำตัวประชาชน 988

การตรวจสอบหมายเลขประจำตัวประชาชนนั้นเราจะทำ 2 อย่างด้วยกันคือ 

  1. รูปแบบของหมายเลขประจำตัวประชาชนคือ 1-1111-11111-11-1
  2. ความถูกต้องของหมายเลขประจำตัวประชาชน

การสร้าง MaskedInput

MaskedInput เป็น Package ที่มีอยู่ใน Yii Framework 2 อยู่แล้ว ซึ่ง MaskedInput เป็นรูปแบบของการกำหนดการกรอกข้อมูลให้อยู่ในรูปแบบที่ต้องการ โดยสามารถ use มาใช้ได้ดังนี้

<?php
use yii\widgets\MaskedInput;
?>

?=$form->field($person, 'id_card')->widget(MaskedInput::className(),[
                'mask'=>'9-9999-99999-99-9'
            ])?>

จะได้ดังนี้

การสร้าง Form แบบ AJAX Validation

สำหรับฟอร์มกำหนดให้เป็น AJAX Validation ดังนี้

<?php
use yii\widgets\ActiveForm;
?>
<?php
$form = ActiveForm::begin([
    'enableAjaxValidation'      => true, //เปิดการ validate ด้วย AJAX
    'enableClientValidation'    => false, // validate ฝั่ง client เมื่อ submit หรือ เปลี่ยนค่า
    'validateOnChange'          => true,// validate เมื่อมีการเปลี่ยนค่า
    'validateOnSubmit'          => true,// validate เมื่อ submit ข้อมูล
    'validateOnBlur'            => false,// validate เมื่อเปลี่ยนตำแหน่ง cursor ไป input อื่น
    'options' => [
        'enctype' => 'multipart/form-data'
    ]
])?>

สร้างการตรวจสอบด้วย AJAX ใน Controller

ใน Controller ให้เพิ่มการตรวจสอบการ Validate ด้วย AJAX

use Yii;
use yii\web\Response;
use yii\widgets\ActiveForm;
//อย่าลืม use ก่อนนะครับ

public function actionCreate()
{
$person = new Person();

$request = Yii::$app->getRequest();
        if ($request->isPost && $request->post('ajax') !== null) {
            $person->load(Yii::$app->request->post());
            Yii::$app->response->format = Response::FORMAT_JSON;
            $result = ActiveForm::validate($person);
            return $result;
        }
if($person->load(Yii::$app->request->post())
{
    //ประมวลผลข้อมูลที่นี่ เช่น $person->save();
}
return $this->render('create', [
    'person' => $person,
]);
}

สร้าง Method ในการตรวจสอบความถูกต้อง ใน Model

ใน Model ให้สร้างการตรวจสอบ โดยใน rules() ให้ส่งไปประมวลผลใน method

public function rules()
    {
        return [
            //......
            [['id_card'], 'validateIdCard'],
            //......
        ];
    }


public function validateIdCard()
    {
        $id = str_split(str_replace('-','', $this->id_card)); //ตัดรูปแบบและเอา ตัวอักษร ไปแยกเป็น array $id
        $sum = 0;
        $total = 0;
        $digi = 13;
        
        for($i=0; $i<12; $i++){
            $sum = $sum + (intval($id[$i]) * $digi);
            $digi--;
        }
        $total = (11 - ($sum % 11)) % 10;
        
        if($total != $id[12]){ //ตัวที่ 13 มีค่าไม่เท่ากับผลรวมจากการคำนวณ ให้ add error
            $this->addError('id_card', 'หมายเลขบัตรประชาชนไม่ถูกต้อง');
        }
        
        
    }

 

ตัวอย่างการใช้งาน

เมื่อกรอกหมายเลขประจำตัวประชาชนไม่ถูกต้อง

เมื่อกรอกหมายเลขบัตรประจำตัวประชาชนถูกต้อง

เสริมเพิ่มเติม

สำหรับหลักในการคำนวณหานั้นเป็นการคำนวณหาเลขหลักที่ 13 โดยนำ 12 หลักแรกมาคำนวณ อ้างอิงจาก

https://th.wikipedia.org/wiki/%E0%B9%80%E0%B8%A5%E0%B8%82%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%88%E0%B8%B3%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B8%9B%E0%B8%A3%E0%B8%B0%E0%B8%8A%E0%B8%B2%E0%B8%8A%E0%B8%99%E0%B9%84%E0%B8%97%E0%B8%A2

 

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