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

Byphunsanit

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

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

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

    run composer update

  2. สร้างตาราง โดยแยกตารางหลักที่เก็บ id และฟิลย์ที่ใช้ร่วมกัน อีกตารางเก็บ field ที่แยกตามภาษาต่างๆเช่น content, title
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ...
    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 ที่เราใช้กับโมเดลนี้ขึ้นมา ใส่
    1
    2
    3
    4
    5
    ...
        <?= $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 ตามรูปแบบ ฟิลย์_ตัวย่อภาษา

About the author

phunsanit administrator

Leave a Reply