Tag Archive YII2

YII2 : RBAC สมาชิก กลุ่มและสิทธิ

yii2 มีระบบจัดการสิทธิต่างๆ เรียกว่า Role Based Access Control (RBAC) โดยสามารถกำหนดสิทธิได้โดยใช้ กลุ่ม (role) และกำหนดสิทธิให้รายคนได้ เพื่อที่จะควบคุมให้แต่ละคนสามารถเข้าไปใช้เมนูต่างๆ ได้ตามความเหมาะสม เราคงไม่ต้องการให้ใครก็ได้ แต่มาเปลี่ยนข้อมูล ตั้งค่าของระบบใหม่ หรือลบงานของคนอื่นออกไปโดยไม่มีเหตุอันควร เริ่มจากการกำหนด role โดย

  1. เพิ่ม component authManager ในไฟล์ common/config/main.php[code language=”php” title=”main.php”]
    ‘components’ => [

    ‘authManager’ => [
    ‘class’ => ‘yii\rbac\DbManager’,
    ],

    ],
    [/code]
  2. สร้างตาราง auth ก่อนโดย command[code language=”text” title=”terminal”]
    yii migrate –[email protected]/rbac/migrations/
    [/code]
    ตอบ yes รอจนเห็น Migrated up successfully. จะเป็นการสร้างตาราง auth_assignment, auth_item, auth_item_child และ auth_rule
    ถ้าเห็น Exception ‘yii\base\InvalidConfigException’ with message ‘The configuration for the “user” component must contain a “class” element.’ ให้ไป comment config ทีระบุ user components ออกไปก่อน แลัวลองใหม่
  3. สร้างไฟล์ใหม่ /backend/controllers/RbacController.php[code language=”php” title=”RbacController.php”]
    <?php
    namespace backend\controllers;

    use Yii;
    use yii\helpers\Html;
    use yii\web\Controller;

    /**
    * Site controller
    */
    class RbacController extends Controller
    {

    private $auth = [];

    public function init()
    {
    parent::init();

    $this->auth = Yii::$app->authManager;
    }

    public function actionIndex()
    {
    return ‘<h1>RBAC Snippets</h1>’ .
    ‘<ul>’ .
    ‘<li>’ . html::a(‘Create Role’, ‘createparentsrole’, [‘target’ => ‘t1’]) . ‘</li>’ .
    ‘<li>’ . html::a(‘Set Child Role’, ‘childrole’, [‘target’ => ‘t2’]) . ‘</li>’ .
    ‘<li>’ . html::a(‘Assign To User’, ‘assignrole’, [‘target’ => ‘t3’]) . ‘</li>’ .
    ‘</ul>’;
    }

    public function actionAssignrole()
    {
    $administratorsRole = $this->auth->getRole(‘administrators’);
    if (is_null($this->auth->getAssignment(‘administrators’, 1))) {
    $this->auth->assign($administratorsRole, 1);
    }

    $staffsRole = $this->auth->getRole(‘staffs’);
    if (is_null($this->auth->getAssignment(‘staffs’, 1))) {
    $this->auth->assign($staffsRole, 1);
    }

    /*
    show all roles from table auth_assignment
    */
    return ‘<h1>Assignments of user id = 1</h1>’ .
    ‘<pre>’ . print_r($this->auth->getAssignments(1), true) . ‘</pre>’;
    }

    public function actionChildrole()
    {
    $administratorsRole = $this->auth->getRole(‘administrators’);
    $guestsRole = $this->auth->getRole(‘guests’);

    if (is_null($this->auth->hasChild($administratorsRole, $guestsRole))) {
    $this->auth->addChild($administratorsRole, $guestsRole);
    }

    /*
    show all roles from table auth_item_child
    */
    return ‘<h1>Children of "administrators" Role</h1>’ .
    ‘<pre>’ . print_r($this->auth->getChildren(‘administrators’), true) . ‘</pre>’;
    }

    public function actionCreateparentsrole()
    {
    $roles = [
    ‘administrators’,
    ‘guests’,
    ‘staffs’,
    ‘users’,
    ];

    foreach ($roles as $role) {
    if (is_null($this->auth->getRole($role))) {
    $newRole = $this->auth->createRole($role);

    $newRole->description = ‘parent role of ‘ . $role;

    $this->auth->add($newRole);
    }
    }

    /*
    show all roles from table auth_item (type = 1)
    */
    return ‘<h1>Lists Of All Roles</h1>’ .
    ‘<pre>’ . print_r($this->auth->getRoles(), true) . ‘</pre>’;

    }

    }
    [/code]ลองเรียก link http://localhost/advanced/backend/web/rbac และดูความเปลี่ยนแปลงตามลำดับ

ดูเพิ่มเติม

Yii2 Fixed jQuery version

งานที่ทำใช้ jQuery plugin ที่จำกัดอยู่ที่ไม่เกินเวอร์ชั่น 2.1.3 เท่านั้น แต่ทุกครั้งที่ update yii โดยใช้คำสั่ง composer update มันจะเปลี่ยนเจคิวรี่เป็นตัว 2.1.4 ทุกครั้ง ต้องมาเปลี่ยนทุกครั้งเลย แก้ได้โดยไปสั่งใช้คอมโพสเซอร์โหลดตัวที่ต้องการมา

  1. แก้ composer.json เพิ่ม
    [code language=”php” title=”composer.json”]
    "require": {

    "components/jquery": "2.1.3"

    },
    [/code]
  2. ไปใช้ command พิมพ์ composer update มันจะโหลดเจคิวรี่มาเก็บไว้ที่ \vendor\components\jquery
  3. สั่งให้ยีสองโหลด jquery ตัวนี้มาใช้โดยกำหนด
    [code language=”php” title=”main.php”]

    ‘components’ => [

    ‘assetManager’ => [
    ‘bundles’ => [
    ‘yii\web\JqueryAsset’ => [
    ‘baseUrl’ => ‘@web’,
    ‘js’ => [
    ‘../../vendor/components/jquery/jquery.min.js’,
    ],
    ‘sourcePath’ => null
    ],
    ],
    ],

    [/code]

yii จะเปลี่ยน link จาก[code lang=”html”]<script src="/YiiAdvanced/frontend/web/assets/41df07c8/jquery.js"></script>
[/code]เป็น[code lang=”html”]<script src="/YiiAdvanced/frontend/web/../../vendor/components/jquery/jquery.min.js"></script>[/code]หลังจากนี้ถึงจะอัพเดตกี่ครั้ง jquery ก็จะยังเป็นตัวเดิมอยู่

แก้ validation error ใน YII 2

ฟอร์มของ yii จะมีการแจ้งเตือนถ้าหากพบว่าข้อมูล input ที่เรากรอกใน form ไม่ถูกต้อง โดยจะทำกรอบอินพุต ป้าย label เป็นสีแดงและมีข้อความแสดงใน help-block เพิ่มขึ้นมา บางครั้งก็ทำให้ฟอร์มที่จัดไว้แน่นๆ ไม่ใช่แบบบรรทัดละกล่องข้อความตามแบบเว็บสมัยใหม่ เวลาเจอความผิดพลาด มันก็จะถีบตัวอื่นออกไป หรือดูอัดแน่นเกินไปจนดูไม่สวย

ก็สามารถเอาออกได้โดยใช้ form template เหมือนเดิม โดยยังสามารถทำ validation ได้ตามปกติ

วิธีการคือ

  1. เปิดไฟล์ _form.php ใน view เป้าหมาย
  2. เปลี่ยน
    [code language=”php”]
    <?php $form = ActiveForm::begin([‘id’ => ‘login-form’]); ?>
    [/code]เป็น
    [code language=”php”]
    <?php $form = ActiveForm::begin([
    ‘fieldConfig’ => [
    ‘template’ => "{label}\n{input}\n{hint}"
    ],
    ‘id’ => ‘login-form’
    ]); ?>
    [/code]

อย่าลืมเปลี่ยน id นะครับ

ถ้าใช้[code language=”php”]use yii\bootstrap\ActiveForm;[/code]ให้เปลี่ยน template เป็น[code language=”php”]’template’ => "{label}\n{beginWrapper}\n{input}\n{hint}\n{endWrapper}"[/code]

YII2 GRUD GRID FROM หลายภาษา

จากเรื่องที่แล้ว ทำตาราง yii 2 ให้เก็บหลายภาษา โดยเราสามารถอ้างถึง attribute ตามรูปแบบ {attribute name}_{language} เช่น ในตาราง _lang ฟิลย์ชื่อ name ก็ใช้ $model->name_en, $model->name_jp, $model->name_th ในวิวถ้าต้องการแสดงผล

ในบทความที่ยังขาดตัวอย่างในการแสดงข้อมูล การใช้ในกริดที่แสดงรายการทั้งหมด, ฟอร์มที่จะกรอกข้อมูล และวิวที่จะแสดงสิ่งที่เราเก็บเอาไว้ออกมา ตัวอย่าง code ที่ผมใช้

GridView ต้องการให้แสดงภาษาอังกฤษเป็นหลัก อีกช่องที่เหลือแสดงสลับกันระหว่างภาษาไทย และญี่ปุ่น ทำได้โดยแทนที่จะอ้าง name_th หรือ name_jp ตรงๆ ก็อ้างผ่านตัวแปรไปแทน [code lang=”php” title=”index.php”]

if(Yii::$app->language == ‘jp’)
{
$name = ‘name_jp’;
}
else
{
$name = ‘name_th’;
}

echo GridView::widget([
‘dataProvider’ => $dataProvider,
‘filterModel’ => $searchModel,
‘columns’ => [
[‘class’ => ‘yii\grid\SerialColumn’],

‘name_en’,
$name,

‘post_id’,
‘status’,
],
]);

[/code]

form ก็สามารถใช้เหมือนรูบแบบปกติได้เลย โดยเราสามารถกรอกข้อมูล แก้ไขตัวแปลภาษาทั้งหมดได้พร้อมกันในครั้งเดียว เช่น[code lang=”php” title=”_form.php”]

<?= $form->field($model, ‘name_en’)->textInput() ?>
<?= $form->field($model, ‘name_jp’)->textInput() ?>
<?= $form->field($model, ‘name_th’)->textInput() ?>

[/code]

วิวก็ตามรูปแบบเหมือนตัวอื่นๆตามปกติ[code lang=”php” title=”view.php”]

<?= DetailView::widget([
‘model’ => $model,
‘attributes’ => [
‘post_id’,
‘status’,

‘name_en’,
‘name_jp’,
‘name_th’,

‘date_publish’,
‘date_expire’,
‘log_created’,
‘log_created_by’,
‘log_updated’,
‘log_updated_by’,
],
]) ?>
…[/code]

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

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

  1. ติดตั้ง OmgDef/yii2-multilingual-behavior โดยแก้ composer.json ใส่[code language=”php”]
    "require": {

    "omgdef/yii2-multilingual-behavior": "~2.0"

    },
    [/code]run composer update
  2. สร้างตาราง โดยแยกตารางหลักที่เก็บ id และฟิลย์ที่ใช้ร่วมกัน อีกตารางเก็บ field ที่แยกตามภาษาต่างๆเช่น content, title[code language=”sql”]
    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;
    [/code]อย่าลืมใส่ id และ language มันจำเป็นต้องใช้ เก็บว่า record นี้เป็นภาษาอะไร

  3. สร้าง model โดยใช้ gii ตามปกติทั้ง 2 ตาราง
  4. เปิด model ของตารางหลัก ตัวอย่างคือ ..\model\Post.php ใส่ code[code language=”php”]

    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’,
    ]
    ]
    ];
    }

    [/code]

    • languages ภาษาทั้งหมดที่ใช้ได้
    • defaultLanguage ภาษาเริ่มต้น
    • langForeignKey ใส่ฟิลย์ที่ เชื่อมทั้ง 2 ตารางไว้ด้วยกัน (primary key)
    • tableName ชื่อตารางที่เก็บส่วนแปลภาษาไว้
    • attributes ฟิลย์ทั้งหมด ที่ต้องการทำระบบแปลภาษา
  5. เปิด ไฟล์ _form.php ที่เราใช้กับโมเดลนี้ขึ้นมา ใส่[code language=”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]) ?>

    [/code]
  6. ทดลอง save ดู ตารางใน database จะเก็บข้อมูลไว้

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

YII 2 Widget เปลี่ยนภาษา

หลังจากทำให้ yii รองรับหลายภาษาในเรื่อง ทำ yii 2 ให้รับหลายภาษา เรามาทำตัวเปลี่ยนภาษากันต่อ โดยเขียนเป็น Widget เพื่อที่สามารถนำไปใช้ได้สดวก

เป้าหมายคือ

  1. สามารถเปลี่ยนภาษาได้โดยใช้ตัวแปร get language=EN หรือภาษาอะไรก็ได้ จะเรียกใช้จาก link ธรรมดาก็ได้ หรือเลือกผ่าน widget ก็ได้
  2. จดจำได้ว่า user เคยเลือกภาษาอะไรไว้

สร้างไฟล์ common\components\languageSwitcher.php เนื่้อหาคือ[code language=”php” title=”languageSwitcher.php”]
<?php
/*
author :: Pitt Phunsanit
website :: https://pitt.plusmagi.com
change language by get language=EN, language=TH,…
or select on this widget
*/

namespace common\components;

use Yii;
use yii\base\Widget;
use yii\bootstrap\ButtonDropdown;
use yii\helpers\Url;
use yii\web\Cookie;

class languageSwitcher extends Widget
{
/* ใส่ภาษาของคุณที่นี่ */
public $languages = [
‘en’ => ‘English (United States)’,
‘jp’ => ‘Japanese (Japan)’,
‘th’ => ‘Thai (Thailand)’,
];

public function init()
{
if(php_sapi_name() === ‘cli’)
{
return true;
}

parent::init();
$languageNew = Yii::$app->request->get(‘language’);
$cookies = Yii::$app->request->cookies;
if($languageNew) {
if(isset($this->languages[$languageNew])) {
Yii::$app->language = $languageNew;
Yii::$app->response->cookies->add(new \yii\web\Cookie([
‘name’ => ‘language’,
‘value’ => $languageNew,
]));
}
}
elseif($cookies->has(‘language’))
{
Yii::$app->language = $cookies->getValue(‘language’);
}

}

public function run()
{
$languages = $this->languages;
$current = $languages[Yii::$app->language];
unset($languages[Yii::$app->language]);

$items = [];
foreach($languages as $code => $language)
{
$temp = [];
$temp[‘label’] = $language;
$temp[‘url’] = Url::current([‘language’ => $code]);
array_push($items, $temp);
}

echo ButtonDropdown::widget([
‘label’ => $current,
‘dropdown’ => [
‘items’ => $items,
],
]);
}
[/code]คำสั่ง php_sapi_name() มีไว้เพื่่อตรวจสอบไม่ให้ทำงานถ้าโดนเรียกใช้ใน console เพราะว่า class cookie ของ console จะใช้ต่างจากปกติ

ไปเปิดไฟล์ common\config\main.php เพิ่ม code[code language=”php” title=”main.php”]

‘bootstrap’ => [

‘languageSwitcher’,

],


‘components’ => [

‘languageSwitcher’ => [
‘class’ => ‘common\components\languageSwitcher’,
],

],

[/code]

เปิดไฟล์ frontend\views\layouts\main.php เพิ่ม[code language=”php” title=”main.php”]

use common\components\languageSwitcher;

<?= languageSwitcher::Widget() ?>

[/code]

ทดสอบโดยเปลี่ยนเป็นภาษาอื่นดู บริเวณที่เราใส่ code แปลภาษาไว้จะเปลี่ยนตามภาษาที่เลือกรึเปล่า

ทำ yii 2 ให้รับหลายภาษา

ทำโปรเจค yii แบบหลายภาษา ไทย อังกฤษ ญี่ปุ่น หรือประเทศอื่น

  1. สร้าง folder common\messages ในโพลเดอร์โปรเจค
  2. สร้างไฟล์ common\config\i18n.php ตามตัวอย่าง
    [code language=”php”]
    <?php
    return [
    ‘languages’ => [
    ‘US’,
    ‘JP’,
    ‘TH’,
    ], /* Add languages to the array for the language files to be generated. */

    ‘except’ => [
    ‘.git’,
    ‘.gitignore’,
    ‘.gitkeep’,
    ‘.hgignore’,
    ‘.hgkeep’,
    ‘.svn’,
    ‘/messages’,
    ‘/vendor’,
    ],/* exclude file */
    ‘format’ => ‘php’,
    ‘messagePath’ => __DIR__ . DIRECTORY_SEPARATOR . ‘..’ . DIRECTORY_SEPARATOR . ‘messages’,
    ‘only’ => [‘*.php’],
    ‘overwrite’ => true,
    ‘removeUnused’ => false,
    ‘sort’ => true,
    ‘sourcePath’ => __DIR__. ‘..’ . DIRECTORY_SEPARATOR . ‘..’ . DIRECTORY_SEPARATOR . ‘..’ . DIRECTORY_SEPARATOR,
    ‘translator’ => ‘Yii::t’
    ];
    [/code]

  3. เปิดไฟล์ common\config\main.php เพิ่ม language(ภาษา default), sourceLanguage ภาษาที่ใช้เป็นหลัก ใช้ en-US เป็นหลัก เพราะเวลาให้ชาติอื่นแปลจะง่ายกว่าแปลจากภาษาไทย สองตัวนี้ต้องต่างกันนะครับ ไม่งั้นมันจะไม่แปลให้ และเพิ่ม 18n ใน components
    [code language=”php”]
    <?php
    return [

    ‘components’ => [
    ‘cache’ => [
    ‘class’ => ‘yii\caching\FileCache’,
    ],
    ‘i18n’ => [
    ‘translations’ => [
    ‘common*’ => [
    ‘class’ => ‘yii\i18n\PhpMessageSource’,
    ‘basePath’ => ‘@common/messages’,
    ],
    ],
    ‘on missingTranslation’ => [‘app\components\TranslationEventHandler’, ‘handleMissingTranslation’],
    ],
    ],

    ‘language’ => ‘TH’, /* must difren sourceLanguage */
    ‘sourceLanguage’ => ‘US’,

    ];
    [/code]
  4. เปิด view ที่จะแปลขึ้นมา เช่น D:\xampp\htdocs\YiiAdvanced\frontend\views\site\index.php เพิ่ม
    [code language=”php”]
    <?php echo Yii::t(‘common’, ‘Congratulations!’); ?>
    [/code]
  5. เปิด command cd ไปที่เราเก็บ project เช่น
    [code language=”php”]
    cd D:\xampp\htdocs\YiiAdvanced
    yii message/extract @common/config/i18n.php
    [/code]
  6. เปิดไฟล์ใน common/messages ที่สร้าง folder ตามเงื่อนไขในไฟล์ i18n.php และ คอนฟิกใน i18n ใส่คำแปลไป เช่น
    [code language=”php”]
    ‘Congratulations!’ => ‘สำเร็จแล้ว’;
    [/code]
  7. ชื่อไฟล์ คือ index ของ translations ถ้าเราต้องการแยกตัวแปลภาษา frontend กับ backend ออกจากกันก็แก้ i18n เป็น
    [code language=”php”]
    ‘components’ => [

    ‘i18n’ => [
    ‘translations’ => [
    ‘frontend*’ => [
    ‘class’ => ‘yii\i18n\PhpMessageSource’,
    ‘basePath’ => ‘@common/messages’,
    ],
    ‘backend*’ => [
    ‘class’ => ‘yii\i18n\PhpMessageSource’,
    ‘basePath’ => ‘@common/messages’,
    ],
    ],
    ],

    ],
    [/code]
    เวลาใช้ก็
    [code language=”php”] <?php echo Yii::t(‘frontend’, ‘Translatable String’); ?>[/code]
    [code language=”php”] <?php echo Yii::t(‘backend’, ‘Translatable String’); ?>[/code]
  8. ถ้าต้องการเพิ่มตัวแปลใหม่ก็ทำขั้นตอนที่ 5 และ 6 ใหม่อีกครั้ง
  9. มีภาค 2 การเปลี่ยนภาษา YII 2 Widget เปลี่ยนภาษา
  10. มีภาค 3 เกี่ยวกับการเก็บข้อมูลลงฐานข้อมูล ทำตาราง yii 2 ให้เก็บหลายภาษา

ติดตั้ง yii 2 advance ผ่าน composer

YII เพิ่งออกเวอร์ชั่น 2 มาวันที่ 12 ตุลาคม พ ศ 2557 เลยเอามาลองของซักหน่อย ก่อนอื่นให้ลง composer สำหรับติดตั้งตามยุคสมัย (จริงๆ โหลด zip มาแตกเองง่ายกว่าด้วยซ้ำไป ถ้าไม่ต้องการใช้ composer ให้โหลด zip มาแล้วข้ามขั้นตอนที่ 1 ไปเลยครับ)

  1. ก่อนอื่น update เจ้า composer ซะก่อนตามธรรมเนียม รีสตาร์ต เพื่อป้องกันปัญหาเปิด command ออกมาพิมพ์
    [code language=”text”]
    composer self-update
    [/code]
    ลง composer asset plugin ทำครั้งเดียวไม่ต้องทำอีก
    [code language=”text”]
    composer global require "fxp/composer-asset-plugin:1.0.0"
    [/code]
    โดยปกติ จะสร้าง yii project ได้โดยคำสั่ง
    [code language=”text”]
    composer create-project –prefer-dist yiisoft/yii2-app-basic basic
    [/code]
    composer จะ copy ไปไว้ใน folder ชื่อ basic งานที่จะทำเหมาะกับ yii Advanced Application Template มากกกว่า ที่ต่างกันคือ

    • แยก Front- and และ back-end apps ระบบใหญ่ๆ ควรแยกไว้เพื่อความสะดวกที่สำคัญ yii สามารถใช้ configuration และ model ร่วมกันได้ ทั้ง 2 ฝั่ง
    • User model มีระบบ login, User signup and password restore เบื้องต้นติดมาด้วย

    และต้องการให้เก็บใน D:\xampp\htdocs\YiiAdvanced ให้เปลี่ยนคำสั่งเป็น
    [code language=”text”]
    composer create-project –prefer-dist yiisoft/yii2-app-advanced D:\xampp\htdocs\YiiAdvanced
    [/code]

  2. ปรับสภาพแวดล้อมให้ช่วยเขียน code ได้ง่ายขึ้น
    • ไปที่เราติดตั้ง php ไว้ก่อน พิมพ์
      [code language=”text”]
      cd c:\xampp\php
      [/code]
    • พิมพ์
      [code language=”text”]
      php D:\xampp\htdocs\YiiAdvanced\init
      [/code]
    • เลือก Development พิมพ์ 0 enter ขึ้นจริง 1 enter
  3. สร้าง database
    • สร้าง database เปล่าๆ ไว้ก่อน ของผมชื่อ YiiAdvanceDB
    • ไปที่ common/config/main-local.php ใน folder ที่เราสร้างไว้ เพิ่ม database connection ใน components ตามตัวอย่าง
      [code language=”php”]
      ‘components’ => [
      ‘db’ => [
      ‘class’ => ‘yii\db\Connection’,
      ‘dsn’ => ‘mysql:host=localhost;dbname=YiiAdvanceDB’,
      ‘username’ => ‘root’,
      ‘password’ => ”,
      ‘charset’ => ‘utf8’,
      ],
      [/code]
    • Command กลับไปที่เราเก็บ project file
      [code language=”text”]
      d:
      cd D:\xampp\htdocs\YiiAdvanced
      [/code]
    • พิมพ์
      [code language=”text”]
      yii migrate[/code]
      ตอบ yes ดูในฐานข้อมูล จะมีตาราง user กับ migrate เพิ่มขึ้นมา

การเตรียมโปรเจ็คด้วยยี่สำเร็จแล้ว! หวังว่าคงเข้าใจมากกว่าในคู่มือเว็บ yii นะครับ

YII 2 : Horizontal / inline form

ตามปกติ form ของ yii ที่ใช้ GII generate ออกมาจะเป็นรูปแบบ label บรรทัดหนึ่ง input อีกบรรทัดหนึ่ง อ่านง่าย สวยงามพอสมควร แต่อาจจะไม่ถูกใจบรรดาหัวหน้าอนุรักษ์นิยมทั้งหลาย

yii มีอีกทางเลือกให้ใช้ทำฟอร์ม คือ มี Horizontal form ให้เลือกใช้ yii bootstrap activeform (Horizontal form) อีกตัว

วิธีการคือ

  1. เปิดไฟล์ _form.php ใน view เป้าหมาย
  2. เปลี่ยน use yii\widgets\ActiveForm; เป็น use yii\bootstrap\ActiveForm; ถ้าไม่เปลี่ยนจะเจอ error Setting unknown property: yii\widgets\ActiveForm::layout
  3. เปลี่ยน[code language=”PHP”]$form = ActiveForm::begin();[/code]เป็น[code language=”PHP”]$form = ActiveForm::begin([
    ‘fieldConfig’ => [
    ‘horizontalCssClasses’ => [
    ‘label’ => ‘col-sm-2’,
    ‘offset’ => ‘col-sm-offset-2’,
    ‘wrapper’ => ‘col-sm-10’
    ]
    ],
    ‘layout’ => ‘horizontal’
    ]);[/code]
  4. สำเร็จแล้ว ฟอร์มจะเปลี่ยนเป็นรูปแบบเหมือนกับ Bootstrap Horizontal form โดย

    • layout คือ จะวางฟอร์มเป็นแบบไหน มีให้เลือก คือ default, horizontal และ inline
    • label คือ ค่า grid ของ label
    • wrapper คือ ความกว้างของช่อง input
    • offset คือ การเว้นระยะของพวก checkbox ตั้งไว้เท่ากับ label จะได้ตรงกันพอดี

    เสร็จแล้ว หรือจะใช้การจัด code แบบของผมก็ได้ครับ ไม่อยากสลับ php เข้าออก ไปๆ มาๆ [code language=”PHP”]
    <?php

    use yii\helpers\Html;
    use yii\bootstrap\ActiveForm;

    ?>

    <div class="user-form">
    <?php
    $form = ActiveForm::begin([
    ‘fieldConfig’ => [
    ‘horizontalCssClasses’ => [
    ‘label’ => ‘col-sm-2’,
    ‘offset’ => ‘col-sm-offset-2’,
    ‘wrapper’ => ‘col-sm-10’
    ]
    ],
    ‘layout’ => ‘horizontal’
    ]);

    echo $form->field($model, ‘username’)->textInput(),
    $form->field($model, ’email’)->textInput(),
    $form->field($model, ‘status’)->checkbox(array(‘label’=>’enable’)),
    ‘<div class="form-group">’,Html::submitButton($model->isNewRecord ? Yii::t(‘app’, ‘Create’) : Yii::t(‘app’, ‘Update’), [‘class’ => $model->isNewRecord ? ‘btn btn-success’ : ‘btn btn-primary’]);
    ActiveForm::end();
    echo'</div>’;[/code]