หมวดหมู่: Yii 2

ทำตาราง yii 2 ให้เก็บหลายภาษาทำตาราง yii 2 ให้เก็บหลายภาษา

ต่อจาก ทำ yii 2 ให้รับหลายภาษา หลังจากใส่คำแปรให้ text ต่าง ๆ แล้วเราจะแยกเก็บ database ภาษาต่าง ๆ ออกจากกัน คนไทยก็อยากจะอ่านภาษาไทย คนจีนก็อ่านเป็นแต่ภาษาตัวเอง

  1. ติดตั้ง OmgDef/yii2-multilingual-behavior โดยแก้ composer.json ใส่
     "require": { ... "omgdef/yii2-multilingual-behavior": "~2.0" ... },
    

    run composer update

  2. สร้างตาราง โดยแยกตารางหลักที่เก็บ id และฟิลย์ที่ใช้ร่วมกัน อีกตารางเก็บ field ที่แยกตามภาษาต่าง ๆ เช่น content, title
    CREATE TABLE IF NOT EXISTS `post` (`id` int (11) NOT NULL AUTO_INCREMENT, `enabled` tinyint (1) NOT NULL DEFAULT '1', `log_created` datetime NOT NULL, `log_updated` datetime NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `postLang` (`id` int (11) NOT NULL AUTO_INCREMENT, `post_id` int (11) NOT NULL, `language` varchar (6) NOT NULL, `title` varchar (255) NOT NULL, `content` TEXT NOT NULL, PRIMARY KEY (`id`) , KEY `post_id` (`post_id`) , KEY `language` (`language`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `postLang`
    ADD CONSTRAINT `postlang_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
    

    อย่าลืมใส่ id และ language มันจำเป็นต้องใช้ เก็บว่า record นี้เป็นภาษาอะไร

  3. สร้าง model โดยใช้ gii ตามปกติทั้ง 2 ตาราง
  4. เปิด model ของตารางหลัก ตัวอย่างคือ ..\model\Post.php ใส่ code
    ...
    use omgdef\multilingual\MultilingualBehavior;
    use omgdef\multilingual\MultilingualQuery;
    ... public static function find () { $q = new MultilingualQuery (get_called_class ()) ; $q->multilingual () ; return $q; } public function behaviors () { return [ 'ml' => [ 'class' => MultilingualBehavior::className () , 'languages' => [ 'en', 'jp', 'th', ], 'defaultLanguage' => 'en', 'langForeignKey' => 'post_id', 'tableName' => "{{%postlang}}", 'attributes' => [ 'content', 'title', ] ] ]; }
    ...
    
    • languages ภาษาทั้งหมดที่ใช้ได้
    • defaultLanguage ภาษาเริ่มต้น
    • langForeignKey ใส่ฟิลย์ที่ เชื่อมทั้ง 2 ตารางไว้ด้วยกัน (primary key)
    • tableName ชื่อตารางที่เก็บส่วนแปลภาษาไว้
    • attributes ฟิลย์ทั้งหมด ที่ต้องการทำระบบแปลภาษา
  5. เปิด ไฟล์ _form.php ที่เราใช้กับโมเดลนี้ขึ้นมา ใส่
    ... <?= $form->field ($model, 'title_jp') ->textInput (['maxlength' => 255]) ?> <?= $form->field ($model, 'title_en') ->textInput (['maxlength' => 255]) ?> <?= $form->field ($model, 'title_th') ->textInput (['maxlength' => 255]) ?>
    ...
    
  6. ทดลอง save ดู ตารางใน database จะเก็บข้อมูลไว้

  7. แก้จุดอื่น ๆ อย่าง view index.php ตามรูปแบบ ฟิลย์_ตัวย่อภาษา