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



    วันอาทิตย์ที่ 27 กุมภาพันธ์ พ.ศ. 2554

    โปรแกรมเมอร์คนไทยแต่ชอบมีปัญหากับวันที่ภาษาไทย

    หรือว่าผมแก่แล้วก็ไม่รู้นอนไม่ค่อยหลับครับ บังคับตัวเองนอนก็ใช้การไม่ได้ (ไม่หลับ) ใหนๆก็ไม่หลับ โปรแกรมที่รับมาพัฒนาก็ส่งงานเสร้จแล้ว ก็เลยมานั่งเขียน Blog ดีกว่า
    ผมเอาคลาส Thaidate มาแนะนำอีกคลาสครับผมเคยแนะนำมาแล้ว 1 คลาส แต่ผมชอบแบบนี้มากกว่า




    class Thaidate {


    public static function DateThaiLong($strDate) {
    if(!strtotime($strDate)) return "ไม่ระบุ";
    try{
    $strYear = date("Y",strtotime($strDate))+543;
    $strMonth= date("n",strtotime($strDate));
    $strDay= date("j",strtotime($strDate));
    $strHour= date("H",strtotime($strDate));
    $strMinute= date("i",strtotime($strDate));
    $strSeconds= date("s",strtotime($strDate));
    $full_month = array('','มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน',
    'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม',
    'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'
    );

    $strMonthThai= $full_month[$strMonth];
    if($strHour == 0 && $strMinute == 0 && $strSeconds ==0)
    return "$strDay $strMonthThai $strYear";
    else
    return "$strDay $strMonthThai $strYear เวลา $strHour:$strMinute:$strSeconds น.";

    }catch (Exception $e){
    return "ไม่ระบุ";
    }


    }//end class



    เวลาเอาไปใช้ก็



    วันพฤหัสบดีที่ 24 กุมภาพันธ์ พ.ศ. 2554

    ทำไมพระเจ้าถึงไม่สร้างฝนแถวตะวันออกกลาง ซึ่งต่างกับแถวเมซิโก

    พึ่งรู้นะเนี้ย.. น่าจะจริงอย่างว่า



    ทำไมต้องยอมแพ้ มนุษย์ขี้เหม็น (ขี้ตนเองตมทุกวันไม่พูดอะไร แต่ตดคนอื่นบอกว่าเหม็น)

    ชายคนหนึ่งเพิ่งจะมาพูดได้ ตอนอายุ 4 ขวบ
    ชายคนนั้น...เพิ่งจะมาอ่านหนังสือออกตอนอายุ 8 ขวบ
    ชายคน นั้น...เคยถูกไล่ออกจากโรงเรียน
    ชายคนนั้น...เคยถูกปฎิเสธจากโรงเรียนอาชีวะ แห่งซูริค
    ชายคนนั้น...เคยถูกอาจารย์ระบุว่า "สมองช้า
    ไม่ชอบสังคมและ ล่องลอยอยู่ในความฝันอันโง่เขลาของตัวเองตลอดเวลา"
    ชายคนนั้น...ชื่อ "อัลเบิร์ต ไอสไตน์" บิดาแห่งปรมาณู



    ----------------------------------------------------------------
    ชายคนหนึ่ง หลงใหลในคอมพิวเตอร์อย่างมาก
    ชายคนนั้น...ชอบหมกตัวกับ คอมพิวเตอร์เป็นเวลานานๆ
    ชายคนนั้น...ถูกเพื่อนมองว่า "สกปรก - บ้า คอมพิวเตอร์"
    ชายคนนั้น...เคยเสนอซอฟแวร์ระบบให้กับ แอปเปิ้ล คอมพิวเตอร์
    ชายคนนั้น...ถูกปฎิเสธอย่างไม่ใยดี
    ชายคนนั้น...ปัจจุบัน คือผู้ให้การช่วยเหลือด้านเงินทุนกับ แอปเปิ้ลคอมพิวเตอร์
    ชายคนนั้น...เคย ถูก ไอบีเอ็ม มองว่า "แค่เด็ก"
    ชายคนนั้น...ปัจจุบันเป็นผู้นำบริษัทซอฟแวร์ ที่ทรงอิทธิพลมากที่สุดในโลก
    ชายคนนั้น...ชื่อ วิลเลี่ยม เฮนรี่ เกตส์ ที่ สาม หรือที่รู้จักกันในนาม
    "บิลล์ เกตส์" ผู้ก่อตั้งไมโครซอฟต์ มหาเศรษฐี อันดับหนึ่งของโลก
    ผู้ถือครองสินทรัพย์กว่า 46,000 ล้านเหรียญ



    วันจันทร์ที่ 21 กุมภาพันธ์ พ.ศ. 2554

    การเพิ่มข้อมูล User โดยการสร้างคลาสที่ถ่ายทอดมาจาก CWebUser

    การเพิ่มข้อมูล User โดยการสร้างคลาสที่ถ่ายทอดมาจาก CWebUser สามารถทำได้ดังนี้

    1 ต้องมี User model (class User extends CActiveRecord) เก็บไว้ที่ protected/models/User.php


    // this file must be stored in:
    // protected/models/User.php

    class User extends CActiveRecord
    {
    /**
    * Returns the static model of the specified AR class.
    * @return CActiveRecord the static model class
    */
    public static function model($className=__CLASS__)
    {
    return parent::model($className);
    }

    /**
    * @return string the associated database table name
    */
    public function tableName()
    {
    return 'User';
    }
    }





    วันอาทิตย์ที่ 20 กุมภาพันธ์ พ.ศ. 2554

    การใช้ distinct (ของคำสั่ง SQL) ในคำสั่ง findAll()

    ก่อนอื่นต้องขอทบทวนก่อนว่า distinct (ของคำสั่ง SQL) คือ คำสั่งที่ตัดค่าที่ซ้ำกันออกไป

    การนำมาใช้ใน findAll() หรือ find*() (* หมายถึงอื่นๆนะครับ เช่น find(), findAll(), findByPk(), findAllByPk(), findByAttributes(), findAllByAtributes())


    ....
    ....
    $models=Thai::model()->findAll(array(
    'select'=>'province',
    'distinct'=>true,
    ));
    ....
    ....

    อีกรูปแบบของการใช้ distinct (ของคำสั่ง SQL) ด้วย CDbCriteria

    ....
    ....
    $criteria=new CDbCriteria;
    $criteria->distinct = true;
    $criteria->compare('province', $this->province, true);
    $criteria->order ='province DESC, ampur ASC';
    ....
    ....


    นอกจากนั้น find*() ยังสามารถใช้คุณสมบัติของ



    วันเสาร์ที่ 19 กุมภาพันธ์ พ.ศ. 2554

    AjaxValidation with multiple models and one form

    ประมาณ มีหลาย Model ที่จะทำการ ตรวจสอบข้อมูลของ Form


    beginWidget('CActiveForm', array(
    'id'=>'user-form',
    'enableAjaxValidation'=>true,
    )); ?>

    Fields with * are required.



    errorSummary($model); ?>



    labelEx($model,'region_id');?>
    textField($model,'region_id'); ?>
    error($model,'region_id'); ?>




    labelEx($acl,'userName'); ?>
    textField($acl,'userName',array('size'=>20,'maxlength'=>25)); ?>
    error($acl,'userName'); ?>


    ......


    ในส่วน Action



    การเรียกใช้เมนูตามสิทธิที่ได้ (ช่วงนี้เมืองไทยเรียกร้องสิทธิกันบ่อยต้องอินเทรนหน่อย)

    การเรียกใช้เมนูตามสิทธิที่ได้ หมายถึงแสดงเมนูตามที่สิทธิของ user นั้นๆมี

    ทบทวนกันหน่อย การกำหนดการเข้าใช้งาน Action ต่างๆกำหนดที่ Controller ถูกใหมครับ เช่น


    class ReservationController extends Controller{
    .....
    .....
    public function accessRules(){
    return array(
    array('allow',
    'actions'=>array('view','create','update','index','print','report','department'),
    'users'=>array('admin'),
    ),
    array('allow',
    'actions'=>array('view','index','email'),
    'users'=>array('@'),
    ),
    array('deny', // deny all users
    'users'=>array('*'),
    ),
    );
    }
    .....
    .....
    }


    ด้านบนเป็นการกำหนดสิทธิการเข้าถึงหรือเข้าใช้งาน ถูกใหมครับ
    'users'=>array('admin'), หมายถึงเฉพาะ admin
    'users'=>array('@'), หมายถึงเฉพาะผู้ที่ login
    'users'=>array('*'), หมายถึงใครก็ได้
    จาก code ด้านบน

    array('allow',
    'actions'=>array('view','create','update','index','print','report','department'),
    'users'=>array('admin'),
    ),


    หมายถึง อนุญาติ (allow) ให้เฉพาะ admin เท่านั้นที่ 'view','create','update','index','print','report','department'

    แต่ปัญหาที่ผมเจอคือเวลาแสดงใน view จะมีเมนูสำหรับ admin ทั้งๆที่ไช่ admin จึงได้ไปปรึกษาอิคคิวซังได้ผลมาดังนี้


    การกำหนดเมนูโดยแสดงตามสิทธิของ user ขอย้ำว่าเป็นสว่นของเมนู



    ตัวอย่างการค้นหาข้อมูลที่ส่งมาครับ

    ตัวอย่างการค้นหาข้อมูลที่ส่งมาครับ

    เช่นการค้นหา พนักงาน (Emplotee) ที่สังกัดคณะที่มี รหัlคณะ(facultyID) เท่ากับ ค่าที่ส่งมา $_GET['facultyID']


    $client= Emplotee::model()->findByPk($_GET['facultyID']);


    การค้นหาข้อมูล User จากค่าที่ส่งมา คือ $_GET['fname'] และ $_GET['flname'] ครับ



    พอดีไปเจอมา การใส่ปุ่มใน Grid ครับ

    การกำหนดปุ่มเราต้องกำหนดในส่วนของ CButtonColumn
    และเมื่อมาดูที่ 'template'=>'{view} {update} {delete} {newjob}', ถ้าหากว่าอยากสร้างปุ่มของตนเองเพิ่มเช่น ปุ่ม newjob




    array(
    'class'=>'CButtonColumn',
    'template'=>'{view} {update} {delete} {newjob}', //ขั้นตอนที่ 1. กำหนด {newjob}
    'header'=>'Actions',
    'buttons'=>array('newjob' => array(
    'label'=>'New Job',
    'url'=>'Yii::app()->createUrl("job/create",array("clientid"=>$data->id))',
    'imageUrl'=>Yii::app()->request->baseUrl.'/images/job.png',
    ),
    ),
    'htmlOptions'=>array('width'=>75),

    ),



    วันพุธที่ 16 กุมภาพันธ์ พ.ศ. 2554

    การผูก TimePicker เข้ากับ Model Data ชนิด Date Time

    จากที่ผมเคยนำเสนอ สร้างCJuiDatePicker ใน CActiveForm แบบสวยๆกันดีกว่า



    $this->widget('zii.widgets.jui.CJuiDatePicker',array(
    'model'=>$model, 'attribute'=>'tumbon', //
    'value'=>$model->StartDate,
    // additional javascript options for the date picker plugin
    'options'=>array(
    'showAnim'=>'fold',
    'showButtonPanel'=>true,
    'autoSize'=>true,
    'dateFormat'=>'dd-mm-yy',
    'language'=>'th',

    ),
    ));





    ผมขอนำอีกตัวอย่างมาให้เห็นนะครับ เป็นการเชื่อม(ผูก) TimePicker เข้ากับ Model

             

    $this->widget('ext.timepicker.TimePicker', array(
    'id'=>'reservationDate',
    /*
    การผูก TimePicker เข้ากับ Model Data ชนิด Date Time ที่นี้นะครับ ด้านล่าง
    กำหนด model เพื่อผูกกับ $model และ name กำหนดว่าผูกกับ Attibute อะไร (StartDate)
    เวลาแสดงผลจะแสดงข้อมูลจาก StartDate อัตโนมัติครับ เวลาบันทึกเหมือนกัน ซึ่ง $model เป็นอินสแตนของคลาสที่ถ่ายทอดมากจาก Active Recode เป็นต้น
    */

    'model'=>$model, //ชื่อ Model
    'name'=>'StartDate', // Attibute ใน Model ครับ
    'options'=>array( // ส่วน options เป็นส่วนของคุณสมบัติ TimePicker เช่น
    'duration'=>'',
    'showTime'=>true, // จะให้แสดงเวลาด้วยใหม
    'time24h'=>true, // เวลาจะให้แสดงเป็น 12 หรือ 24 ชั่วโมง
    'dateFormat'=>'yy-mm-dd',
    'firstDay' => 1,
    'stepMinutes'=>5, // ตอนเลื่อนเวลาขึ้นลงให้นับกี่นาที
    'showOn'=>'button',
    'changeMonth'=>true, // เปลี่ยนเลขเดือนได้ใหม
    'changeYear'=>true, // เปลี่ยนเลขปีได้ใหม
    ),
    ));


    จากโค็ดผมใช้ ext.timepicker.TimePicker นะครับ (http://www.yiiframework.com/extension/timepicker)
    สำหรับการแก้ให้แสดงภาษาไทยให้ไปโหลดที่ (http://code.google.com/p/listr/source/browse/trunk/listr/lib/js/ui/i18n/ui.datepicker-th.js?spec=svn26&r=26)

    แล้วนำไปวางใน /assets/js/

           

    Yii::app()->clientScript->registerScriptFile( $this->assets.'/js/ui.datepicker-thai.js' );




    และแก้ไขไฟล์ assets/js/timepicker.js ให้เป็นภาษาไทยครับ

      

    html + = "ชั่วโมงนาที";








    วันอังคารที่ 15 กุมภาพันธ์ พ.ศ. 2554

    การเรียกใช้ Java Script


    echo CHtml::button("(+)",array('title'=>"Topic",'onclick'=>js:setTop()));


    เป็นการเรียกใช้ function ชื่อ setTop()


    อ้างอิง : http://www.yiiframework.com/forum/index.php?/topic/16389-how-to-call-a-java-script-function-onclick-of-a-button/



    การนำ Class ที่เราสร้างขึ้นมาเองเอามาใช้กับ Yii Framework ครับ

    การนำ Class ที่เราสร้างขึ้นมาเองเอามาใช้กับ Yii Framework เช่น ผมมีคลาสที่ใช้แปลงวันที่ (ตัวอย่าง http://www.thaicreate.com/community/thai-date-format.html) ชื่อคลาส Thaidate.php แนวทางผมเองนะ ท่านใดมีแนวทางดีๆบอกมาด้วยนะครับ


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

    ขั้นตอนที่ 1. นำคลาส Thaidate.php ไปวางไว้ใน /protected/extensions ครับ
    ขั้นตอนที่ 2. ทำการ import คลาสโดยทำการ import ในไฟล์ /protected/config/main.php ดังนี้

    // autoloading model and component classes
    'import'=>array(
    'application.models.*',
    'application.components.*',
    'application.extensions.*', //เพิ่มตรงนี้แหละครับ ถ้ามีแล้วก็โอเคข้ามได้ 
    ),
    


    การนำไปใช้ก็ใช้ได้เลยครับ

    public function changThai($data, $full=1){
    
    $data = new ThaiDate($data,$full);
    
    $date->getDateTime();
    
    }
    
    



    วันจันทร์ที่ 14 กุมภาพันธ์ พ.ศ. 2554

    ช่วงนี้เป็นช่วงย้ายกลับมาบ้านเดิมครับ

    พอดีผมทดลองไปใช้ Wordpress.com ที่ลิ้ง (http://bungkhan.wordpress.com/) รู้สึกว่าตกแต่งลูกเล่นไม่ได้เยอะ แต่ถ้าตัวที่เรา Download มาติดตั้งที่ Host เราเองลูกเล่น plugin เยอะดี (ผมรับทำเว็บไซต์ด้วย wordpress นะครับ ตัวอย่างเอาขึ้นที่ www.bungkhan.com โดยใช้พื้นที่ฟรี howhost.com เอาขึ้นได้ไม่เท่าไหร่เจ็งซ่ะแล้ว หรือว่าเขาหยุดให้บริการฟรีก็มิทราบได้ ว่าจะเข้าไป backup ข้อมูลก็ยังไม่ได้เลย ตอนนี้อยู่ช่วงหา host ใหม่ครับ)

    ตอนนี้ผมก็กลัยมายังฐานที่มั่นเดิม โดยนำ Facebook มาช่วยในส่วนของการแสดงความคิดเห็นเพื่อให้เป็นการแชร์เนื้อกันได้ง่ายขึ้น



    Yii Dev
    เด็กยี้



    วันอาทิตย์ที่ 13 กุมภาพันธ์ พ.ศ. 2554

    ทดสอบแทรก Code ภาษา PHP และ Java ครับ


    public class HelloBlogger {
    public static void main(String [] args) {
    System.out.println("Hello Blogger!!");
    }
    }



    echo CHtml::activeDropDownList( $model,'statusR',/*ส่วนของการดึงค่ามี*/);

    //ส่วนที่ 1.
    // $model,'statusR' ก็ Model ที่เราจะต้องการนำค่าไปเก็บ

    /*ส่วนของการดึงค่ามี*/
    CHtml::listData(Vehicle::model()->findAll(), 'ค่าในรายการของ DropDownList', 'ข้อความที่ต้องการแสดงใน DropDownList'));

    //เช่น
    echo CHtml::activeDropDownList( $model,'statusR',
    CHtml::listData(Vehicle::model()->findAll(),'vehicleID', 'vehicleName'));
    );