1111111111111


เว็บใหม่ที่ผมขอใช้ฟรีครับ ภาวนาอยู่ว่าวันดีคืนดีข้อมูลคงไม่หายเหมือนเว็บอื่น

วันจันทร์ที่ 11 เมษายน พ.ศ. 2554

การเอา ช่องรับข้อมูลด้านบนออกจาก CGridView หรือไม่แสดงส่วน Headder ของ CGridView

ผมสงสัยมาตั้งนานมากรอบที่อยู่ด้านบนของ CGridView เราจะเอาออกยังงัย วันนี้มีคำตอบครับ (ต้องเรียกว่าเส้นผมบังภูเขาครับ)

จากรูป


เมื่อเอาออกจะได้ดังรูป



มีวิธีการดังนี้


widget('zii.widgets.grid.CGridView', array(
'id'=>'employee-grid',
'dataProvider'=>$model->search(),
// 'filter'=>$model, เอาส่วนนี้ออกหรือใส่คอมเมนต์ครับ (เส้นผมบังภูเขาครับ)
'hideHeader'=>true, //ถ้าไม่อยากให้แสดงส่วน Headder ครับ
'columns'=>array(
.....
.....
),
));



CGridView ที่ไม่มี Headder ครับ





วันศุกร์ที่ 8 เมษายน พ.ศ. 2554

การนำรูปไปใส่ใน CDetailView และ CGridView ครับ

ภาพ 1 ภาพ แทนคำ ได้เป็นล้านคำ
บางครั้งเราเห็นหน้าเว็บมีรูปเป็นตารางแล้วมีรูปอยู่ด้วนใน วันนี้เราจึงมาทดลองแทรกรูปใน CDetailView และ CGridView กันครับ


โดยมี 2 แบบที่น่าสนใจครับ คือ 1. type เป็น image 2. type เป็น html

แทรกรูปใน CDetailView
$this->widget('zii.widgets.CDetailView', array(
        'data'=>$model,
        'attributes'=>array(
                'columnId',
                'column1',
                'column2',
                'column3',
                array(                  
                    'label'=>'My Pic',
                    'type'=>'image',
                    'value'=>'path/to/image.jpg',
                ),      
        ),
));

แทรกรูปใน CGridView
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name'=>'employeePhoto',
             'type'=>'image',   // กำหนด type เป็น image
             'value'=>'"images/employee/" . $data->idEmp . ".gif"',
        ),
    ),
));


$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name'=>'employeephoto',
             'type'=>'html',   // กำหนด type เป็น html
             'value'=>'CHtml::image("images/employee/".$data->idEmp.".gif", "รูปพนักงาน")',
             //วิธีนำค่าใน $dataProvider มาแสดงครับ เช่น พนักงานรหัส 100 ก็จะแสดงรูป 100.gif
        ),
    ),
));


$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'columns'=>array(
        array(
            'name'=>'employeephoto',
             'type'=>'html',   // กำหนด type เป็น html 
             'value'=>'CHtml::image("images/employee/chawdoy.gif", "รูปพนักงาน")',  
             //วิธีระบุชื่อไฟล์รูป chawdoy.gif ลงไปเลย
        ),
    ),
));



วันพฤหัสบดีที่ 7 เมษายน พ.ศ. 2554

ตัวอย่างการใช้ CSqlDataProvider ครับ

ตัวอย่างการใช้ CSqlDataProvider ครับจากเนื้อหาที่ผ่านมาผมประมวลผลคำสั่ง SQL แล้วนำมาแสดงโดยการวนลูปเท่านั้น

สำหรับเนื้อหาส่วนนี้เป็นการประมวลผลคำสั่ง SQLแล้วส่งให้ CSqlDataProvider ครับ ก่อนแสดงผลใน CGridView ดังนี้

ขั้นตอนที่ 1. กำหนดการเชื่อมต่อฐานข้อมูล (http://www.yii.in.th/forum/index.php?topic=30.0)
ผมขอข้ามนะครับเพราะตรงกับเนื้อหาด้านล่าง

ขั้นตอนที่ 2. เชื่อมต่อฐานข้อมูลและประมวลผลข้อมูลจากฐานข้อมูล


$sqlStatement ="SELECT thai_province.thaiName, thai_province.engName, thai_slogan.slogan FROM thai_slogan RIGHT Join thai_province
ON thai_slogan.provinceID = thai_province.provinceID";


$connection=Yii::app()->db;

$connection->active=true;

$dataProvider=new CSqlDataProvider($sqlStatement, array(
'sort'=>array(
'attributes'=>array('thaiName', ),
),
'pagination'=>array(
'pageSize'=>77,
),
));

$this->render('sqlDataProvider', array(
'dataProvider'=>$dataProvider)
);


ขั้นตอนที่ 3. แสดงผลในส่วนของ view

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'chawdoy-grid',
'dataProvider'=>$dataProvider,
'columns'=>array(

array(
'name'=>'thaiName',
'header'=>'จังหวัด',
),
array(
'name'=>'engName',
'header'=>'Province',
),
array(
'name'=>'slogan',
'header'=>'คำขวัญประจำจังหวัด',
),


),

));



ตัวอย่าง : http://php.bungkhan.com/province/province/sqlDataProvider
ศึกษาเพิ่มเติม : http://www.yiiframework.com/doc/guide/1.1/en/database.dao

ไกล้ปีใหม่ไทยแล้วก็ขอให้ทุกท่านมีความสูขมากๆนะครับ



วันพุธที่ 6 เมษายน พ.ศ. 2554

ตัวอย่าง Yii เชื่อมต่อกับฐานข้อมูลโดยไม่ใช้ Active Record ครับ

เป็นตัวอย่าง Yii เชื่อมต่อกับฐานข้อมูลโดยไม่ใช้ Active Record ครับ

ตัวอย่างอยู่ที่ http://php.bungkhan.com/province/province/sql ครับ

ขั้นตอนมีดังนี้

ขั้นตอนที่ 1. กำหนดการเชื่อมต่อฐานข้อมูล (http://www.yii.in.th/forum/index.php?topic=30.0)


/* ================== ถ้าอยากติดต่อ ฐานข้อมูลครับ =================*/

'db'=>array(
'connectionString' => 'mysql:host=localhost;dbname=thai',
'emulatePrepare' => true,
'username' => 'root',
'password' => '',
'charset' => 'utf8',
),
/*========================ถ้าอยากติดต่อ ฐานข้อมูลครับ ==============*/


ขั้นตอนที่ 2. ทำการเชื่อมต่อฐานข้อมูลและประมวลผลข้อมูล


class ProvinceController extends Controller{

public function actionSql(){


$sqlStatement ="SELECT thai_province.thaiName, thai_slogan.slogan FROM thai_slogan RIGHT Join thai_province
ON thai_slogan.provinceID = thai_province.provinceID";

$connection=Yii::app()->db;
$connection->active=true;
$command=$connection->createCommand($sqlStatement);
$command->execute();
$reader=$command->query();

$this->render('exam1', array(
'reader'=>$reader)
);
}

....
....
}



ขั้นตอนที่ 3. นำข้อมูลมาแสดงผลในส่วนของ View


foreach($reader as $row){
print "
  • ".$row['thaiName']."
  • ";
    }





  • ตัวอย่าง : http://php.bungkhan.com/province/province/sql

    ศึกษาเพิ่มเติม : http://www.yiiframework.com/doc/guide/1.1/en/database.dao

    ไกล้ปีใหม่ไทยแล้วก็ขอให้ทุกท่านมีความสูขมากๆนะครับ



    การสร้าง Attributes ตามที่เราต้องการ (Virtual Attributes) ใน model class ครับ

    การสร้าง Attributes ตามที่เราต้องการ (Virtual Attributes) ใน model class

    เป็นการสร้าง Attributes โดยเราสามารถนำมาปรับแต่งตามที่เราต้องการ โดยกำหนดในคลาสที่ถ่ายทอดมาจาก CActiveRecord ครับดังนี้

    จากรูป

    http://127.0.0.1/pay/er/pay_genre.png

    ขั้นตอนที่ 1. กำหนด เมทอดใน model class เช่นผมกำหนด getMyTest()

    class Genre extends CActiveRecord {
    .....
    .....
           public function getMyTest() { 
    
                      return "รหัสเงิน : ".$this->genreID . " ชื่อ :" . $this->genreName;
          } 
    .....
    .....
    
    } 
    

    ขั้นตอนที่ 2. การแสดงค่าใน View ดังนี้

    ผมทดลองแสดงใน _view.php ครับ (_view.php ที่ถูกสร้างจาก gii ครับ)

    echo CHtml::encode($data->myTest); 
    
    

    ตัวอย่างผลการแสดงข้อมูล








    วันอังคารที่ 5 เมษายน พ.ศ. 2554

    การเรียกใช้ข้อมูลใน CActiveDataProvider


    http://php.bungkhan.com/pay/er/pay_genre.png


    จากรูปผมสร้างโมเดลชื่อ Genre
    และกำหนดในส่วนของ action ใน Controller ดังนี้


    $dataProvider=new CActiveDataProvider('Genre');

    เวลาแสดงใน view ส่วนมากก็ส่งให้ CListView เป็นต้น
    เช่น



    วันเสาร์ที่ 2 เมษายน พ.ศ. 2554

    ชิวิตคนเราต้องสู้ต่อไป+การใช้งาน layout ครับ

    วันนี้ผมต้องขี่รถมอเตอร์ไซต์ข้ามภูพานจากจังหวัดกาฬสินธุ์ไปจังหวัดสกลนคร ได้เห็นภาพบรรยากาสหลายอย่างทั้งคนกำลังหาของป่า คนกำลังเลี้ยงวัวเลี้ยงควาย คนขายของป่าตามข้างทาง ทำให้ผมมีความสูขยังงัย (ยังใง, ยังไง ผมว่าหลายคนเขียนผิด ต้องใช้ ยังไง ถูกใหมครับ) สาเหตุที่ผมใช้ชื่อชาวบ้านป่าบ้านดอยเพราะเหตุนี้แหละเพราะชอบธรรมชาติ อยู่ตามบ้านนอกบ้านนา มีความสูข แต่ตอนขี่รถอยู่บนเขากก็กลัวเหมือนกันกลัวรถงอแง บนเขาบ้านห่างกันอยู่ด้วย

    ทำให้มองหรือจินตนาการตามแบบชาวบ้านป่าบ้านดอยว่า คนเราอยู่สุงแค่ใหนสุดท้ายต้องลงมา เช่นเครื่องบินถ้าไม่ยอมลงจอดสุดท้ายต้องตกลงมาเอง จะเลือกตกลงมากระแทกพื้นหรือลงมาบนพื้นแบบนิ้มๆเท่านั้นเอง อีกอย่างยานอวกาศซึ้งไม่ต้องตกลงมายังพื้นโลกก็ได้เพราะลอยอยู่บนอวกาศ แต่สุดท้ายก็จะกลายเป็นขยะอวกาศ ต่างกับยานอวกาสที่กลับมายังพื้นโลกบางครั้งอาจจะเก็บอยู่ในพิพิธภัณฑ์ คนก็ยังรู้จักคนก็ยังเล่าขาน

    คนหลายคนอยู่สูงแล้วไม่มองด้านล่าง หรือมองว่าเขาไม่รวยเท่าเรา เขาไม่มีตำแหน่งหน้าที่การงานเหมือนเรา แต่จริงๆแล้วผมว่าพี่ป้าน้าอาที่เขากำลังเลี้ยงวัวเลี้ยงควายอยู่เขามีความสูขมากกว่าคนที่มีตำแหน่งใหญ่โตเสียอีก

     

    ว่าแล้วเรากลับมาที่ Yii Framework เราดีกว่า วันนี้ผมจะพาไปรู้จักวิธีแบ่งคอลัมน์ในหน้าเว็บเวลาจะแสดงข้อมูลครับ



    วันพุธที่ 30 มีนาคม พ.ศ. 2554

    ตัวอย่างการใช้ pager ครับ

    ตัวอย่างการใช้ pager ครับ

     $this->widget('zii.widgets.grid.CGridView', array(
     'id'=>'employee-grid',
     'dataProvider'=>$model->search(),
     'filter'=>$model,
     'columns'=>array(
                .....
                .....
                .....
            ),
     'pager'=>array(
      'class'=>'CLinkPager',
      'header'=>'หน้าที่',  
      'firstPageLabel'=>'หน้าแรก',
      'prevPageLabel'=>'ก่อนหน้า',
      'nextPageLabel'=>'หน้าถัดไป', 
      'lastPageLabel'=>'หน้าสุดท้าย',
     ) 
    
    



    วันอังคารที่ 29 มีนาคม พ.ศ. 2554

    ตัวอย่างการสร้าง widget ครับ




    ขั้นตอนที่ 1. สร้างไฟล์ /components/BreadCrumb.php


    class BreadCrumb extends CWidget {

    public $crumbs = array();
    public $delimiter = ' / ';

    public function run() {
    $this->render('breadCrumb');
    }

    }


    ขั้นตอนที่ 2. สร้างไฟล์ /components/views/breadCrumb.php



    วันเสาร์ที่ 26 มีนาคม พ.ศ. 2554

    การใช้งาน Xampp เบี้องต้นครับ






    พอดีไปเจอมาก็เลยขอนำมาฝาก



    กูรู้เพียงว่า บาปมีจริง บุญมีจริง กูก็รู้เพียงแค่นี้


    "บัณฑิต...นั้นแปลว่า ผู้รู้...
    แต่กูนั้น ไม่ค่อยรู้...
    รู้เพียงนิดหน่อย ในทางพระพุทธศาสนา...
    กูรู้เพียงว่า บาปมีจริง บุญมีจริง กูก็รู้เพียงแค่นี้
    "





    หลวงพ่อคุณ


    ผมขอคัดลอกมาจาก ท่านพระอาจารย์สุพันธ์ แก้วมงคล




    วันพฤหัสบดีที่ 24 มีนาคม พ.ศ. 2554

    ใครอยากเป็นตำรวจยกมือขึ้น

    ส่วนนี้ผมใช้เป็นหน้าในการรวมข้อมูลการสอบตำรวจ ประจำปี 2554 นะครับ
    สำหรับ เรื่อง รับสมัครและสอบแข่งขันบุคคลภายนอกผู้มีวุฒิปริญญาตรีเพื่อบรรจุและแต่งตั้ง เข้ารับราชการเป็นข้าราชการตำรวจชั้นสัญญาบัตร ประจำปี พ.ศ.๒๕๕๔ ของ สำนักงานเทคโนโลยีสารสนเทศและการสื่อสาร



    รายละเอียดการสอบดูได้ที่ http://www.itc.police.go.th/

    ถ้าผมมีข้อมูลอะไรเดียวจะเอามาฝาก แต่ตอนนี้ขอตั้งประเดินไว้ก่อน



    วันจันทร์ที่ 21 มีนาคม พ.ศ. 2554

    การแปลงข้อมุลให้เป็นแบบ JSON อย่างง่าย

    JSON คือ ?

    ตัวอย่างตารางในฐานข้อมูล


    CREATE TABLE IF NOT EXISTS `tbl_cars` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `dealer_id` int(11) NOT NULL,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY (`id`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;



    ส่วนของ Class Controller ครับ

    public function actionGetCar($id){
    header('Content-type: application/json');

    $car = Cars::model()->findByPK((int)$id);

    echo CJSON::encode($car);

    Yii::app()->end();
    }

    เวลาเรียกดูข้อมูลก็ประมาณ /index.php/cars/getcar?id=3 หรือ /cars/getcar/id/3 (แล้วแต่การตกแต่ง Url manaeger ครับ)
    ผลลัพท์ที่ได้ก็จะเป็นเช่นฉะนี้

    {"id":"3","dealer_id":"6","name":"honda"}







    ผมคิดว่าในอนาคตเดียวเอาไปประยุกต์ใช้กับ Data Grid สวยๆ เช่น flexigrid.info ได้



    อ้างอิง : http://learnyii.blogspot.com/2010/12/very-simple-json-api.html



    วันจันทร์ที่ 14 มีนาคม พ.ศ. 2554

    CButtonColumn หรือ ปุ่มที่เราเห็นกันตาม Grid view ครับ

    CButtonColumn หรือ ปุ่มที่เราเห็นกันตาม Grid view



    เช่น Delete view ครับ เรามาดูการตกแต่งปุ่มเบื้องต้นกันเถอะ
    จาก


    'buttonID' => array(
    'label'=>'...', // ข้อความที่จะให้ปรากฏบนปุ่ม
    'url'=>'...', // ลิ้ง Url
    'imageUrl'=>'...', // ภาพที่ต้องการแสดง
    'options'=>array(...), // HTML options สำหรับปุ่ม
    'click'=>'...', // เมื่อกดจะให้ทำอะไร
    'visible'=>'...', // กำหนดการเข้าถึงปุ่ม เช่นเฉพาะผู้ดูแลระบบเท่านั้น
    )



    (ตัวอย่าง) การใช้ Yii และ Active Record ครับ

    (ตัวอย่าง) การใช้ Yii และ Active Record ครับ


    โดยมีตารางดังนี้

    ตาราง thai_district เก็บข้อมูลอำเภอ
    ตาราง thai_province เก็บข้อมูลชื่อจังหวัด
    ตาราง thai_slogan เก็บข้อมูลคำขวัญประจำจังหวัด และดอกไม้ประจำจังหวัด
    โดยมีเงื่อนไขคือ 1 จังหวัดมี หลาย อำเภอ (ONE TO MANY) และ 1 จังหวัด มี 1 คำขวัญประจำจังหวัด (ONE TO ONE)




    ตัวอย่าง :



    ตัวอย่างการใช้ CDetailView ครับ

    ตัวอย่างการใช้ CDetailView ครับ


    $this->widget('zii.widgets.CDetailView', array(
    'data'=>$model,
    'attributes'=>array(
    array(
    'name'=>'id', // แสดงเฉพาะผู้ดูแลลระบบเท่านั้น
    'visible'=>Yii::app()->user->name=='admin'? true : false,
    ),
    'firstname',
    'lastname',
    'birthyear',
    'email:email',
    'webpage:url', // กำหนดโดยใช้รูปแบบ CFormatter
    'description:html', // แสดงแบบภาษา HTML เช่น ถ้ามี สวัสดี ก็จะเป็นตัวหนา
    array(
    'name'=>'travelDate', 'cssClassExpression' =>'gridD', 'type'=>'raw',
    'value'=> 'DateThai($data->travelDate)', //เรียกใช้ Function อื่นๆ
    ),
    array( // แสดงแบบลิ้งครับ
    'label'=>'City',
    'type'=>'raw',
    'value'=>CHtml::link(CHtml::encode($model->city->name),
    array('city/view','id'=>$model->city->id)),
    ),
    array(
    'name'=>'country_id',
    'value'=>$model->country->name, // เรียกดูค่าใน Model อื่นๆ
    ),
    array(
    'name'=>'eyecolor_code',
    'value'=>Lookup::item('eyecolor',$model->eyecolor_code),
    ),
    'registered',
    ),
    ));




    อ้างอิง : http://www.eha.ee/labs/yiiplay/index.php/en/person/view?id=1
    อ้างอิง : http://www.yiiframework.com/doc/api/1.1/CDetailView/
    อ้างอิง : http://www.yiiframework.com/doc/api/1.1/CFormatter



    วันจันทร์ที่ 7 มีนาคม พ.ศ. 2554

    เอี๋ยนหุยใฝ่ศึกษา มีคุณธรรมงดงาม เป็นศิษย์รักของขงจื้อ




        เอี๋ยนหุยใฝ่ศึกษา มีคุณธรรมงดงาม เป็นศิษย์รักของขงจื้อ มีอยู่วันหนึ่ง เอี๋ยนหุยออกไปทำธุระที่ตลาด เห็นผู้คนจำนวนมากห้อมล้อมอยู่ที่หน้าร้านขายผ้า จึงเข้าไปสอบถามดู จึงรู้ว่าเกิดการพิพาทระหว่างคนขายผ้ากับลูกค้า ได้ยินลุกค้าตะโกนเสียงดังโหวกเหวกว่า "3x8ได้ 23 ทำไมท่านถึงให้ข้าจ่าย24เหรียญล่ะ!"
        เอี๋ยนหุยจึงเดินเข้าไปที่ร้าน หลังจากทำความเคารพแล้ว ก็กล่าวว่า "พี่ชาย 3x8 ได้ 24 จะเป็น 23 ได้ยังไง? พี่ชายคิดผิดแล้ว ไม่ต้องทะเลาะกันหรอก"
    คนซื้อผ้าไม่พอใจเป็นอย่างยิ่ง ชี้หน้าเอี๋ยนหุยและกล่าวว่า "ใครให้เจ้าเข้ามายุ่ง! เจ้าอายุเท่าไหร่กัน! จะตัดสินก็มีเพียงท่านขงจื้อเท่านั้น ผิดหรือถูกมีท่านผู้เดียวที่ข้าจะยอมรับ ไป ไปหาท่านขงจื้อกัน "
    เอี่ยนหุยกล่าวว่า "ก็ดี หากท่านขงจื้อบอกว่าท่านผิด ท่านจะทำอย่างไร?"
    คนซื้อผ้ากล่าวว่า"หากท่านวินิจฉัยว่าข้าผิด ข้ายอมให้หัวหลุดจากบ่า! แล้วหากเจ้าผิดล่ะ?"
    เอี๋ยนหุยกล่าวว่า "หากท่านวินิจฉัยว่าข้าผิด ข้ายอมถูกปลดหมวก(ตำแหน่ง)"



    วันพุธที่ 2 มีนาคม พ.ศ. 2554

    ลายตากับ Mouse Over แล้วแถวเปลี่ยนสี ถ้างั้นมากำหนดสีพื้นให้กับ CgridView กันเถอะ

    พอดีมี user คนมีอายุบอกผมให้เอาการการเปลี่ยนสีให้กับ CgridView ออก เพราะแกลายตา (ประมาณเอาเมาส์ไปวางใน CgridView ให้พื้นหลังแถวที่มีเมาส์วางอยู่บนแถวเป็นอีกสี Mouse Over) จึงไม่อยากให้เปลี่ยนสี ผมก็ไปปรึกษาโนบิตะได้ผลดังนี้ครับ


    จาก


    $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'gridLoanID',
    'dataProvider'=>$model->searchGrid(),
    'filter'=>$model,
    'rowCssClassExpression'=>'$data->statusR=="อนุมัติ"?"row-commit":"row-wait"',
    'columns'=>array(
    .....
    .....
    'loanName', 'studentName'
    .....
    .....
    ), // end of columns
    .....
    .....
    ));


    สังเกตุบรรทัดที่ 2. ผมใช้ 'id'=>'gridLoanID', ดังนั้นในไฟล์ css (screen.css) เราก็ใช้ #gridLoanID ดังนี้

    #gridLoanID table.items tr:hover
    {
    background: #ECFBD4;
    }


    และถ้าอีกขั้นเนื่องจากแถวผมมี 2 แบบคือแถวรายชื่อนักเรียนที่ได้รับการอนุมัติทุน (row-commit) กับยังไม่ได้รับการอนุมัติทุน (row-wait) สังเกตุว่าผมกำหนดข้อมูลในส่วน rowCssClassExpression ดังนี้


    ....
    ....
    'rowCssClassExpression'=>'$data->statusR=="อนุมัติ"?"row-commit":"row-wait"', //ถ้าไม่ใช้ก็เอาออกได้เลยครับ
    ....
    ....



    วันอังคารที่ 1 มีนาคม พ.ศ. 2554

    สำหรับท่านที่ต้องการอยากทดสอบ Yii framework ครับ

    สำหรับท่านที่ต้องการอยากทดสอบ Yii framework ครับ
    ตัวอย่างอยู่ที่ http://chawdoy.thport.com/thai/
    แหล่งโหลดตัวอย่าง http://www.mediafire.com/?djr7u6ilnd6j5rw
    ไฟล์ chawdoy.sql อยู่ในแพคแล้วนะครับ

    ขั้นตอนติดตั้ง Copy ไปวางใน root ครับ
    เช่น ผมติดตั้ง xampp ที่ c:\ ก็หาโฟล์เดอล์ htdocs
    C:\xampp\htdocs

    แล้วเอา ทั้งใน zip ไฟล์ไปวาง
    C:\xampp\htdocs\framework
    C:\xampp\htdocs\thai

    หลังจาก start apache แล้วเวลาเรียกก็
    http://127.0.0.1/thai