PHP เฟรมเวิร์ด้วย Yii - sci.ru.ac.th ·...

133
PHP เฟรมเวิร์ค ด้วย Yii frameworks By : Anuchit Onhirun PHP เฟรมเวิร์ค ด้วย Yii frameworks

Transcript of PHP เฟรมเวิร์ด้วย Yii - sci.ru.ac.th ·...

PHP เฟรมเวรค ดวย Yii frameworks By : Anuchit Onhirun

PHP เฟรมเวรคดวย

Yii frameworks

PHP เฟรมเวรค ดวย Yii frameworks By : Anuchit Onhirun

คำนำ

PHP เปนภาษาทยอดนยมอกภาษาหนงทนยมใชงานกนอยางแพรหลายในปจจบน(2012) หากไดลองคนคำโดยใชคยเวรด “Top ten programming language” แลวคณจะพบวา “PHP” ตดอยในอนดบ Top 5 ของการจดอนดบในเกอบทกเวบไซท และเมอความนยมมมากขนนนกหมายความวายอมมนกพฒนานำ PHP ไปตอยอดดานงานพฒนาเพอทจะทำใหมนใชงานไดดขน

PHP Frameworks กเปนหนงในการตอยอดของนกพฒนาทมงหวงจะกำหนดรปแบบและกรอบการทำงานของการพฒนาเวบดวยภาษา PHP ใหดยงๆขน โดยในปจจบนนม PHP Frameworks ออกสทองตลาดอยเปนจำนวนมาก อาท Zend Frameworks , CakePHP , CodeIgniter , ฯลฯ และทขาดเสยไมไดกคอ Yii Frameworks

PHP Frameworks ในแตละคายนน ตางกมความแตตางกนออกไป ไมวาจะโครงสรางการจดเกบแฟม เมธอรดทใชงาน หรอรปแบบในการรบสงคา ซงเอกสารนจะกลาวถงขอกำหนดและการใชงานของYii Frameworks เทานน

และเอกสารนจะสำเรจไมได หากขาดกำลงใจและแรงบนดาลใจจากครอบครว เพอนฝงทนานกทกทาน และนอง ๆ ทคอยใหกำลงใจกน จะมากบางจะนอยบางแตกเปนกำลงใจทสำคญในการเขยนงานเสมอ และหวงวาเอกสารนจะมประโยขนกบผเรมตนทกำลงสนใจใน Yii Frameworks บางไมมากกนอย

อนชต ออนหรญ

V.0.5.130815-091110 2

สารบญคำนำ..........................................................................................................................................................2Yes it is! นแหละใชเลย! [1].....................................................................................................................7

รจก Yii ใหมากขนอกนด.................................................................................................................................................8MVC (Model View Controller) คออะไร?.................................................................................................................9การทำงานของ Yii กบ MVC........................................................................................................................................10ขนตอนการทำงานทวไปของ Yii แอพพลเคชน...........................................................................................................10ขมพลงของการขบเคลอนขอมล ORM (Object-Relational Mapping) - AR (Active Record)..........................11สรป................................................................................................................................................................................13

เรมตนไปกบ Yii! [2]................................................................................................................................15ความตองการพนฐาน....................................................................................................................................................15Yii เหมาะกบใคร?.........................................................................................................................................................15เรมตนการตดตง............................................................................................................................................................15เรมตนการสรางแอพพลเคชน.......................................................................................................................................18แอพพลเคชนคอมโพแนนท (Application Component) ทสำคญ..........................................................................23การสราง Controller...................................................................................................................................................24การสราง Controller และโครงสรางสำคญดวย Gii...................................................................................................26สรป................................................................................................................................................................................29

Controller [3]......................................................................................................................................31รบขอมล GET , POST..................................................................................................................................................35การสงขอมลจาก Controller ไปยง View..................................................................................................................37สรป................................................................................................................................................................................39

View [4]..................................................................................................................................................41มอะไรใน View ?..........................................................................................................................................................41การสรางลงคใน Yii.......................................................................................................................................................46ทำความรจกกบ Yii CHtml .........................................................................................................................................49สรป................................................................................................................................................................................50

Model [5]...............................................................................................................................................52มารจก Model ใหมากขนอกนด..................................................................................................................................52จดเตรยมฐานขอมล.......................................................................................................................................................54การใช gii ในการสราง Model.....................................................................................................................................56สรป................................................................................................................................................................................58

CRUD [6]................................................................................................................................................60นำเขา ,ลบ ,ปรบปรง ,คนหาขอมลแสนงาย................................................................................................................60

CURD อาน เพม ลบ งาย โดยไมตองออกแรง.............................................................................................................60ระบบจดการขอมลพนฐาน...........................................................................................................................................62การเปลยนปายชอกำกบฟลด (label)..........................................................................................................................65การกำหนดกฎของชองกรอกขอมล..............................................................................................................................65จดการกบสวน admin ใหดขน(อกนด) ......................................................................................................................69สรป................................................................................................................................................................................74

การทำงานกบฟอรม [7]..........................................................................................................................76การสรางโมเดล (Creating Model)..................................................................................................................................76

การกำหนดคลาสโมเดล................................................................................................................................................77การสรางกฏในการตรวจสอบขอมล.............................................................................................................................77ความปลอดภยในการกำหนดคาของแอททรบวท........................................................................................................81

การประกาศคาแอททรบวทอยางปลอดภย............................................................................................................81การเรยกใชงานกลไกการตรวจสอบ..............................................................................................................................83การเรยกดขอผดพลาดจากการตรวจสอบขอมล..........................................................................................................84ปายกำกบชองกรอกขอมล............................................................................................................................................84

การสราง Action................................................................................................................................................................85การสราง Form..................................................................................................................................................................85การใชงาน Form Builder.................................................................................................................................................88

แนวคดพนฐาน..............................................................................................................................................................88การสรางฟอรมอยางงาย...............................................................................................................................................89การกำหนดฟอรมอลเมนทของ Form Builder...........................................................................................................91

การกำหนด Sub-form...........................................................................................................................................92การเขาถงอลเมนทของฟอรม........................................................................................................................................94การสรางฟอรมซอน......................................................................................................................................................94

การทำงานรวมกบฐานขอมล [8].............................................................................................................98Data Access Objects (DAO)..........................................................................................................................................98

การเชอมตอกบฐานขอมล.............................................................................................................................................99การดำเนนการของขดคำสง SQL...............................................................................................................................100การดงขอมลจากผลลพธของควร...............................................................................................................................101การใชงานทรานแซคชน (Using Transactions).......................................................................................................102Binding Parameters................................................................................................................................................103Binding columns.....................................................................................................................................................104การใชงานเทเบลพรฟกซ............................................................................................................................................104

การสรางควรดงขอมลดวย Yii Query Builder..............................................................................................................105การเตรยม Query Builder........................................................................................................................................106การสรางควรเพอดงขอมล..........................................................................................................................................106

select().................................................................................................................................................................107

selectDistinct()...................................................................................................................................................107from()...................................................................................................................................................................108where().................................................................................................................................................................108andWhere().........................................................................................................................................................109orWhere()............................................................................................................................................................109order()..................................................................................................................................................................109limit() และ offset().............................................................................................................................................110join() และทเกยวของ...........................................................................................................................................110group()..................................................................................................................................................................110having()................................................................................................................................................................111union()..................................................................................................................................................................111

การสงดำเนนการควร.................................................................................................................................................111การแสดงชดคำสง SQLs............................................................................................................................................111การสรางควรในรปแบบอน ๆ.....................................................................................................................................112การสรางควรหลายควร...............................................................................................................................................112

การสรางควรเพอจดการกบขอมล ( insert , update , delete ).................................................................................113insert()........................................................................................................................................................................113update()....................................................................................................................................................................113delete()......................................................................................................................................................................114

Active Record................................................................................................................................................................114การเชอมตอกบระบบฐานขอมล.................................................................................................................................115การกำหนด AR คลาส.................................................................................................................................................116การนำเขาขอมลใหม...................................................................................................................................................117การอานขอมล.............................................................................................................................................................118การปรบปรงขอมล......................................................................................................................................................120การลบขอมล...............................................................................................................................................................121ความถกตองของขอมล...............................................................................................................................................122การปรบแตง................................................................................................................................................................123การทำทรานเซคชนดวย AR.......................................................................................................................................123Named Scopes........................................................................................................................................................124

การสรางพารามเตอรใหกบเนมดสโคป................................................................................................................125ดฟอลตสโคป.........................................................................................................................................................125

Relational Active Record......................................................................................................................................126การประกาศความสมพนธ..........................................................................................................................................127การดำเนนการกบรเลชนนอลควร (Relational Query)..........................................................................................129

การสรางความสมพนธดวยควร โดยไมระบความสมพนธในโมเดล...........................................................................131

PHP เฟรมเวรค ดวย Yii frameworks By : Anuchit Onhirun

Yes it is! นแหละใชเลย! [1]หากคณคอผหนงทเปนนกพฒนาเวบไซทดวย PHP แลวละก คณกคงจะเคยแสวงวาวธการเขยนโคดทดแลงายและมรปแบบโครงสรางทชดเจน แมกระทงวาหากคณพฒนาโปรแกรมของคณดวยวธการแบบ OOP แลวกตาม แตนน! มนกยงมปญหากวนใจไดไมหยดหยอนเมอคณทำงานเปนทม ปญหาทวานนกคอโครงสรางของโปรแกรม ยกตวอยางเชน ชอโฟลเดอรและตำแหนงทจดเกบเอกสาร (Skeleton) , การตงชอ Identifer ตาง ๆ หรอรปแบบในการสงผานขอมล ซงแตละคนกมวธการหรอรปแบบทแตกตางกนออกไป ถงแมปญหานจะแกไขปญหาไดดวยการสรางกฏเกณฑขอบงคบระบเปนเอกสารในการพฒนา แตมนกยงไมทำใหปญหานหมดไปได เหตเพราะวายงมความเปนไปไดทจะมผไมปฏบตตาม หรออาจมการตงชอของ Skeleton , Identifer ตาง ๆ ผดดวยความไมตงใจ จะเหนวาความผดพลาดตาง ๆ ไมไดถกความคมดวยกลไกของซอฟทแวร ดงนน เราจงพยายามสรางกฏเกณฑขอบงคบในการพฒนาโปรแกรมทถกควบคมไดดวยกลไกของซอฟทแวร ทเราเรยกกนวา "เฟรมเวรค (FrameWork)” , เจาเฟรมเวรคนเองทจะเปนตวควบคมกฏเกณฑตาง ๆ เพอใหนกพฒนามรปแบบการทำงานทเหมอนกนภายใตกรอบการทำงานเดยวกนมรปแบบการทำงานทเหมอน ๆ กน นนกหมายความวา หากผใดไมทำตามขอกำหนดของเฟรมเวรคแลวละก เจาเฟรมเวรคจะดำเนนการแจงขอผดพลาดใหทราบทนท

จะเหนวา "เฟรมเวรค" มขอดเรองของการควบคมกรอบการทำงานแลวมนยงมขอดอกกคอ เราสามารถสราง API ตาง ๆ ทจำเปนตอการใชงานไวเลย ซงมนกจะกลายเปนสวนหนงของเฟรมเวรค ทำใหการพฒนาซอฟทแวรแบบเปนทมเปนไปไดโดยงาย เพราะเฟรมเวรคไดกำหนดรปแบบและเตรยม API ทจำเปนไวใหเปนทเรยบรอยแลว , จากขอดทกลาวมาเหลาน อาจทำใหคณกำลงคดวาควรจะพฒนากฏเกณฑในการทำงานดวยการพฒนาเฟรมเวรคของคณเอง มนคงไมใชความคดทผดอะไรหากคณมเวลาและความสามารถทมากพอ แตมนจะดกวาไหมถา! คณจะมองหาเฟรมเวรคทมคนพฒนาและเปนทนยมของทองตลาดอยแลว

V.0.5.130815-091110 7

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ถาคณเหนอยเกนไปสำหรบการพฒนาเฟรมเวรคดวยตวคณเองละก คณกควรมองหาเฟรมเวรคทมใชงานกนอยางแพหลายกนอยแลวในทองตลาด ซงมนกมเยอะแยะมากมาย เชน .Net คอเฟรมเวรคของคายไมโครซอฟท หรอ Django , TurboGear คอเฟรมเวรคของภาษา Python หรอ Rail ซงเปนเฟรมเวรคของภาษา Ruby แตในทน เราจะมองหาเฟรมเวรคของภาษา PHP กน

เฟรมเวรคของภาษา PHP มมากมายหลายตวทเปนทนยมกนในทองตลาดเชน Zend Framework , CakePHP , Code Igniter , Pardo , Kohano , Joomla , WordPress, Dupal และอกเยอะแยะมากมาย แตทจะขาดเสยไมไดทจะกลาวถงนนกคอ Yii Framework

รจก Yii ใหมากขนอกนดโครงการของ Yii Framework ไดเรมออกสโลกของโอเพนซอรสเมอมกราคม 2008 โดยQiang Xue ซง Xue เคยเปนนกพฒนาและผสราง Prado (http://www.pradosoft.com/about/) เขาไดใชประสพการณจาก Prado เพอมาปรบปรงและเพมความสามารถของ Yii ใหดขนจนไดรบการตอบรบทดและไดออกเวอรขน Yii 1.0 เมอธนวาคม 2008

“Yii” (ออกเสยง 'ย' ซงพยายามสอถงคำวา “Yes It Is!”) (http://www.yiiframework.com/about/) , Yii นนไดนำขอดของหลายเฟรมเวรคมาใช เชน Prado , Symfony , Joomlay และ ROR , Yii สนบสนนการทำงานของ PHP เวอรชน 5.1 เปนตนไป , Yii ไดพฒนาโคดโปรแกรมดวยวธการทาง OOP โดยใชดไซดนแพทเทรนแบบ MVC (Model View Controller) และใชรปแบบการจดการกบขอมลในรปแบบ AR (Active Record) , Yii ยงมสวนเพมขยาย (Extensions) มาตราฐานซงเรยกวา "Zii" ซงแพจเกจเหลานจะถกปรบปรงและพฒนาโดยทมพฒนาของ Yii แตอยางไรกตาม Yii กยงอนญาตใหนกพฒนาสามารถเขยนเพมเตมขนไดเองเชนกน

V.0.5.130815-091110 p.8

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

MVC (Model View Controller) คออะไร?MVC คอ สถาปตยกรรมในการออกแบบซอฟทแวร โดยมงแบงแยกการทำงานของซอฟทแวรออกเปน 3 สวนดวยกน คอ Model (สวนของ Data) , View (สวนการแสดงผล) , Controller (สวนการควบคมการทำงาน)

จากรปจะเหนการทำงานทมความสมพนธกนระหวาง Controller , Model และ View โดยเรมจาก ผใชรองขอหนาเอกสาร (ซงอาจมการสงขอมลดวยเมธอด Get, Post มาในตอนน) จากนน Controller จะทำการรองขอขอมลไปยงโมเดล (ในขนตอนนจะเกดขนกรณทมการควรขอมลจากฐานขอมล)แลวโมเดลจงทำการตอบกลบขอมลกลบไปยง Controller , จากนน Controller จะทำการรองสงขอมลไปให view (ถาม) จากนน view จะจดเตรยมรปแบบหนาเอกสารแลวสงรปแบบหนาเอกสารกลบไปให Controller หรอ ในกรณอน ๆ View อาจตดตอกบ Model โดยตรงกได แลวกนำขอมลมาจดเตรยมรปแบบของเอกสารแลวสงกลบให Controller เชนกน, สดทาย Controller จะนำขอมลทไดรบจาก View ซงอยในรปแบบของหนาเอกสารแลวกลบไปใหกบผใช และนคอความสมพนธของแนวคด MVC Design pattern

V.0.5.130815-091110 p.9

ผใชสงคำรองผาน Controller

Controller ตอบกลบคำรองขอไปยงผใช

1. Controller รองขอขอมลไปยง Model 2. Model ตอบกลบขอมลไปยง Controller

1. Controller รองขอหนาเอกสารและสงขอมลให view 2. view ทำการจดเตรยมหนาเอกสารแลวสงกลบ controler

1. View รองขอขอมลไปยง Model 2. Model ตอบกลบขอมลไปยง view

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การทำงานของ Yii กบ MVCในหวขอทแลวไดกลาวถงแนวคดของ MVC Design pattern ไปแลววามหลกการอยางไร ในตอนนเราลองมาดกนวากลไกการทำงานของ Yii ในรปแบบ MVC นนเปนอยางไร ตวอยาง เชน ผใชรองขอ url http://www.example.com/index.php?r=post/show&id=1

ขนตอนการทำงานทวไปของ Yii แอพพลเคชน1. ผใชสงคำรองขอ url http://www.example.com/index.php?

r=post/show&id=1 ผานไปท bootstrap (index.php) 1

2. bootstrap ทำการสรางแอพพลเคขนอนสแตนทแลวเรมตนการทำงาน3. แอพพลเคชนเรยกใชแอพพลเคชนคอมโพแนนตาง ๆ ตามคำรองขอจากผใช4. แอพพลเคชนดำเนนการสงคำรองขอการทำงานไปยง controller และ action

ผานทางแอพพลเคชนคอมโพแนนทชอวา urlManager เขน การเรยกใชคอนโทรลเลอรทชอวา post จะทำการอางถงคลาส PostController

5. แอพพลเคชนสรางอนสแตนทในตวอยางนมการเรยกใชงานแอคชน show ซงอยในคาส PostController กจะอางถงเมธอด showAction ทอยในคลาสน

1 การรองขอจะตองเรยกผาน bootstrap เทานน

V.0.5.130815-091110 p.10

ภาพเวรคโฟลวของ Yii แอพพลเคชน(credit : www.yiiframework.com )

อางองจาก : http://www.yiiframework.com/doc/guide/1.1/en/basics.mvc

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

(post/show)6. แอคชนเรยกใช Post โมเดล โดยผานคาชดขอมล ID มคาเปน 1 ไปควรทฐาน

ขอมล7. แอคชนทำการประมวลผลวว (render view) ทชอวา show + ขอมลทไดรบมา

จาก Post โมเดล8. ววแสดงผลคาทอานขอมลมาจาก Post โมเดล9. ววประมวลผล widget10. ววประมวลผลผลลพธรวมกบสวนของเลยเอาท11. เมอแอคชนประมวลผลววเสรจเรยบรอยแลวกจะทำการแสดงผลลพธใหกบผใช

ยอนกลบมาทตวอยาง หากเราวเคราห url ทผใชรองขอนนคอ http://www.example.com/index.php?r=post/show&id=1

แตถาหากเปดการใชงาน FriendlyURL แลว จะไดรปแบบของ URL เปนดงน http://www.example.com/post/show/id/1 ซงเราสามารถอธบายเปนรปแบบ url ของ Yii ไดดงนจากสถาปตยกรรมแบบ MVC นจะเหนวาไดแยกสวนการแสดงผลออกจากโมเดล และแยกคอนโทรลเลอรออกจากวว นนกหมายความวานกพฒนากทำงานในสวนของโคดโดยไมตองสนใจ UI (user interface) และ นกออกแบบกไมตองสนใจในสวนของโมเดลหรอบซเนสลอจกแตอยางใด

จากนไปเราลองดำดงไปดกลไกการทำงานภายใน Model วาภายในนนมนซอนขมพลงและความลบใด ๆ อยบาง

ขมพลงของการขบเคลอนขอมล ORM (Object-Relational Mapping) - AR (Active Record)

ORM คอ เทคนคในการเขยนโปรแกรมเพอมงเนนในการแกไขปญหาระบบจดการขอมลดวยวธการทาง OOP โดยมหลกการอยกคอ การนำเอาตารางขอมลมาสรางควาสมพนธ กบออบเจคซงจะทำใหลดการเขยนคำสง sql ทงนแนวทางของ ORM อาจใชเครองมอหรอดไซนดแพทเทรนแบบตาง ๆ มาจดการ เชน LINQ ของ MS หรอ Hibernate ทใชกบ Java , GORM สำหรบ Groovy , หรอแมกระทง Active Record Design Patternซงไดนำเสนอแนวคดการจดการความสtt มพนธของฐานขอมลกบออบเจคไว คอ ในระดบ table หรอ view ใหผกความสมพนธในระดบคลาส , แถว ๆ หนง (single row)ในตารางใหผกความสมพนธกบออบเจค และ คอลมนแตละคอลมน

V.0.5.130815-091110 p.11

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ใหผกความสมพนธกบ แอททรบวทของออบเจค โดยออบเจคนน ๆ จะมพฤตกรรมหลก ๆ อยสอยางดวยการคอ create , read , update ,delete (CRUD) ตวอยาง เขน

$product = new Product;$product->id = 1;$product->name = ”Beer”;$product->price = 90;$product->save();Insert into product(id , name ,price) values(1 , “Beer” , 90);

$product = new Product::model()->fndByPk(1);$product->price = 90;$product->save();Update product set price=90 where id = 1 ;

ในความจรงแลว Yii ถอวาแฟมวว นนเปนสวนหนงของคลาสคอนโทรลเลอรในตอนเรนเดอร เพระฉนนภายในแฟมววจงสามารถเขาถงอนสแตนทของคอนโทรลเลอรไดโดยการอางถงตวแปร $this

ในความจรงแลวคอนโทรลเลอรไมไดเปนเพยงสวนทเรยกใชงานและเรนเดอรววแตเพยงอยางเดยวเทานน Yii คอนโทรลเลอรยงจดการกบการรองขอไดดวย เชน การทำระบบพสจนตวตน (Authentication) หรอ ระบบสำหนดสทธและความคมการเขาถง (ACL)ตาง ๆ ไดอกดวย ในรายละเอยดของ Model จะกลาวถงอยางละเอยดในเรอง Model

V.0.5.130815-091110 p.12

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

สรปBlah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah

V.0.5.130815-091110 p.13

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.14

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เรมตนไปกบ Yii! [2]ถงตอนนคงพอทราบกนบางแลววา Yii นนคออะไร , Yii ทำใหการพฒนาเวบแอพพลเคชนในทก ๆ ระดบเปนไปไดอยางรวดเรว จากนไปเราจะเรมตนกบ Yii ไปพรอม ๆ กน

ความตองการพนฐานแนนอนวา Yii ออกแบบมาเพองานเวบแอพพลเคชน ดงนนสงทมนตองการคอ เวบเซรฟเวอรทสามารถตความโคด PHP ได และระบบฐานขอมลท Yii สนบสนนนน กเปนระบบฐานขอมลยอดนยมในทองตลาด ไดแก

• SQLite 2 หรอ 3 • MySQL 4.1 ขนไป• PostgresSQL 7.3 ขนไป• Microsoft SQL Server 2000 ขนไป• Oracle

และมนจำเปนมากสำหรบนกพฒนาทจะตองรเรอง PHP OOP เพราะ Yii นนเปน OOP Framework

Yii เหมาะกบใคร?

Yii นนออกแบบมาเพองานพฒนาเวบแอพพลเคชนทวไป โดยทนกพฒนาสามารถนำไปสรางเวบแอพพลเคชนไดหลากหลายขนดเชน Portals, forums , ระบบ CMS หรอ แมกระทงระบบ E-Commerce เปนตน และดวยความทมนกนทรพยากรของระบบตำและมกลไกการทำงานกบแคชทมาเพยบพรอมมนจงเหมาะมากกบแอพพลเคชนทมปรมาณการรบสงขอมลสง

เรมตนการตดตงในหวขอนเราจะมาดถงการตดตง Yii เฟรมเวรคกน แตกอนอนเลย คอ เราตองมสภาวะ

V.0.5.130815-091110 p.15

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การทำงานของเซรฟเวอรกนเสยกน จากหวขอความตองการพนฐานกคงทำใหทราบกนแลววา Yii ตองการตวตความ PHP ตงแตเวอรชน 5.1 ขนไป สวนเวบเซอรเวอรนนในทนเราจะใช apache เวบเซรฟเวอร เพราะวาการกำหนดคาคอนฟกซพเศษบางอยาง Yii ไดกำหนดไวใหสำหรบ apache เทานน เชนการทำ FriendlyURL ซงจะมคาคอนฟกซของapache มาใหเปนทเรยบรอย หรอถาตองการความสะดวกสำหรบการสรางสภาวะจำลองของเวบเซรฟเวอรแลวละก เราอาจให XAMPP (www.apachefriends.org) , หรอ AppServ (www.appservnetwork.com) ซงเปนชดสำเรจรปเลยกได โดยชดสำเรจรปเหลานไดรวม Apache และ MySQL มาใหแลว

เอาละ! หลงจากตงคาสภาวะการทำงานของเซรฟเวอรเรยบรอยแลว กมาถงขนตอนในการตดตงกนเสยท โดยการตดตงนนขนตอนไมยงยากอะไรมาก ดงตอไปน

1. กอนอนเลย สงแรกทตองทำ คอ ไปดาวนโหลด Yii Framework ไดทเวบไซท www.yiiframework.com (ณ เวลาทเขยนเปนเวอรชน 1.1.10) ซงเปน แฟมบบอดขนาดประมาณ 5.4M สำหรบแฟมแบบ tar.gz และขนาด 6.8M สำหรบแฟม .zip

2. แตกแฟม yii-1.1.10.r3566.zip ซงภายในแฟมจะประกอบไปดวยโฟลเดอร demo , frameworks , requirements และไฟลตาง ๆ ไวทโฟลเดอร htdocs , ในความจรงแลว เราตองการโฟลเดอร frameworks เทานน

V.0.5.130815-091110 p.16

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เพยง 2 ขนตอนงาย ๆ เทานเอง แตทวายงไมเสรจทงหมด เราลองมาตรวจสอบสภาพแวดลอมทจำเปนสำหรบ Yii กนกอน โดยใหคณเรยกไปท http://localhost/requirements/

หากการแสดงผลเกด failed ขนกบบางรายการกใหดำเนนการเปดการใชงานโมดลตาง ๆ ของ PHP หรออาจจะตองตดตงโมดลของ php เพมเตม ขนอยแลวแตกรณ ในทนเราอยบนสมมตฐานวาทกโมดลทำงานไดตามปกต

V.0.5.130815-091110 p.17

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เพอปองกนผใชเขาถงโฟลเดอร framework โดยตรง จงตองทำการยายโฟลเดอร framework ออกมาจาก htdocs แลวนำมาวางไวในระดบชนเดยวกนกบ htdocs กได

เมอแกไขปญหา failed เรยบรอยแลว ใหทำการลบแฟมและโฟลเดอรทแตกออกมาทงหมดทงยกเวนโฟลเดอร framework

เรมตนการสรางแอพพลเคชนในหวขอกอนหนานเราไดทำการตดตงสวนของเฟรมเวรคกนไปแลว ในตอนนเรากพรอมทจะสรางแอพพลเคชนของเรากนแลวเฟรมเวรคทกตวมขอกำหนดในการทำงาน , การตงชอ , แฟมคอนฟกซตาง ๆ รวมถงตำแหนงทจดเกบเอกสารตาง ๆ ไวอยางขดเจน ดงนนเราจำเปนทจะตองสรางโครงสรางหลกทใหในการจดเกบเอกสาร(Skeleton)ของเรากอน โดย yii มขอกำหนดของโครงสรางอนมากมายดงรป

จากรปน คอ แอพพลเคชนทชอวา "myblog” ซงโครงสรางเหลาน คอ โครงสรางหลก(Skeleton)ของแอพพลเคชนทสรางดวย Yii เฟรมเวรค จะเหนไดวาประกอบไปดวยโฟลเดอรมากมาย รวมทงแฟมคอนฟกซตาง ๆ และเครองมอทจำเปนท Yii เตรยมไวใหอกดวย

V.0.5.130815-091110 p.18

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

หากคณกำลงกงวลวามนคงเหนอยมากกวาจะสราง Skeleton เหลานไดทงหมด ขอใหไมตองกงวลในขอน เพราะ Yii ไดเตรยมเครองมอในการสรางโครงสรางเหลานไวใหแลว (Generate tools)

ในเบองตนน เราคงตองหนกลบไปพงคอมมานไลนกนกอน เพราะเครองมอสำหรบเจนตวนทำงานไดบนคอมมานไลน เครองมอตวนชอวา yiic โดยทเครองมอตวนเกบอยในโฟลเดอร framework , ในความจรงแลว yiic เปนสคลป PHP จงตองเรยกใชงานตวตความ PHP ในการรนเครองมอ ของ yiic

ดงนน คณตองรกอนวาตวตความ PHP เกบอยทไหน เชน ถาหากคณใหตวจำลองการทำงาน XAMPP สำหรบ windows ตวตความ PHP จะอยทตำแหนงทคณตดตง XAMPP เชน C:\xampp ตวตความ PHP กจะอยท C:\xampp\php\ ในตำแหนงน จะมแฟม php.exe อย

ตอมา เราตองทราบตำแหนงทเกบโฟลเดอรเฟรมเวรคของเรากอน ในทนเราเกบไวภายใต htdocs (ถาให XAMPP จะอยท ตำแหนทตดตง เชน X:\PathToXampp\htdocs\framework\)ดงนน คณตองรกอนวาตวตความ PHP เกบอยทไหน เชน ถาหากคณใหตวจำลองการทำงาน XAMPP สำหรบ windows ตวตความ PHP จะอยทตำแหนงทคณตดตง XAMPP เชน C:\xampp ตวตความ PHP กจะอยท C:\xampp\php\ ในตำแหนงน จะมแฟม php.exe อย ตอมา เราตองทราบตำแหนงทเกบโฟลเดอรเฟรมเวรคของเรากอน ในทนเราเกบไวภายใต htdocs (ถาให XAMPP จะอยท ตำแหนทตดตง เชน X:\PathToXampp\htdocs\framework\)เอาละตอนนพรอมลยกนไดแลว , ใหคณเรยก command prompt (คำสง cmd ใน windows) เมอเขาสโหมดคอมมานดแลว ( จะอางถง XAMPP บน windows ทตดตงอยใน C: ) ใหเปลยนพารธไปท htdocs เชน cd\xampp\htdocs ( เพราะเราจะสรางแอพพลเคชนไว ณ ตำแหนงนซงเปนทเกบเอกสารของเวบไซท หรอเราเรยกวา DocumentRoot) จากนนใหทำการเรยกใชเครองมอในการเจนเนอรเรท มรปแบบดงน

V.0.5.130815-091110 p.19

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

C:\xampp\php\php.exe framework\yiic.php webapp myblogC:\xampp\php\php.exe framework\yiic.php webapp myblogเรยกใชตวตความ PHP ตำแหนงเกบเครองมอเจน พารามเตอร ชอแอพพลเคชน

หลงจากเรยกใชคอมมานดแลว จะขนขอความยนยนการสรางแอพพลเคชน ดงน

Create a Web application under '/xampp/htdocs/myblog'? [yes|no]

ใหพมพ yes เพอยนยนการสรางแอพพลเคยชน จากนนคณจะเหนวามโฟลเดอร myblog ขนมาในพารธน ตอนนคณลองเรยกหนาเพจไปท http://localhost/myblog/

ใชแลว! Yii ไดสรางแอพพลเคชนทชอวา myblog ใหคณแลว หากคณกลบไปดท DocumentRoot แลวคณจะพบกบโฟลเดอร myblog ซงในนนจะมโครงสรางหลก (Skeleton) ถกสรางไวใหแลว โดยท Yii ไดสรางแอพพลเคชนตวอยางพรอมเลยเอาทมาตราฐานไวใหกอนเบองตน แตถาหากนกพฒนาตองการปรบเปลยนแกไขหรอเพมเตมกสามารถกระทำไดในภายหลง ในตอนนเรามาสำรวจในโฟลเดอร myblog กนสกหนอยวาในนนมอะไรอยบาง

V.0.5.130815-091110 p.20

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

myblog/ โฟลเดอรของโปรเจก myblogindex.php แฟมหลกทจะตองถกเรยกใชเปน

ทางผาน(bootstrap)เพอเขาสกลไกการทำงานของคอนโทรลเลอร

index-test.php แฟมสำหรบการทดสอบสวนการทำงานตาง ๆ

assets/ ตำแหนงเกบแฟมทรพยากรทเขาถงไดโดยทวไปเชน javaScript

css/ ตำแหนงเกบแฟม CSS

images/ ตำแหนงเกบแฟม รปภาพ

themes/ ตำแหนงเกบธมส

protected/ ตำแหนงจดเกบแฟมทถกปองกนการเขาถง ซงภายในนยงมโฟลดเดอรอกมากมาย (จะขอกลาวถงเมอมสวนการทำงานทเกยวของ)

จากโครงสรางทเราไดกลาวถงไปแลวนน จะเหนวาแฟม index.php (bootstrap)คอสวนกลไกหลกในการเรยกใชงานคอนโทรลเลอร ดงนนการเรยกใชคอนโทรลเลอรใด ๆ กตามจะตองเรยกผาน bootstrap นเสมอ (ดงไดอธบายในหวขอ “การทำงานของ Yii กบ MVC”) โดยภายใน bootstrap นจะทำการโหลดคาคอนฟกซตาง ๆ รวมทงการกำหนดพารธทจดเกบไลบราลของ Yii ดงตวอยาง

1. $yii=dirname(__FILE__).'/../framework/yii.php';2. $confg=dirname(__FILE__).'/protected/confg/main.php';3.

V.0.5.130815-091110 p.21

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

4. defned('YII_DEBUG') or defne('YII_DEBUG',true);5. defned('YII_TRACE_LEVEL') or defne('YII_TRACE_LEVEL',3);6.7. require_once($yii);8. Yii::createWebApplication($confg)->run();

พนฐานแลวออบเจคของแอพพลเคชนนนเปนอนสแตนทของ CWebApplication ซงเราสามารถปรบแตงคาคอนฟกซตาง ๆ ซงตามปกต Yii ไดสรางแฟมคอนฟกซมาใหแลว โดยคาของคอนฟกซนนจดเกบอยในรปแบบของ array มการกำหนดคาของคณสมบต(property) และกำหนดคา(values) ทจำเปนมาใหแลวถาหากพจารณาจากโคดตวอยางทางดานบนแลวจะเหนวาโคดในบนทดท 2 มการกำหนดการเกบคาคอนฟกซไวในแฟมทชอวา "main.php”

ภายในคอนฟกซจะเปนชดของ array ประกอบดวย key , value ซงในสวนของ key นนกคอ พรอพเพอรตของแอพพลเคชนอนสแตนท ( สวนของพรอพเพอรตดไดจาก http://www.yiiframework.com/doc/api/1.1/CWebApplication ) ยกตวอยางเชนหากตองการกำหนดชอ ของแอพพลเคชน , และกำหนดคาดฟอลทคอนโทรลเลอรวาใหเรมทำงานทคอนโทรลเลอรใด(กรณไมมการระบชอคอนโทรลเลอรทตองการเรยกใช) กสามารถทำไดโดยการตงคาคอนฟกซดงน

array(//ชอแอพพลเคชน'name'=>'My Web Application',//ดฟอลทคอนโทรลเลอร'defaultController'=>'site',

)

โดยปกต Yii จะแยกแฟมคอนฟกซออกมาใหเปนสคลปท PHP ใหอยแลวโดยจะจดเกบไวท "/protected/confg/main.php” ซงภายในแฟมนจะมการสงคากลบ (return) กลบออกมาเปนอารเรย และในชดอาเรยนกคอคาของคอนฟกซกเรชน นนเอง !

//แฟม main.phpreturn array( . . . );

จะเหนวาใน bootstrap (index.php) ไดกำหนดวา ใหไปมองหาแฟมคอนฟกซไดท

V.0.5.130815-091110 p.22

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

"/protected/confg/main.php” ซงในสคลปท ไดถายเกบไวตวแปร $confg แลวดำเนนการผานคา $confg ใหกบคอนสตคเตอรดงน

Yii::createWebApplication($confg)->run();

แอพพลเคชนคอมโพแนนท (Application Component) ทสำคญYii ไดจดเตรยมแอพพลเคชนคอมโพแนนททสำคญ ๆ สำหรบการทำงานทว ๆ ไปไวแลวเชนการใชงาน cookie , session, สวนการตดตอฐานขอมล , สวนการจดรปแบบของขอมลในการแสดงผล หรอ สวนการจดการกบระดบการเขาถง

คอมโพแนนทหลกท CWebApplication ประกาศมาใหแลวมดงน

• assetManager : CAssetManager สวนการจดการเผยแพรแฟมในสวน private • authManager : CAuthManager สวนการระดบในการเขาถง • cache : CCache สวนการจดการกบแคช • clientScript : CClientScript สวนการจดการกบไคลเอนทสคลป เชน js, css • coreMessages : CPhpMessageSource สวนท yii เฟรมเวรคใชในการตความคอรแมสเสจ • db : CDbConnection สวนการจดการ ๆ ตดตอฐานขอมล • errorHandler : CErrorHandler สวนการจดการ error • format : CFormatter สวนการจดการรปแบบการแสดงผล • messages : CPhpMessageSource สวนท yii แอพพลเคชนใชในการตความแมสเสจ • request : CHttpRequest สวนการจดการคำรองขอของผใช • securityManager : CSecurityManager สวนการจดการระบบความปลอดภย เชน การเชารหส

และ แฮชชง • session : CHttpSession สวนการทำงานกบ session • statePersister : CStatePersister • urlManager : CUrlManager สวนการทำงานการสราง URL • user : CWebUser สวนของขอมลผใชปจจบน • themeManager : CThemeManager - manages themes. สวนการจดการ Themes

V.0.5.130815-091110 p.23

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสราง Controllerหลงจากทเราไดสรางแอพพลเคชนและดสวนประกอบทสำคญของ Bootstrap และ Confguration กนไปแลว ในตอนนเราลองมาดการสราง Controller กนบาง เราไดรจกกบเครองมอทชอวา yiic กนมาแลว ซงเปนคำสงทเราใช generate โครงสรางหลก (skeleton) แตในความจรงแลวคำสง yiic น ใชในการ generate โครงสรางอน ๆ ไดอกเชน โครงสรางของ Controller , View , Model , CRUD , Form , module , model

เชนเดม เหมอนกนกบทเราเรยกใชคำสง yiic มากอนหนานนนคอเราตองเรยกผานตวตความ PHP ดงมรปแบบตอไปน

1. เปลยนพารธไปยงตำแหนงของโฟลเดอรทเกบเวบแอพพลเคชนของ (myblog)cd\xampp\htdocs\myblog

2. เรยกใชคำสง yiic ผานตวตความ PHPc:\xampp\php\php.exe protected\yiic.php shell

ในขนตอนนผานพารามเตอร shell (กอนหนานใข webapp ในการสราง Yii Application) จะทำใหเขาสโหมด shell หากอยากรมคำสงอะไรในโหมด shell นบางลองพมพ help

Yii Interactive Tool v1.1 (based on Yii v1.1.10) Please type 'help' for help. Type 'exit' to quit. >>

3. เมอเขามาในโหมด shell แลวใหพมพคำสง controller แลวตามดวยชอคอนโทรลเลอรทตองการเชน จะสรางคอนโทรลเลอรทชอวา HelloWorld

>> controller HelloWorldหากไมเกดปญหาใด ๆ โปรแกรมจะแสดงผลออกมาดงน

generate HelloWorldController.php

V.0.5.130815-091110 p.24

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

mkdir /opt/lampp/htdocs/myblog/protected/views/helloWorld generate index.php

Controller 'helloWorld' has been created in the following fle: /opt/lampp/htdocs/myblog/protected/controllers/HelloWorldController.php

You may access it in the browser using the following URL: http://hostname/path/to/index.php?r=helloWorld

>>

หากตอนนเขาไปดในโฟลเดอร protected/controllers/ จะกบแฟม SiteController.php และ HelloWorldController.php (SiteController คอ ดฟอลทคอนโทรลเลอรซงถกสรางขนมาอตโนมตพรอมกนกบการสรางแอพพลเคชน ) และหากเขาไปดใน protected/views/ จะพบกบโฟลเดอร helloWorld และภายในนนจะมแฟม index.php ( ถกสรางมาโดยอตโนมตในตอนสรางคอนโทรลเลอร helloWorld )

ตอนนใหลองเรยกไปท URL http://localhost/myblog/index.php?r=helloWorldหรอ http://localhost/myblog/index.php?r=helloWorld/index

V.0.5.130815-091110 p.25

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ในตอนนเรากรจกวธการสรางคอนโทรลเลอรกนแลว แตด ๆ การใชคำสง yiic ยงไมคอยสะดวกมากนกในการทำงาน ดงนนเราจะมาดวธทงายกวานในการสราง controller , view และอน ๆ การสราง Controller และโครงสรางสำคญดวย GiiYii ไดจดเตรยมเครองมอมาใหอกชดหนงชอวา Gii ซงเครองมอตวนทำงานไดเหมอนกนกบ yiic แตตางกนตรงท yiic ทำงานบนคอมมานดไลน แต Gii ทำงานผานเวบบราวเซอร แตกอนทจะใชงาน Gii ไดนนจำเปนทจะตองเปดการทำงานของ Gii กอน โดยใหไปกำหนดคาการทำงานไดทโฟลเดอร protected/confg/main.php แลวมองหาคอนฟกซในสวนน

1. return array(2. 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',3. 'name'=>'My Web Application',4. 'defaultController'=>'site',5.6. // preloading 'log' component7. 'preload'=>array('log'),8.9. // autoloading model and component classes10. 'import'=>array(

V.0.5.130815-091110 p.26

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

11. 'application.models.*',12. 'application.components.*',13. ),14.15. 'modules'=>array(16. // uncomment the following to enable the Gii tool17. /*18. 'gii'=>array(19. 'class'=>'system.gii.GiiModule',20. 'password'=>'Enter Your Password Here',21. // If removed, Gii defaults to localhost only.

Edit carefully to taste.22. 'ipFilters'=>array('127.0.0.1','::1'),23. ),24. */25. ),

จะเหนวา สวนของ gii นนอยภายใตเครองหมาย comment (ในบนทดท 17 , 24) , ใหนำเครองหมาย comment นนออก แลวใหแกไขในสวน password 'password'=>'Your_Password',ใหเปนคาของรหสผานทคณตองการเพอเขาไปทำงานใน gii แลวใหทำการบนทกแฟม

ในตอนนเราพรอมแลวสำหรบการทำงานของ Gii โดยคณสามารถเรยกใช Gii ไดโดยการเรยกไปท URL http://localhost/myblog/index.php?r=gii

V.0.5.130815-091110 p.27

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากนนใหทำการกรอกรหสผานตามทคณไดกำหนดไวในคอนฟกซ (แฟม main.php) กจะเขาสสวนของการจดการ

เมอเราเขาส Gii แลว จะเหนเมนการสรางโครงสรางในแบบตาง ๆ เชน Controller , View , Form , Model , Module ซงเหมอนกนการใชคำสง yiic ทกประการ ดงนนจากนไป หากมการสรางโครงสรางของ Controller , View , Model ของ Yii เราจะใชเครองมอ Gii

แตทงนในกรณทตองการสราง Yii application ใหมนน กยงคงตองอาศยเครองมอ yiic ทอยในโฟลเดอร frameworks เปนตวสรางอยด

V.0.5.130815-091110 p.28

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

สรปBlah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah

V.0.5.130815-091110 p.29

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.30

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

Controller [3]ในตอนทเลว ไดพดถงเรองเครองมอ yiic และ Gii เพอใชในการสรางโครงสรางกนไปในระดบหนงแลว ตอนนเราจะมาดสวนประกอบภายใน controller , view และการเรยกใชงาน

กอนอน เรามารจกทจดเกบ Controller และ View กนกอน , ใน Yii application มโครงสรางหลกตามไดทกลาวมาแลวบางสวนในตอนท 2 จะเหนวาโฟลเดอร protectedเปนโฟลเดอรทถกปกปองการเขาถงโดยตรงจากการรองขอของผใช (ใชความสามารถของ .htacces ใน apache เพอการกำหนดการเขาถง ) ซงภายในนนจะประกอบไปดวยโฟลเดอร ดงน

commands components confg controllers data extensions messages migrations models runtime tests views

เราคงคาดเดากนไดไมยากเลยวาคอนโทรลเลอรและววจะจดเกบอยทใด , แนนอน! คอนโทรลเลอรจะเกบอยทโฟลเดอร controllers สวนของววจะเกบอยทโฟลเดอร views และสวนของโมเดลจะเกบอยทโฟลเดอร models หากเราจะเขาไปดในโฟลเดอร controllers แลวจะเหนวา ภายในนนมแฟมอยสองแฟมดวยกนคอ SiteController.php และ HelloWorldController.php โดยขอกำหนด

V.0.5.130815-091110 p.31

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ของ Yii ระบวา คอนโทรลเลอรแตละคอนโทรลเลอร ตองถกแยกเปนคนละแฟม นนกหมายความวาในทน มอยสองคอนโทรลเลอร กคอ คอนโทรลเลอรทชอวา Site และคอนโทรลเลอรทชอวา Hello , โดยท Site คอนโทรลเลอรนนเปนดฟอลทคอนโทรลเลอรทถกสรางมาพรอมกนกบ Yii Application

yii ไดตงขอกำหนดไวสำหรบการตงชอแฟมคอนโทรลเลอรคอ อกษรตวแรกของชอคอนโทรลเลอรตองขนตนดวยอกษรพมพใหญแลวตามดวยคำวา “Controller.php” (เปน Case Sensitive อกษร C ตวแรกตองเปนพมพใหญและตวถดไปเปนอกษรพมพเลกทงหมด) เชน จะสรางคอนโทรลเลอรทชอวา test กจะตองสรางแฟมคอนโทรลเลอรชอวา “TestController.php” เปนตน จะเหนวาอกษรตวแรกของชอคอนโทรลเลอร test จะตองเปนตวพมพใหญคอ “Test” แลวตามดวย “Controller.php”

มนกคงไมไดผดอะไร หากคณตองการสรางคอนโทรลเลอรดวยตวคณเองตามขอกำหนดตามทไดอธบายไปแลวในขางตน แตอยาลมวาเรามเครองมอ yiic และ gii เปนตวชวยในการสรางคอนโทรเลอรใหอยแลวโดยทเราไมตองออกแรงมากเกนไป

นอกจากขอกำหนดในการตงชอแฟมแลว ภายในแฟมคอนโทรลเลอรนนกยงมขอกำหนดอก คอ

• การตงชอคลาส นนชอคลาสตองมชอเดยวกนกบชอแฟม และตองสบทอด(extends)มากจาก คลาส CController

• การตงชอเมธอรดทเปน Action เมธอรด นน ตองขนตนชอเมธอรดดวยคำวา action แลวตามดวยชอเมธอรดนนโดยทอกษรตวแรกควรเปนอกษรพมพใหญ , Yii มเมธอรดพเศษททำงานเปนดฟอลทแอคชนเมธอรด คอ actionIndex() ซงเมธอรดนจะทำงานโดยอตโนมตหากมการเรยกใชคอนโทรลเลอรโดยไมระบแอคชนทำงานสวนประกอบในคลาสคอนโทรลเลอรนนกจะประกอบไปดวยเมธอรดตาง ๆ แตใน Yii จะมเมธอรดประเภทหนงทถกเรยกการทำงานผานทางการรองขอ(request) URL ได เราจะเรยกเมธอรดพวกนวาแอคชนเมธอรด (action method)

<?php// TestController.php

V.0.5.130815-091110 p.32

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

class TestController extends CController { public function actionIndex() { echo "Hello index"; } public function actionShowTime() { echo $this->getTime(); } public function getTime() { return date('H:i:s'); }}

จากตวอยาง TestController นมอย 3 เมธอรด คอ actionIndex , actionShowTime และ getTime แตใน 3 เมธอรดนมอย 2 เมธอรดทจดเปนแอคชนเมธอรดกคอ actionIndex และ actionShowTime นนกหมายความวาทง actionIndex และ actionShowTime สามารถเรยกทำงานผาน URL ได แตสวน getTime นนไมไดเพราะไมใชแอคชนเมธอรด (ยำเตอนอกครง : แอคชนเมธอรดนน ตองขนตนชอเมธอรดดวยคำวา action)

เราลองมาทดสอบเรยกการทำงานของแอคขนเมธอรดผานการรองขอ URL โดยมรปแบบในการเรยกใชงานดงตอไปน

http://hostname/path_to_YiiApplication/index.php?r=controller_ID/action_IDตวอยางการอางอง คอนโทรลเลอร Test แอคชน showTime เชน

http://locahost/myblog/index.php?r=Test/showTime

V.0.5.130815-091110 p.33

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จาก URL ทไดรองขอไปคอ http://locahost/myblog/index.php?r=Test/showTime จะไดผลลพทธออกมาคอการแสดงเวลา หากพจารณาจาก URL แลวจะเหนวาเปนการรองขอไปยง localhost/myblog โดยเรยกใช index.php (Boot Strap) สงชดขอมลชอวา r โดยกำหนดให r เกบคา test/ShowTime ซง test กคอ TestController และ ShowTime กคอ actionShowTime

ในกรณทเรยกใช TestController โดยไมระบวาจะใชงานแอคชนใด , yii จะทำการเรยกใชดฟอลดแอคชนใหโดยอตโนมตนนกคอ actionIndex นนเอง เชน

http://locahost/myblog/index.php?r=Test

ซงจะเหมอนกนกบ

http://locahost/myblog/index.php?r=Test/indexแตถาหากทดลองเรยกใชงานเมธอรด getTime จาก URL“ http://locahost/myblog/index.php?r=Test/getTime” กจะพบกบผลลพธคอเออเรอรทเกดขนนนเกดขนเพราะวาเมธอรด getTime ไมใชแอคชนเมธอรดจงไมสามารถเรยกใชงานผานการรองขอเอกสารได

โดยปกตดแลว เราสามารถเขยนแอคชนเมธอรดไวภาคในคลาสคอนโทรลเลอรไดเลยดงทไดยกตวอยางไปแลวในขางตน แตกยงมอกวธหนงททำไดนนกคอ สรางแอคชนเปนคลาสใหมแลวใหคลาสคอนโทรลเลอรเรยกใชงาน

V.0.5.130815-091110 p.34

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

// HelloYiiAction.php

class HelloYiiAction extends CAction{ public function run() { echo “Hello Yii Frameworks”; }}

ในตอนนเราจะบนทกแฟมคลาสแอคชนนไวใน "protected/controllers/message/HelloYiiAction.php” และเพอใหคอนโทรลเลอรเรยกใชงานคลาสแอคชนนได จะตองทำการ override เมธอรด action() ในคลาสคอนโทรลเลอรทใช class TestController extends CController {

public function actions() { return array(

'classHello'=>'application.controllers.message.HelloYiiAction', ); } ...ตอนนลองเรยกใชแอคชนนผานทางคอนโทรลเลอร Test ดวยการเรยกไปท URL“http://localhost/myblog/index.php?r=Test/ classHello”

รบขอมล GET , POSTโดยปกตแลวเวบแอพพลเคชนจะมการรบขอมลจากไคลเอนทดวยรปแบบการสง GET , POST เพอสงใหสคปในฝงเซรฟเวอรทำงาน ซงในสวนของ Yii การรบขอมลจากไคลเอนทนนจะรบขอมลผานทางแอคชนเมธอรดของคอนโทรลเลอรทเรยกใชงาน เชน

V.0.5.130815-091110 p.35

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสงขอมลดวยเมธอรด GET แบบปกตhttp://example.com/path_uri/flename.php?dataName=value

การสงขอมลดวยเมธอรด GET ใน Yii Frameworkshttp://example.com/index.php?r=controllerName/actionName&dataName=value

หรอhttp://example.com/index.php?r=controllerName/actionName/dataName/value

เราลองทดสอบการรบ/สงขอมล โดยจะสงขอมลใหแอคชน actionGetData ของคอนโทรลเลอร HelloWorldController

class HelloWorldController extends Controller {

public function actionGetData() {

echo $_GET['mydata'];}

...

หรออาจใช automatic parameter binding โดยการผานพารามเตอรใหกบเมธอรด จะเหมอนกนกบการสงขอมดดวยเมธอรด get แตการใชตองระวง error 400 กรณทไมมชดขอมลสงมาดวย

class HelloWorldController extends Controller {

public function actionGetData($mydata) {

echo $mydata;}

...จากนนใหลองเรยกไปท URL : http://localhost/myblog/index.php?r=HelloWorld/GetData/mydata/Pass_data_by_GETสวนการรบขอมลแบบ Post นนในเบองตนนยงคงให $_POST[ ] ตามปกตไปกอนกได

V.0.5.130815-091110 p.36

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

หรอหากตองการความสะดวกในการรบขอมลใหมากขนกสามารถศกษาเพมเตมไดจากเมธอรดเหลาน

Yii::app()->request->getQuery(DataName , DefaultValue) สำหรบ GETYii::app()->request->getPost(DataName , DefaultValue) สำหรบ POST

ตวอยางเชน สงชดขอมลทชอวา language ดวยเมธอรด GET Yii::app()->request->getQuery('language'); หรอ หากตองการเซตคาปรยายไวเปน Th กรณ mydata ไมมการสงคาYii::app()->request->getQuery('mydata' , 'Th');

การสงขอมลจาก Controller ไปยง Viewแนนอนวา Controller เปนสวนกลไกความคมการทำงาน ตงแตการเรยกใชแอคชนเมธอรดตาง ๆ , การรบขอมลจากไคลเอนทดวยวธ Get , Post หรอการตดตอกบโมเดล เพอนำขอมลเหลานมาดำเนนการตอหรอสงตอใหกบววเพอใหววนำขอมลนนไปดำเนนการอยางหนงอยางใดตอไป โดยปกตแลวแอคชนเมธอรดของคอนโทรลเลอรใด ๆ จะเรยกใชงานววกทำไดโดยเรยกใชเมธอรด render() เชน $this->render('index'); ในทนกหมายความวา สงใหทำการเรนเดอรววทชอวา index , แตถาหากวาตองการทจะสงขอมลจากคอนโทรลเลอรไปใหกบววผานทางแอคชนเมธอรดนนจะตองทำการสงขอมลไปพรอมกบการเรนเดอรวว โดยสงพารามเตอรชดทสองไปใหกบเมธอรด render() เชนคอนโทรลเลอร HelloWorldController เรยกใชใชงานแอคชนเมธอรด actionIndex แลวแอคชน actionIndex ทำการเรนเดอรวว index โดยสงชดขอมล myMsg ซงกำหนดใหเกบคาของตวแปร $msg

$this->render('index' , array('myMsg'=>'PHP by Yii') );

จากโดดขางตนจะเหนวา มการสงขอมลใหกบพารามเตอรชดทสองของเมธอรด render() โดยสงเปนอารเรย ภายในอารเรยนนมชดขอมลอยหนงชดกคอ myMsg เกบคา 'PHP by Yii' ซงชดขอมลนจะถกสงไปใหวว index ทำงาน

ตอนนใหไปทวว index ( protected/views/helloWorld/index.php ) แลวใหเพมโคดนในแฟมดงน

V.0.5.130815-091110 p.37

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

<h1><?php echo $myMsg ?></h1>

จากนนใหลองเรยก URL: http://localhost/myblog/index.php?r=helloWorld/index

ในกรณทตองการสงชดขอมลมากกวาหนงชดกสามารถทำไดเชนกนโดยกำหนดชดขอมลเพมไปในอารเรย

$this->render('viewToRender' , array('data1'=>'value1' ,'data2'=>'value2' ,'data3'=>'value3' ) );

เราไดเหนวธการสงขอมลจากคอนโทรลเลอรไปใหววกนแลว ซงความจรงแลวววสามารถยงสามารถอางถงขอมลพรอพเพอรตของคอนโทรลเลอรทกำหนด Access Modifer เปน public หรอ protected ไดโดยใชคยเวรด $this เชน

#คอนโทรลเลอร HelloWorld ตำแหนงเกบ "protected/controllers/HelloWorld.php

V.0.5.130815-091110 p.38

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

<?phpclass HelloWorldController extends Controller {

protected $myVar = "Value of myVar";public function actionShowData() {

$this->render('Test'); // เรยกใชงานวว Test }…

#วว Test ตำแหนงเกบ "protected/views/Test.php<?php

echo $this->myVar;

สรปBlah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah

V.0.5.130815-091110 p.39

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.40

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

View [4]วว หรอสวนตดตอผใชเปนสวนของการแสดงผลโดยทววจะถกเรยกใชงานจากคอนโทรลเลอร , ปกตแลว Yii จะบนทกแฟมววไวท “protected/views/โฟลเดอรทมชอเดยวกนกบคอนโทรเลอรทเรยกใชวว/ชอแฟมวว.php”เชน คอนโทรลเลอรชอ “HelloWorld” เรนเดอรววทชอวา “index” ววนจะเกบอยท “protected/views/helloWorld/index.php” หากเรายอนกลบไปถงเรองการสราง Yii Application โดยใชเครองมอ Gii จะเหนวาเครองมอ Gii นนไดสรางแฟมคอนฟกซ, โฟลเดอร, คอนโทรลเลอร, ววรวมถงเลยเอาท ("protected/views/layouts/main.php") สวนนคอสวนของรปแบบเทมเพลทพนฐานของเวบไซท ในตอนนกอนจะดเรองของวว เราจะเขาไปศกษารายละเอยดภายในแฟมเลยเอาท (“main.php”) กนกอนวาภายในนนมสวนประกอบอะไรทนาสนใจอยบาง

มอะไรใน View ?มาเรมตนจากสวนแรกทเหนคอ การอางถงลงคภายนอกของเอกสาร CSS

<link rel="stylesheet" type="text/css" href="<?php echo Yii::app()->request->baseUrl; ?>/css/screen.css" media="screen, projection" />

เมอไหรทเหนการอางองถง Yii::app() นนกหมายถงการอางองการเขาถงการทำงานหรอขอมลของ Web Application เชน รายละเอยดเกยวกบหนาเอกสารปจจบนหรอกอนหนาน และในสวนของ Yii::app()->request->baseUrl() นนเปนการอางถง Root URL ของ Web Application เชนเดยวกนกบการอางถง Root http://localhost หรอ http://localhost/myblog (ในการณทเวบแอพพลเคชนถกสรางไวใต โฟลเดอร myblog) เพอใหสามารถอางองถงทรพยากรภายนอกไดเชน JavaScript , CSS , รปภาพ และยงชวยไดมากในเรองการอางถงลงคหากเราไดกำหนดให URL ของ Yii ทำงานในแบบ Friendly URL จะทำใหเราไมตองมานงแกลงคในภายหลง

V.0.5.130815-091110 p.41

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

สวนตอไปทเราจะเหนในแฟม main.php กคอสวน <title><?php echo CHtml::encode($this->pageTitle); ?></title>

พรอพเพอรต pageTitle นนจะสงกลบคาดฟอลทของชอแอพพลเคชนจากแฟมคอนฟกซ ('name'=>'My Web Application' ในแฟม protected/confg/main.php) บวกดวยบชอของคอนโทรลเลอรและชอของแอคชนทถกเรยกใชงาน

สวน Chtml::encode() นนเปนเมธอรดทใชเพอปองกนจากการโจมตดวยวธ Cross-Site Scripitng (XXS) ซงเราสามารถอางถงชอแอพพลเคชนดวยการใช Yii:app() แลวอางถงพรอพเพอรต name กไดเชนกน

<title><?php echo Chtml::encode(Yii::app()->name); ?></title>

ในการใชแบบนจะแสดงแตชอแอพพลเคชนเทานน

ตอมากคอวดเจต , วดเจตคอกลไกการทำงานยอย ๆ ทถกจดเตรยมไวเพอการทำงานอยางใดอยางหนงซงอาจจะเปนกลไกในการแสดงผลบนหนาเอกสารกได เชน เมน , ปฎทน, ขาวลาสด เปนตน วดเจตจดเปนหนงในสวนขยาย(extensions)ของ Yii โดยทสวนขยายของ Yii มอย 10 ประเภท คอ Application Component ,Behavior ,Widget ,Action ,Filter ,Controller ,Validator ,Console Command ,Module และ Generic Component (ดเพมเตมท http://www.yiiframework.com/doc/guide/1.1/en/extension.create) และ Yii ไดจดเตรยมสวนขยายมาตราฐานมาใหแลวบางสวน สวนขยายนชอวา Zii (ดเพมเตม Zii http://www.yiiframework.com/doc/api/1.1) ในการเรยกใชงานกลไกสวนขยายตาง ๆ สามารถทำไดโดยเรยกผานเมธอรด widget()

V.0.5.130815-091110 p.42

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เชน <?php $this->widget('zii.widgets.CMenu',array(...

เมอมการเรยกใชงานสวนขยายมาตราฐาน(Zii) จำเปนจะตองอางถงพารธของสวนขยายนน โดยมการอางถงรปแบบพารธดงน zii.path.to.ClassName โดยท zii คอ Root alias ถาหากกรณทเปนสวนขยายภายนอก(Third-Party Extensions) จะมรปแบบการอางถงดงน ext.path.to.ClassName โดยท ext คอ Root alias ของสวนขยายภายนอก ตำแหนงทใชจดเกบสวนขยายภายนอกจะอยท "protected/extensions"

และสดทาย ทเปนสวนทสำคญมากของเลยเอาทอกสวนหนงกคอ<?php echo $content; ?>

จากตวอยางจะเหนการอางถงตวแปร $content ซงเราไมเคยเหนการประกาศใชงานตวแปรนมากอนเลย ความจรงแลว $content นนเปนพารามเตอร โดยพารามเตอรนจะเกบขอมลทไดมาจากเนอหาของววแลวสงมาใหกบเลยเอาทเพอใหเลยเอาทนำไปแสดงผล Yii มสวนของดฟอลทเลยเอาทคอ main.php (“ตำแหนงเกบอยท protected/views/layouts/”) หากมแฟมนอยในตำแหนงทจดเกบเลยเอาทเมอทำการเรนเดอรวว Yii จะทำการเรยกใชดฟอลดเลยเอาทใหโดยอตโนมต แตอยางไรกตามเราสามารถกำหนดเลยเอาทใหมได โดยอาจจะกำหนดในแฟม Controller.php (“protected/components/Controller.php”) หรอเขยนกำหนดในโคดโปรแกรมไดเชนกน

การกำหนดคาในแฟม Controller.phppublic $layout='//layouts/column1'; // กำหนดใหใชเลยเอาท column1

การเชยนโคดในคอนโทรลเลอรโดยประกาศไวในแอคชนclass SiteController extends CController{... public function actionIndex() {... $this->layout = 'mylayout'; // กำหนดใหใชเลยเอาท mylayout

V.0.5.130815-091110 p.43

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

หรอเชยนโคดในคอนโทรลเลอรโดยประกาศไวในแอคชนโดยกำหนดเปนพรอพเพอรตclass HelloWorldController extends Controller{ public $layout='//layouts/mylayout';

ถาเราลองเปดดทแฟม “protected/components/Controller.php” จะเหนวาคาของเลยเอาทถกกำหนดไวเปน $layout='//layouts/column1' นนกหมายความวา เราไดกำหนดใหใชเลยเอาท column1 เปนเลยเอาทสำหรบแอพพลเคชนของเรา (“protected/views/layouts/column1.php”) หากเราไมกำหนดแลว Yii จะถอวา main เปนดฟอลดเลยเอาท (“protected/views/layouts/main.php”)

ตอนนเราลองมาเปดดทแฟมเลยเอาท column1.php เราจะเหนมการสง $content (ไดอธบายไวกอนหนานแลว) มาใหเลยเอาท column1 , มาถงตรงนแลวเราคงเกดขอสงสยขนมา $this->beginContent() และ $this->endContent() คออะไร? และอกคำถามหนงกคงไมพนคำถามทวาแลววาทำไมถงมตวแปร $contents ทงในแฟม “/protected/views/layouts/main.php” และ “/protected/views/layouts/column1.php” ?

สมมตวามการเรยกใชงานแอคชน index ของคอนโทรลเลอร Helloworld เราจะเหนวาแอคชน index เรยกใชงานวว index

public function actionIndex() { $this->render('index'); //เรยกใชงานวว index

(“protected/views/helloWorld/index.php”)...

ตอนน เราลองเปดดแฟมวว index //วว index <?php $this->breadcrumbs=array( 'Hello World', ) ;?> <title><?php echo CHtml::encode($this->pageTitle); ?></title> <h1><?php echo $this->id . '/' . $this->action->id; ?></h1> <p>You may change the content of this page by modifying the fle

<tt><?php echo __FILE__; ?></tt>.</p> <?php echo Yii::app()->request->baseUrl; ?>เมอมการเรยกใชวว index นแลว กลไกการทำงานของ Yii กจะประมวลผลแฟมวว

V.0.5.130815-091110 p.44

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

index โดยผลลทธของการะประมวลผลนจะถกผานไปเกบยงตวแปร $contents (เปนพารมเตอรสงไปใหเลยเอาท) โดยอตโนมตแลวตวแปลนไปใหกบเลยเอาทเพอทำงานตอ ซงในทนเลยเอาท-ทเรากำหนดไวคอ column1 (ดการกำหนดคาเลยเอาทจากแฟม protected/components/Controller.php) ดงนนตวแปร $contents จะถกสงไปใหเลยเอาท column1 ทำงาน , ตอนนเราลองไปเปดดทแฟมเลยเอาท column1 <?php $this->beginContent('//layouts/main'); ?> <div class="span-19" style='background-color:#c0c0c0;'>

<div id="content"> <?php echo $content; ?>

</div><!-- content --> </div><?php $this->endContent(); ?>เราจะเหนวาภายในแฟมเลยเอาท column1 มการสง “echo $contents” นนกหมายถงใหสงแสดงผลขอมลของตวแปร $contents ซงกคอวว index นนเอง สวนเมธอรด beginContent() และ endContent() นนจะใชคกน วตถประสงคการทำงานของเมธอรดนกเพอสรางพารามเตอร $contents ขนมาใหม และ Yii จะนำสงทอยระหวาง beginContent() และ endContent() มาเกบลงในตวแปร $contens โดยตวแปร $content นจะถกสงตอไปใหเลยเอาท main ทำงาน (“ การสงขอมลไปใหเลยเอาทใดทำงานตอนนใหระบทเมธอรด beginContent เชน beginContent('//layouts/main') ”)

และสดทาย เราลองมาดทเลยเอาท main กจะเหนวาในแฟมนมการสง “echo $contents” , ตวแปร $contents ในแฟมเลยเอาท main น(“protected/views/layouts/main.php”) เปนพารามเตอรทไดรบมาจากเลยเอาท column1

V.0.5.130815-091110 p.45

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

index.php (สงคา $content)-> column1.php (สงคา content)-> main.phpการสรางลงคใน Yiiหวขอนเราจะมาดการสรางลงคเพอเชอมโยงหนาเอกสารตาง ๆ ในเวบไซท แตกอนอนเลยเราจะสรางแอคชนขนมาใหม 2 แอคชนนนกคอ actionPageA() และ actionPageB() ในคอนโทรลเลอร HelloWorld

1. สราง actionPageA() และ actionPageB()

class HelloWorldController extends Controller { public function actionPageA() { $this->render('pageA'); } public function actionPageB() { $this->render('pageB'); }

2. ใหสรางววไวท “protected/views/helloWorld/” แลวตงชอแฟมววเหมอนกนกบชอของแอคชนนนกคอ pageA.php และ pageB.php

3. ใหเพมขอความเขาไปในแฟม pageA.php และ pageB.php

V.0.5.130815-091110 p.46

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ดงน

<h1>View PageA </h1> สำหรบแฟม pageA.php และ<h1>View PageB </h1> สำหรบแฟม pageB.php

4. ทดลองเรยก http://localhost/myblog/index.php?r=helloWorld/pageA และ http://localhost/myblog/index.php?r=helloWorld/pageB

5. ตอนนนใหทำการสรางลงคของระหวางเพจ pageA ไป pageB และ pageB ไป pageA

<a href=”/myblog/index.php?r=helloWorld/pageB”>Goto PageB</a>

ในตอนน การใช <a> กสามารถใชงานไดอยางไมมปญหา แตทวาในอนาคตหากคณไดทำ URL ใหอยในรปแบบของ friendly URL เมอใด การใชแทก <a> จะมปญหาเรองของลงคทนท เชน ลงค http://localhost/myblog/index.php?r=helloWorld/pageA หากเปลยนไปใช URL เปนแบบ friendly URL แลวรปแบบของ URL จะกลายเปน http://localhost/myblog/index.php/helloWorld/pageA

เพอใหเกดความชดเจน เราจะลองกำหนดคาใหเปลยนการเรยกใช URL แบบปกตเปนแบบ FriendlyURL โดยใหเราแกไขแฟมคอนฟกซคอ “protected/confg/main.php” แลวนำเครองหมาย /* … */ ออกจากสวน urlManager

V.0.5.130815-091110 p.47

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

1. /* 2. 'urlManager'=>array(3. 'urlFormat'=>'path',4. 'rules'=>array(5. '<controller:\w+>/<id:\d+>'=>'<controller>/view',6. '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controll

er>/<action>',7. '<controller:\w+>/<action:\w+>'=>'<controller>/<acti

on>',8. ),9. ),10. */

(ใหนำเครองหมายในบนทดท 1 และ 10 ออก)

เสรจแลวใหลองเรยกไปท http://localhost/myblog/index.php?r=helloWorld/pageA อกครงหนง จะพบวา URL นไมนำไปสแอคชน pageA แต

V.0.5.130815-091110 p.48

เทคน คเราสามารถสร างแฟ ม .htaccess ภายใต ร ทโปรเจค(root project)ของเราเพ อท ำำให url สนลงอก โดยการเร ยกใช URL จะไม ต องระบ index.php ใน URL ( http://localhost/myblog/helloWorld/pageA )

ภายในแฟ ม .htaccess บนท กไว ทร ทของโปรเจค ในท น คอ myblog

Options +FollowSymLinks IndexIgnore */* <IfModule mod_rewrite.c>

RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php

</IfModule>

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

กลบนำไปทแอคชน index ของคอนโทรลเลอร site แทน ในตอนนหากจะเรยกใชงานแอคชน pageA ของคอนโทรลเลอร helloWord ตองเปลยนการเรยก URL เปน http://localhost/myblog/index.php/helloWorld/pageA

ทำความรจกกบ Yii CHtml ใน Yii ไดจดเตรยมเครองมอตาง ๆ มาใหเราทำงานไดอยางสะดวกมากมาย รวมถงการจดการสวนของอลเมนทของ html เราจะเรยกตวชวยจดการ html นวา HTML Helper ซงมนกคอคลาส CHtml

ในหวขอกอนหนานเราไดทดลองสรางลงคดวยแทก <a> แลวพบปญหาวา เมอเปลยน URL เปนรปแบบของ friendly URL ลงคทถกสรางดวยแทก <a> จะมปญหา ดงนนในตอนนเราจะใช Html Helper มาชวยทำการสรางลงคแทนโดยเราจะแกไขในแอคชน pageA และ pageB ของคอนโทรลเลอร helloWorld

1. แกแฟม pageA.php และ pageB.php โดยเปลยนสวนของแทก <a> ใหเปน CHtml::link() แทน

V.0.5.130815-091110 p.49

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

แฟม pageA.phpเปลยนจาก<h1>Hello PageA</h1><a href='/myblog/index.php?r=helloWorld/pageB'>Goto pageB</a>เปน<h1>Hello PageA</h1><?php echo CHtml::link('Goto PageB', array('helloWorld/pageB'));?>

แฟม pageB.phpเปลยนจาก<h1>Hello PageB</h1><a href='/myblog/index.php?r=helloWorld/pageA'>Goto pageA</a>เปน<h1>Hello PageB</h1><?php echo CHtml::link('Goto PageA', array('helloWorld/pageA'));?>

2. ใหทดลอเรยกไปท http://localhost/myblog/index.php/helloWorld/pageA

สรปBlah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah Blah blah

V.0.5.130815-091110 p.50

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.51

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

Model [5]มารจก Model ใหมากขนอกนดอยางททราบกนแลววาสวนของโมเดลคอสวนในการจดการขอมลเปนสวนการทำงานของ “Business logic” โดยโมเดลนนเปนอนสแตนทของคลาส CModel หรอ คลาสทใด ๆ สบทอดมาจาก CModel อกทหนง

โมเดลเปนออบเจคของขอมลหนงชดซงอาขจะหมายถงขอมลหนงรายการของตารางขอมล การอางถงฟลดของออบเจคขอมลนนจะอางถงแอททรบวทของโมเดล และแอทรบวทของโมเดลนเราสามารถสรางกฎเกณฑของขอมลไดดวย

Yii มการดำเนนการกบโมเดลแบงเปนสองชนดดวยกนคอฟอรมโมเดล(form model) และแอคทฟเรคอรด (Active records เรยกยอ ๆ วา AR) ทงสองสวนนไดสบทอดมาจากฐานของคลาสเดยวกนนนกคอ CModel

ฟอรมโมเดล นนเปนอนสแตนทของคลาส CFormModel (CFormModel สบทอดมาจาก CModel , http://www.yiiframework.com/doc/api/1.1/CFormModel) หนาทของฟอรมโมเดลนใชในการจดเกบขอมลทรบมาจากชองกรอกขอมลทผใชปอนและจะถกยกเลกเมอใชเสรจ ตวอยางเชน การใชงานหนาลอคอน เราสามารถใชฟอรมโมเดลเพอแสดงฟอรม เปนตน

สวนแอคทฟเรคอรด (Active record , AR) นนเปนดไซดนแพทเทรนซงเปนแนวคดการออกแบบในการตดตอกบฐานขอมลโดยใชวธทางออบเจค ,ออบเจคแอคทฟเรคอรด (AR object) นนเปนอนสแตนทของคลาส CActiveRecord ( CActiveRecord สบทอดมาจาก CModel , http://www.yiiframework.com/doc/api/1.1/CActiveRecord ) ซงเปนตวแทนของชดขอมลหนงแถวของตารางขอมล การอางถงฟลดขอมลจะอางถงพรอพเพอรตของออบเจคแอคทฟเรคอรด (AR object)

V.0.5.130815-091110 p.52

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

“Active Record connects business objects and database tables to create a persistable domain model where logic and data are presented in one wrapping. It‘s an implementation of the object-relational mapping (ORM) pattern by the same name as described by Martin Fowler:” ( http://ar.rubyonrails.org/ )

Yii แอคทฟเรคอรดนน จะชวยจดการกบการกระทำพนฐานทนกพฒนากระทำตอฐานชอมล นนกคอ CRUD (Create , Read , Update และ Delete) โดยทนกพฒนาไมตองยงเกยวกบคำสง SQL และยงชวยลดความสมเสยงทจะถก SQL injection อกดวย แตอยางไรกดในการทำงานกบฐานขอมลนน Yii กยงอนญาตใหใชงานดวยคำสง SQL ในแบบเดมไดเชนกน

ระบบจดการขอมลในแบบออบเจค (DAO , Data Access Objects) ของ Yii นนไดพฒนามาจากระบบจดการของมลแบบออบเจคอนโดงดงของ PHP กคอ PDO (PHP Data Objects) ซง PDO นมขอดอยหลายประการและหนงในนนกคอ มนเปนอสระทจะใชงานบรการของฐานขอมลไดหลากหลายชนด คณสามารถโยกยายการใชงานฐานขอมลหนงไปยงอกระบบฐานขอมลหนงโดยการแกไขโคดของโปรแกรมเพยงบนทดเดยว นนกคอ แกไขเพยงคาของการเชอมตอ (DSN , Data Source Name) เทานน

$connection=new CDbConnection($dsn,$username,$password);

หากตองการเปลยนระบบฐานขอมลเดมทใชอย เชน จาก SQLite ไปเปนการใช MySQLกทำไดโดยเพยงแค เปลยน $dsn เทานน โดยรปแบบของ DSN ตามขอกำหนดของ PDO มดงน (ตวอยางของ DSN บางสวน)

• SQLite: sqlite:/path/to/dbfle • MySQL: mysql:host=localhost;dbname=testdb • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb • SQL Server: mssql:host=localhost;dbname=testdb • Oracle: oci:dbname=//localhost:1521/testdb

คลาส CDbConnection นนสบทอดมาจาก CApplicationComponent ซงคณสามารถกำหนดคาของ DSN โดยการไปสรางแอพพลเคชนคอมโพแนนทซงมนจะทำใหคณสามารถกำหนดคาพรอพเพอรตตาง ๆ ของ CDbConnection ไดโดยงาย แตใน

V.0.5.130815-091110 p.53

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ความจรงแลว Yii กไดสรางสวนการกำหนดคาการเชอมตอ (DSN) ไวแลวในแฟมคอนฟกซของ Yii (protected/confg/main.php)

จดเตรยมฐานขอมลกอนทเราจะใชสวนของโมเดลเขาไปจดการขอมลไดนน เราจำเปนทจะตองมฐานขอมลรอไวกอน ในตอนนเราจะมาสรางฐานขอมล เพอใชเปนตวอยางอยางคราว ๆ ไปกอน โดยเราจะสรางฐานขอมลชอวา yiiblog และภายในนนจะมตารางขอมลสองตารางคอ blog_contents และ blog_user

Schemacreate database yiiblog;

create table blog_contents (con_id int not null auto_increment,con_title varchar(100) ,con_body text ,primary key(con_id)

);

create table blog_user (user_id int not null auto_increment ,user_name varchar(20) not null ,user_pass varchar(20) not null ,primary key(user_id) ,unique key (user_name)

);

เมอฐานขอมลเราพรอมแลวกใหทำการตงคาการเชอมตอของฐานขอมลตามทไดกลาวแลวในขางตน ในตอนนเราจะใชวธการตงคาทแฟมคอนฟกซ main.php (protected/confg/main.php)

V.0.5.130815-091110 p.54

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

1. 'db'=>array(2. 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db', 3. ),4.5. /*6. 'db'=>array(7. 'connectionString' => 'mysql:host=localhost;dbname=testdrive',8. 'emulatePrepare' => true,9. 'username' => 'root',10. 'password' => '',11. 'charset' => 'utf8',12. ),13. */

ใหดำเนการใสเครองหมาย remark ทบนทด 1 ,2 3 และนำเครองหมาย remark ในบนทดท 5 และบนทดท 13 ออก จากนนใหทำการตงคาการเชอมตอ

'connectionString' => 'mysql:host=localhost;dbname=yiiblog','emulatePrepare' => true,'username' => 'user_yiiblog', // ผใชทมสทธในฐานขอมล yiiblog'password' => 'mypassword', // รหสผาน'charset' => 'utf8',

เพยงเทานเรากพรอมแลวสำหรบการเชอมตอสระบบฐานขอมล MySQL นอกจากนเรายงสามารถอางถงการเชอมตอจากสวนใด ๆ กไดภายในแอพพลเคชนรวมไปถงในคอมโพแนนทตาง ๆ ดวยการใชคำสง Yii::app()->db หรอใช Yii::app() อางถงคาคอนฟกซตางของในแฟม main.php ไดเชนเดยวกน

เมอการเชอมตอพรอม ตอมากคอขนตอนการสรางโมเดล , ในขนตอนนเราสามารถใชเครองมอ yiic หรอ gii กไดในการเจนเนอรเรทคลาสโมเดล แตเพอใหสะดวกตอการใขงานเราจะใช Gii

V.0.5.130815-091110 p.55

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การใช gii ในการสราง Modelเราจะใช gii ในการสรางโมเดล โดยใหเรยกไปท url ของเครองมอเจนเนอรเรท http://localhost/myblog/index.php/gii แลวเขาไปทหวขอโมเดลเพอทำกำหนดคา

1. Table Name คอชอของตารางทเราตองการนำมาสรางโมเดล2. Model Class ชอของคลาสโมเดล ซงจะถกเจนเนอรเรทใหเองหลงจากทกรอกชอตารางแลว3. คลกทปม Preview จะแสดงใหทราบวาโมเดลจะถกสรางและเกบไวทใด 4. คลกทปม Generate ทำการสรางคลาสโมเดอ

คลาสโมเดลหนงคลาสถกผกกบตารางหนงตาราง ดงนน หากคณมการปฏบตการกบตารางหลายตารางกจำเปนทจะตองสรางโมเดลเพอผกกบตารางนน ๆ เพยงเทานเรากพรอมทจะทำงานกบโมเดลตอไป

V.0.5.130815-091110 p.56

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ตอนนลองเปดดแฟม “protected/models/BlogContents.php” ซงเปนโมเดลทเราไดสรางขนมาจากเครองมอ Gii โดยในโมเดลทถกสรางขนมานมเมธอรดทสำคญถกสรางขนมาดวยสามเมธอรดดวยกน คอ

เมธอรดทสำคญเมธอรดแรกกคอ rules() สำหรบเมธอรดนทำหนาทกำหนดกฎเกรณการตรวจสอบความถกตองของขอมล โดยกำหนดคาเปนแบบอารเรย ตามรปแบบดงนarray('attribute list', 'validator name', 'on'=>'scenario name', ...validation parameters...)ดรายละเอยด Validator ไดท http://www.yiiframework.com/doc/api/1.1/CValidator ,http://www.yiiframework.com/wiki/56/

ตวอยางเชนarray('con_title , con_body ', 'required'),จากตวอยางนเปนการกำหนดวา ใหแอททรบวท con_title , con_body คาไมสามารถเปน Null หรอ Empty ได

เมธอรดตอมาคอ relations() เปนเมธอรดทใชระบความสมพนธระหวางโมเดล โดยมรปแบบการดงนน'varName'=>array('relationType', 'className', 'foreign_key', ...additional options)ดรายละเอยดเพมเตม http://www.yiiframework.com/doc/api/1.1/CActiveRecord#relations-detail

และสดทายคอเมธอรด atributeLabels() , เมธอรดนจะสงกลบคาปายกำกบชอของแอททรบวท public function attributeLabels()

{return array(

'con_id' => 'Content ID','con_title' => 'Content Title','con_body' => 'Content Body',

);}

V.0.5.130815-091110 p.57

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากตวอยางขางตน หากเรามการอางถง con_id กจะไดคา Content ID ตวอยางเขน

$model = new BlogContents;$from = new CActiveForm;echo $from->labelEx($model,'con_id')

สรปxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxxx xxxxxxxx xxxxxxx x xxxxxxxxxxx xxxxxxx xxxx x xxxx xxxxxxxx xx xxxxxxxxxxxx xxxxxxx xxxxxx xx xxxxxxx xxxxxxx xxxxxxxxx xxxxxxxxx

V.0.5.130815-091110 p.58

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.59

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

CRUD [6]นำเขา ,ลบ ,ปรบปรง ,คนหาขอมลแสนงายจากหวขอทไดกลาวผานมาแลวในตอนกอนหนาน กทำใหเราพอเขาใจหลการทำงานพนฐานของ Yii Application ไดพอประมาณ ซงเพยงพอทเราจะไปกนตอในหวขอการสรางฟอรม นำเขา ลบ ปรบปรง แสดงและคนหาซงเปนเรองงาย ๆ ใน Yii

ในบทนเรายงคงยงใชโปรเจค myblog ในการดำเนนการทดอสอบกนอย เพราะโปรเจค myblog น เราไดทำการสรางฐานขอมลและตงคาการเชอมตอรวมถงสรางคลาสโมเดลไวเปนทเรยบรอยแลวในบทกอนหนาน

CURD อาน เพม ลบ งาย โดยไมตองออกแรงในการการสราง CRUD นน เราคงตองหนกลบมาขอความชวยเหลอจากเครองมอ Gii อกครงโดยเขาไปท http://localhost/myblog/index.php?r=gii (หรอหากไดแกไขคาคอนฟกซตามตวอยางในตอนท 4 แลว ตองเรยกใขงานผาน url http://localhost/myblog/index.php/gii) ทำการลอกอนเขาไปในระบบ แลวเลอกทหวขอ Crud Generator

V.0.5.130815-091110 p.60

(รป 6.1)

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

หลงจากนนใหใสชอของคลาสโมเดลทเราตองการนำมาสราง CRUD ( เราไดสรางคลาสโมเดล BlogContents ไวแลวในตอนท 4 ) จากนนใหใสชอคอนโทรลเลอรทเราตองการสรางขนมาใหมเพอเปนคอนโทรลเลอรทไวเรยกใชงานฟอรมตาง ๆ ของ CRUD

เมอทำการเจนเนอรเรท CRUD เสรจเรยบรอยแลว (อยาลมกดปม Generate) ใหลองเรยกไปท URL“http://locahost/myblog/index.php/BlogContents” จะไดผลลพธตามรป ซงจะแสดงผลการเรยกใชงานคอนโทรลเลอร BlogContents แตไมมขอมลจากตาราง“blog_contents” เนองจากตารางนเปนตารางทยงไมมขอมลจงใหลองนำเขาขอมลเองกอนสก 2-3 รายการ แลวลองรเฟรชหนาเอกสารดใหมอกครง

V.0.5.130815-091110 p.61

(รป 6.2)

(รป 6.3)

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เมอไดทำการสงขอมลลงไปในตาราง “blog_contents” แลวทำการรเฟรชคอนโทรลเลอร BlogContents อกครง จะไดผลลพธออกมาตามรปขางลางน

ระบบจดการขอมลพนฐานหลงจากทเราไดสราง CRUD เสรจเรยบรอยแลว จะเหนวาเครองมอ Gii ไดสรางสวนของการนำเขา , ปรบปรง , แกไข , คนหาและแสดงผลใหเปนทเรยบรอย พรอมทงไดกำหนดสทธในการเขาถงระบบหลงบานไวใหแลวสวนหนง (ระบบ Auth. จะพดถงในตอนตอ ๆ ไป) ดงทเราเหนไดจากเมนทางดานขวามอของคอนโทรลเลอร BlogContents , ใหเราลองทดสอบเขาไปทหวหว“Create Blogcontents”

V.0.5.130815-091110 p.62

(รป 6.4)

(รป 6.5) เมนระบบจดการขอมล

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เมอเขาไปสหวขอ “Create BlogContents” แลวคณจะพบกบระบบพสจนสทธ ซงในทนมผใชทถกจำลองการใชงานมาให 2 บญช คอ ผใช “demo” รหสผาน “demo” และ ผใช “admin” รหสผาน “admin”

ในตอนนใหเขาระบบดวยผใช “admin” และรหสผาน “admin”

V.0.5.130815-091110 p.63

(รป 6.6) ระบบพสจนสทธ

(รป 6.7) หนาจอการนำเขาขอมล (Create)

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เมอไดนำเขาขอมลผานหนาจอการนำเขาแลว จะเหนวา Yii ไดทำการสงตอการทำงาน(redirect) ไปยงหนารายละเอยดของขอมลรายการทำเรานำเขา และอกทง Yii ไดสรางเมนในการจดการขอมลมาใหเปนทเรยบรอย(ทางดานขวามอ) ดงนนคณจะสามารถดำนนการ ปรบปรง , แกไข , นำเขา ไดโดยงาย และทงหมดนแหละคอสงทไดมาจากการสราง CRUD

จากขางตน เราลองกลบไปพจารณาท URL จะเหน URL .ในรปแบบดงน

แตหากไมไดเปดใชงานในรปแบบของ FriendlyURL แลว จะตองเรยกเตมรปแบบ คอ

ทงน URL ในรปแบบของ FriendlyURL นน เราสามารถสรางกฎ (rules) ขนไดซงจะกลาวถงในคราวตอ ๆ ไป

V.0.5.130815-091110 p.64

(รป 6.8) หนาจอรายละเอยดขอมล

(รป 6.9) URL ทระบการเรยกขอมทม con_id เทากบ 4 ในแบบ FriendlyURL

(รป 6.10)URL ทระบการเรยกขอมทม con_id เทากบ 4 ในแบบปกต

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การเปลยนปายชอกำกบฟลด (label)มาถงตรงนบางคนกำลงนกสงสยวา แลวสวนของ label ทแสดงเปนปายกำกบไวในแตละชองกรอกขอมลนนจะแกไขไดไหมและอยางไร? คำตอบงาย ๆ คอ ได โดยใหไปแกทโมเดล ในทนกคอ คลาสโมเดล BlogContents ( protected/models/BlogContents.php ) แลวใหแกไขทเมธอรด attributeLabels() โดยใหไปแกไขในคาของอารเรย

การกำหนดกฎของชองกรอกขอมลการสรางฟอรมกรอกขอมลททำงานรวมกบ AR เราสามารถกำหนดกฎในการปอนขอมลใหกบของกรอกขอมลของแตละฟลดได โดยกำหนดเปนคาของอารเรยในเมธอรด rules() ของคลาสโมเดล

(ดเพมเตม http://www.yiiframework.com/doc/api/1.1/CModel#rules-detail)

V.0.5.130815-091110 p.65

(รป 6.11) เมธอรด attributeLabels()

(รป 6.12) เมธอรด rules() ใชกำหนดกฎการปอนขอมล

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เมธอรด rules() จะรเทรนคากลบออกมาเปนอารเรยของ rules โดยรปแบบทวไปในการกำหนดกฏ มรปแบบดงน

Array('Attribute List', 'Validator', 'on'=>'Scenario List', ...additional options);

• Attribute list คอ รายการของฟลด(class property) ทตองการตรวจสอบกฏเกณฑ โดยรายการฟลดเหลานจะถกคนดวยเครองหมายลกนำ(comma)

• Validator คอสวนการระบชนดของกฎเกณฑทตองการตรวจสอบ• on คอพารามเตอรทใชระบชอรายการของเหตการณทตองการใหกฏเกณฑตรวจสอบ• Additional สวนเพมเตมอน ๆ

หากถาไมมการกำหนดกฎเกณฑใด ๆ จะถอวาใหทำงานในทก ๆ เหตการณเมอมการเรยกเมธอรด save() และสดทายชดของสวนเพมเตมอน ๆ จะเรมตนตรวจสอบความถกตองของพรอพเพอรต

Validator อาจจะเปนไดทงเมธอรดในคลาส หรอจะแยกเปนคลาส Validator กได หากผใชไดประกาศเปนเมธอรดของคลาสโมเดลจะตองใชรปแบบดงน

/** * @param string the name of the attribute to be validated * @param array options specifed in the validation rule */

public function ValidatorName($attribute,$params) { ... }

หากผใชแยกคลาส Validator ออกมาประกาศ จะตองประกาศสวน extend มาจากคลาส CValidator แตในความจรงแลวการประกาศ Validator นนสามารถทำได 3 รปแบบคอ

1. ระบไวในคลาส2. ระบแยกออกมาเปนคลาส Validator ใหม (extend มาจาก CValidator)3. ประกาศ Validator โดยจดเตรยมเปน alias ของคลาส Validator ซงมอยแลวใน Yii

V.0.5.130815-091110 p.66

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

Yii ไดประกาศคลาสทเปน Validator คลาสมาใหผจำนวนหนงแลว เพอใหผใชสามารถเรยกใชงาน Validator เหลานในสวนของ rules ไดทนท โดยรายชอของ Validator คลาสท Yii เตรยมมาใหแลวนนมดงน

• boolean• captcha• compare• email• default• exist• fle • flter• in• length• match• numerical• required• type• unique• url

การใชงาน Validator ตาง ๆ เชนarray('create_user_id, update_user_id', 'numerical','integerO nly'=>true)

array('name', 'length', 'max'=>128)

array('create_time, update_time', 'safe')

array('id, name, description, create_time, create_user_id', 'safe', 'on'=>'search')

V.0.5.130815-091110 p.67

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

array('name', 'required') ตวอยาง เชน หากตองการใหชองกรอกขอมล con_title (เรอง), con_body (เนอหา) หามวาง กใหกำหนดคา 'required' สำหรบชองกรอกขอมลทหามวาง เชน

เมอไดกำหนดกฎของชองกรอกขอมล con_title และ con_body หามวางแลว ใหลองกลบไปนำขอมลใหมอกหนงรายการ โดยไมตองปอนขอมลลงในชอง con_title , con_body จะพบวา โปรแกรมแจงขอผดพลาดดวยสาเหตทชองกรอกขอมลนนวาง

V.0.5.130815-091110 p.68

(รป 6.13) การกำหนดกฎชองกรอกขอมลแบบหามวาง

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จดการกบสวน admin ใหดขน(อกนด)

อยางทไดกลาวไปแลวในขางตนวา Yii ไดเตรยมระบบพสจนสทธมาใหแลวอยางคราว ๆ เมอเราสราง CRUD โดยใชเครองมอ Gii , เครองมอไดจดการสทธในการเขาถงสวนงาน admin ไวใหแลว เชน การนำเขา , ปรบปรง และแกไขขอมล Yii ไดเตรยมบญชผใชมาใหสองบญชคอ demo และ admin และผใชท Yii จดเตรยมมาใหในตอนนถกจดเกบไวท "protected/components/UserIdentify.php" ซงมนคงดไมปลอดภยและไมยดหยนมากนก ดงนนในตอนนเราจะทำระบบพสจนสทธใหดขนโดยการดงขอมลจากตารางขอมล blog_user ในฐานขอมลทเราสรางไว(ในตอนท 5) และแนนอนวาเราตองสรางคลาสโมเดลเพอเปนตวแทนของตาราง blog_user (หวงวาคงยงไมลมวธการสรางโมเดล) และเมอสรางคลาสโมเดลของตาราง blog_user โดยใหตงชอคลาสโมเดลวา “BlogUser” และเมอสรางคลาสโมเดลเสรจเรยบรอยแลวกใหทำการสราง CRUD ของคลาสโมเดล BlogUser เพอใชเปนระบบจดการผใช จากนนใหเรยกไปทคอนโทรลเลอร BlogUser (“http://localhost/myblog/index.php?r=blogUser”) แลวใหทำการนำเขาขอมลผใชหนงรายการ “ผใช admin / รหสผาน passwd ” เมอทกอยางเรยบรอยเราจะทำการปรบระบบพสจนสทธใหไปดงขอมลจากตารางขอมล กอนทจะไปกนตอ เรามาดการทำงานของระบบพสจนสทธท Yii ไดจดเตรยมมาใหสกนดเพอจะไดเขาใจขน

V.0.5.130815-091110 p.69

(รป 6.14) โปรแกรมแจงขอผดพลาดจากสาเหตชองกรอกขอมลวาง

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ตอนและหลกการทำงาน และนำไปประยกตและปรบปรงระบบพสจนสทธใหดขนตอไป

ขนตอนทำงาน1. คอนโทรลเลอรสรางอนสแตนท ของ

model2. เรนเดอรววพรอมสงอนสแตนทโมเดลไป

ดวย3. ประมวลผลวว และรอรบขอมลผใชผานชอง

รบขอมล4. สงขอมล username ,password กลบมา

ใหคอนโทรลเลอ5. รบขอมลจากฟอรมและตรวจสอบเงอนไข

การทำงาน6. สงขอมลไปคนหาในโมเดล7. โมเดลทำการคนหาขอมล 8. ถาคนหาขอมลเจอจะทำการสราง SESSION

และสงกลบคา TRUE ไปใหคอนโทรลเลอร9. ถาคาทสงกลบเปน TRUE จะทำการสงตอ

การทำงานไปยงหนาอน

V.0.5.130815-091110 p.70

(รป 6.15) ภาพลำดบการทำงานระบบพสจนสทธแบบพนฐาน

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากขนตอนการทำงานจะเหนวา การทำงานของระบบลอคอนนนจะมการเรยกใชงานเมธอรด actionLogin() ของคลาส SiteController , กลไกภายใน actionLoing() นนกไมไดมอะไรซบซอนมากนก ซงดไดจากโคด

ในโคดบนทดท 4 (รป 6.16) ทำการสรางอนสแตนทของคลาส LoginForm (ฟอรมโมเดล) ซงในตอนนจะยงไมมการควรขอมล และในตอนนตวแปร $model จะสามารถอางถงพรอพเพอรตและเมธอรดของ LoginForm ได

ในบนทดท 7 ถง 20 ทำการตรวจสอบวามขอมลสงมาจากฟอรมของหนาลอคอนหรอไม ในกรณทไมมขอมลสงมาจากฟอรม หรอ ถามสงมาแตชอผใชและรหสผานไมถกตองจะวงลงมาถงบนทดท 22 คอการสงเรนเดอรหนาวว login โดยสงตวแปร $model ไปดวยเพอจะไดนำขอมลพรอพเพอรตของ $model ไปสรางชองกรอกขอมลของวว login (“protected/views/site/login.php”)

V.0.5.130815-091110 p.71

(รป 6.16) เมธอรด actionLogin ของ SiteController คอนโทรลเลอร

(รป 6.17) คลาส LoginForm

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

หากเราเขาไปดในแฟมวว login จะเหนถงการสรางฟอรมกรอกขอมล โดยการสรางฟอรมกรอกขอมลของ Yii น สามารถใขคลาส CActiveForm มาเปนตวชวยในการสรางฟอรม HTML , คลาส CActiveForm นไดจดเตรยมเมธอรดทจำเปนตอการทำงานซงจะชวยลดความซบซอนจากการสรางฟอรมทมการโตตอบกบผใชอยางเชน AJAX

โคดในรปท 6.18 มการเรยกใชงานคลาส CAtiveForm ผานทางเมธอรด beginWidget , เมธอรด beginWidget นใชเพอสรางวดเจทเชนเดยวกนกบเมธอรด widget() มขอแตกตางกนอยางเดยวคอ widget() จะทำการสรางและสงใหวทเจททำงานเลย ในขณะท beginWidget จะเปนสวนการสราง ในสวนของการสงใหวทเจททำงานนนจะใชคำสง endWidget() ดงนนคำสง beginWidget จงตองใชงานรวมกนกบendWidget()

รปแบบการ beginWidget()

public CWidget beginWidget(string $className, array $properties=array ( ))

$className ชอวดเจด or ชอคลาส ใชเครองหมายจดเปนตวคน (เชน. application.widgets.MyWidget)

$properties การกำหนดคาของพรอดเพอรตโดยกำหนดในรปแบบของอารเรย (Property Name => Property Value)

{return} คลาส CWidget

V.0.5.130815-091110 p.72

. . . . . .

(รป 6.18) วว login (login.php)

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เมอวว login ไดเรนเดอรและแสดงผลหนาเพจแลว ววกจะรอรบขอมลจากผใชทจะกรอกทางชองกรอกขอมล เมอผใชกรอกขอมลชอผใชและรหสผานและทำการสงขอมล ขอมลนจะถกสงกลบมาทแอคชน loginAction ของคอนโทรลเลอร siteController (“r=site/login”) จากนนจะนำขอมลทไดรบมาจากวว login มาตรวจสอบความถกตองของขอมลซงตองเปนไปตามกฎทกำหนดไวในเมธอรด rules() ของฟอรมโมเดล loginForm ในบนทดท 7 ,14 ,18 ตามโคดรปท 6.16 , หากขอมลทกอยางถกตองกจะทำการสราง session และ redirect ไปยงหนาเวบเพจอนเพอทำงานตอไป

หลงจากทไดรขนตอนการทำงานของระบบพสจนสทธแลว ในตอนนเราจะมาปรบโคดเพอใหระบบไปดงขอมลผใชจากตารางขอมลแทน โดยเราตองเขาไปแกไขในแฟม “protectected/components/UserIdentity.php” ใหมโคดดงน

V.0.5.130815-091110 p.73

รปท (6.19) คลาส UserIdentify

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

รปท 6.19 จะเหนเมธอรด authenticate ของคลาส UserIdentify เปนเมธอรดทใชในการพสจนสทธของผใชวาเปนผใชในระบบจรงหรอไม ( จะถกเรยกใชงานจากโมเดล LoginForm ) โดยการสงขอมลผใชและรหสผานไปคนหาผานเมธอรด “model()->fndByAttributes” ของคลาสโมเดล BlogUser (โคดบนทด 14) จากนนในโคดบนทดท 15 กจะทำการตรวจสอบวาพบผใชในระบบหรอไม ถาไมพบกใหกำหนดพรอบเพอรต errorCode = self::ERROR_USERNAME_INVALID แตถาพบผใชและรหสผานถกตอง(บนทดท 20) จะกำหนดพรอบเพอรต “errorCode = self::ERROR_NONE” แลวจงสงคา errorCode กลบออกไป

หลายคนคงสงสยวาคา ERROR_NONE , ERROR_USERNAME_INVALID , ERROR_PASSWORD_INVALID นนมาจากไหน? คำตอบกคอ คาคงทนถกกำหนดมาจากคลาส CBaseUserIdentity (คลาส CUserIdentify สบทอดมาจาก CBaseUserIdentify)

จากทไดกลาวมาจากขางตนทงหมด กทำใหเราสรางสวนการนำเขา ปรงปรบ ลบ และคนหารวมทง ระบบพสจนสทธไดอยางงายดาย และหากเราจะปรบปรงระบบพสจนสทธใหดขนกวานกสามารถดำเนนการไดโดยไมยาก หรออาจจะหาสวนชยาย (extension) มาใชงานกไดเชนกน

V.0.5.130815-091110 p.74

(รปท 6.20)

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

สรปxxxxx xxxxxxxxx xxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxx xxxxxxxx xxxxx

V.0.5.130815-091110 p.75

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.76

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การทำงานกบฟอรม [7]สวนการบนทกขอมลของผใชงานผานทางฟอรมของ HTML นนเปนอกงานหลกงานหนงทสำคญสำหรบนกพฒนาเวบแอพพลเคชน นอกจากนแลวนกพฒนายงตองออกแบบชองกรอกขอมลใหเหมาะสมกบลกษณะของขอมล รวมทงยงตองตรวจสอบความถกตองของขอมลททำการบนทกอกดวย ซงงานเหลาน Yii ทำไดดและงายมากดวยสถาปตยกรรมการออกแบบของ MVC

ขนตอนทวไปสำหรบการทำงานกบฟอรมของ Yii1. สรางคลาส model เพอตอบสนองการทำงานรวมกนกบขอมลในตาราง2. สรางคลาส เพอตอบสนองการทำงานรวมกนกบขอมลในตาราง3. สรางฟอรมในสวนแฟมววเพอสรางความสมพนธกบคอนโทรลแอคชน

ซงจะกลาวถงรายละเอยดของขนตอนเหลานตอไป

การสรางโมเดล (Creating Model)ในสวนการสรางสรางโมเดลเพอใชงานเกยวกบฟอรมน มหวขอทตองกลาวถง คอ

1. การกำหนดคลาสโมเดล2. การสรางกฏในการตรวจสอบขอมล3. การรกษาความปลอดภยกบขอมลทรบเขา4. การตรวจสอบความถกตองของขอมล5. การแสดงขอผดพลาดเมอตรวจเจอขอผดพลาด6. ปายกำกบชองนำเชาขอมล

กอนทจะเขยนฟอรม HTML นกพฒนาตองคาดการถงชนดขอมลทผใชจะกรอกลงในชองกรอกขอมลกอนวา ชองกรอกขอมลใดจะตองมกฏเกณฑในการกรอกขอมลและการตรวจสอบขอมลแบบใด เพราะในคลาสโมเดลนนศนยกลางทสามารถสรางกฎเกณฑในการตรวจสอบการนำเขาขอมลเหลานได

V.0.5.130815-091110 p.77

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ทงนการสรางคลาสโมเดลนสามารถสรางไดสองแบบ คอ ถาเปนฟอรมแบบไมมการบนทกขอมลลงฐานขอมล ควรใชแบบ “form model” หรอถาเปนฟอรมแบบทมการบนทกขอมลลงฐานขอมล ควรใชแบบ “active record” และโมเดลทงสองแบบนมรากฐานมาจากคลาส CModel

การกำหนดคลาสโมเดลหากตองการสรางลอกอนฟอรม ซงฟอรมในลกษณะนเปนฟอรมแบบทไมมการบนทกขอมลลงในฐานขอมล ดงนนจงสรางโมเดลในแบบของ “form model”

คลาสโมเดล LoginForm

ในคลาส LoinForm ไดการประกาศแอททรบวทของคลาสไวสามตวคอ $username , $passwrod , $rememberMe ซงจะใหในการเกบคาชอผใช , รหสผาน และการจดจำคาการลอกอน

การสรางกฏในการตรวจสอบขอมลสงหนงเมอผใชไดทำการยนยนการสงขอทมแลว ระบบจะตองทำการตรวจสอบขอมลเหลานนวาครบถวนและถกตองตามขอกำหนดชองการนำเขาขอมลหรอไมกอนทจะนำขอมลเหลานนไปนำเขาในระบบฐานขอมล ซง Yii ไดจดเตรยมกลไกการทำงานเหลานไวแลว โดยทนกพฒนาสามารถสรางกฎเกณฑการตรวจสอบขอมลเหลานไดในเมธอรด rules() โดยทเมธอรดนจะสงคากลบออกมาเปน array

V.0.5.130815-091110 p.78

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากโดดขางตน จะเหนวาคลาสโมเดล LoginForm นนสบทอดมาจาก CFormModel (CFormModel สบทอดมาจากคลาส CModel เชนเดยวกนกบคลาสโมเดล CActiveRecord) ซงในเมธอรด rules() ไดกำหนดคา username , password ใหจำเปนตองกรอกขอมล (required) และ password ยงถกกำหนดใหเปนแบบ authenticate และในสวนของ rememberMe เปบแบบ boolean

รปแบบการกำหนด กฎของเมธอรด rules() มรปแบบดงตอไปน

AttributeList เปนชดของชอชองกรอกชอมล (Attribute name) ทตองการใหตรวจสอบกฎ Validator คอชนดของกฎทตองการตรวจสอบ และสวนของ on คอคา

V.0.5.130815-091110 p.79

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

พารามเตอรซงเปนตวเลอกพเศษของสถานะการในแบบตาง ๆ (ใน v.1.1.11 สามารถใช except หรอ on ) เชน update, create เชน

สำหรบการกำหนด Validator นน สามารถทำไดอยสามแบบดวยกนคอ

1. Validator อาจเปนชอของเมธอรดทอยภายในโมเดลนน เชนเดยวกนกบ authenticate ในตวอยางโดยการสรางเมธอรดแบบ validator นนจะตองกำหนดอยในรปแบบดงน

2. Validator สามารถเปนคลาสชอของคลาส Validator ได โดยทคลาส validator นจะตองสบทอดมาจากคลาส CValidator , หากใช varidator ในรปแบบน จะตองเรยกผานอนสแตนทของคลาส validator และสวนการผานคาตวเลอกสำหรบคลาส validator นกคอการผานคาไปใหแอททรบวทของอนสแตนทนน ๆ

3. Validator อาจจะเปนชอแทน(alia)ของคลาส Validator ท Yii ไดเตรยมไวใหแลว เชน required เปนชอแทน(alias)ของคลาส CRequiredValidator โดย Yii ไดเตรยม Validator เหลานไวแลวดงน

• boolean: alias of CBooleanValidator, ensuring the attribute has a value that is eitherCBooleanValidator::trueValue or CBooleanValidator::falseValue.

• captcha: alias of CCaptchaValidator, ensuring the attribute is equal to the verifcation code displayed in a CAPTCHA.

• compare: alias of CCompareValidator, ensuring the attribute is equal to another attribute or constant.

• email: alias of CEmailValidator, ensuring the attribute is a valid email address.• date: alias of CDateValidator, ensuring the attribute represents a valid date, time,

or datetime value.• default: alias of CDefaultValueValidator, assigning a default value to the

V.0.5.130815-091110 p.80

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

specifed attributes.• exist: alias of CExistValidator, ensuring the attribute value can be found in the

specifed table column.• fle: alias of CFileValidator, ensuring the attribute contains the name of an

uploaded fle.• flter: alias of CFilterValidator, transforming the attribute with a flter.• in: alias of CRangeValidator, ensuring the data is among a pre-specifed list of

values.• length: alias of CStringValidator, ensuring the length of the data is within certain

range.• match: alias of CRegularExpressionValidator, ensuring the data matches a regular

expression.• numerical: alias of CNumberValidator, ensuring the data is a valid number.• required: alias of CRequiredValidator, ensuring the attribute is not empty.• type: alias of CTypeValidator, ensuring the attribute is of specifc data type.• unique: alias of CUniqueValidator, ensuring the data is unique in a database

table column.• url: alias of CUrlValidator, ensuring the data is a valid URL.

สำหรบตวอยางการใชงานชอแทน(alias)ของคลาส Validator เหลาน เชน

V.0.5.130815-091110 p.81

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ความปลอดภยในการกำหนดคาของแอททรบวทหลงจากทไดสรางอนสแตนทของคลาสโมเดลแลว บอยครงทเราจำเปนทจะตองรบขอมลภายนอกจากผใช เพอสงคาขอมลเหลานนไปใหกบแอททรบวทของอนสแตนทคลาสโมเดล เพอความสะดวกแลวเราอาจนำเขาขอมลทงหมดจากฟอรม(เรยกวธนวา massive assignment) ซงเราอาจจะใชรปแบบการนำเขา ดงนคอ

วธแบบ massive assignment นจะทำการนำเขาขอมลทงหมดจาก $_POST['LoginForm'] ไปยงแอททรบวทของโมเดลทมความสมพนธกนอย หรอเราอาจจะใชการนำเขาในลกษณะอน เชน

ซงการเขยนโคดในลกษณะนกจะคลายกนกบแบบ “massive assignment”

การประกาศคาแอททรบวทอยางปลอดภยการสงคาใหกบแอททรบวทจะปลอดภยได หากถามนไดถกกำหนดกฎเกณฑในการตรวจสอบขอมลไวแลว ดวอยางเชน

จากโคดทางดานบน เปนการกำหนดใหแอททรบวท username , password จำเปนทจะตองกรอกขอมลในสถานการณ(scenario) login และ email , username , password จำเปนตองกรอกขอมลในสถานการณ register

V.0.5.130815-091110 p.82

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

แตในบางครง หากเราตองการทจะรบใหแอททรบวทบางตวเปนแอททรบวททปลอดภย(safe) ซงหมายความวาไมตองการระบกฎเกณฑในการตรวจสอบใด ๆ ใหกบแอททรบวทนน เนองจากวาแอททรบวทนไมมรปแบบและไมจำเปนตองตรวจสอบใด ๆ ตวอยางเชน content ซงเปนแอททรบวทเกบตวบทความ การกรอกขอมลเปนอสระไรขอกำหนดและรปแบบ เราสามารถทจะใช safe ซงเปนกฎพเศษ เชน

และยงมกฎการตรวจสอบพเศษอกตวหนงคอ unsafe ซงใชประกาศใชกบแอททรบวททไมมความปลอดภย ซงกฎนไมคอยไดใชงานเทาใดนก

สำหรบการใชงานกฎ unsafe นนจำเปนทจะตองระบคาใหสอดคลองกบแอททรบวทโดยคานนตองเปนการสงแบบ “individual assignment”(การสงแบบรายตว) ไมใชแบบ “massive assignment”(การสงแบบเปนกอน array) ตวอยางเชน

V.0.5.130815-091110 p.83

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การเรยกใชงานกลไกการตรวจสอบขอมลทผใชสงมาใหกบโมเดลนน เราสามารถตรวจสอบความถกตองของขอมลใหเปนไปตามกฎทไดตงเอาไวโดยเรยกใช CModel::validate() โดยทเมธอรดนจะคนคากลบมาวาทำสำเรจหรอไม สำหรบกรณทโมเดลเปนแบบ CActiveRecord การตรวจสอบกฎจะเกดขนโดยอตโนมตเมอเรยกใชงานเมธอรด CActiveRecord::save()

การตวจสอบขอมล(Validation) นนขนอยกบ scenario ทไดกำหนดเอาไวในกฎการตรวจสอบขอมล(Validation rules) ตวอยางเชน สถานการณ(scenario) login จะทำการตวจสอบขอมลของแอททรบวท username และ password เทานน ในขณะท สถานการณ(scenario) register อาจจะทำการตรวจสอบแอททรบวททมากกวานน เชนemail , address เปนตน

ตวอยางตอไปนเปนการตรวจสอบขอมลภายใตสถานการณ(scenario) register

สำหรบการกำหนดกฎเกณฑในการตรวจสอบขอมลวาแอททรบวทใดใหถกตรวจสอบภายใตสถานการณแบบไหนนน ใหระบผานตวเลอก(option) on ซงหากถาไมมการกำหนดตวเลอก on นนจะหมายความวาจะถกตรวจสอบในทก ๆ สถานการณ เชน

V.0.5.130815-091110 p.84

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การเรยกดขอผดพลาดจากการตรวจสอบขอมลหลงจากทไดทำการตรวจสอบแลว มความเปนไปไดวาจะเกดขอผดพลาดในการจดเกบขอมลลงในโมเดล(ขอมลทนำเขาผดกฎ) ซงเราสามารถเรยกดขอผดพลาดเหลานนไดโดยเรยกใช CModel::getErrors() และ CModel::getError() ซงทงสองเมธอรดนมความแตกตางกนคอ เมธอรด CModel::getErrors() นนจะสงคา(return)ขอผดพลาดทกแอททรบวทของโมเดลกลบคนมา ในขณะท CModel::getError() จะสงคาของขอผดพลาดตวแรกกลบมาเทานน

ปายกำกบชองกรอกขอมลบอยครงทเมอเราทำงานกบฟอรมแลวจำเปนทจะตองแสดงปายกำกบของชองกรอกขอมลตาง ๆ(label) เพอบอกใหผใชไดทราบวาจะตองกรอกขอมลอะไรลงในชองกรอกขอมลนนๆ ซงเรามกจะฝงขอความของปายกำกบลงไปตรง ๆ ในววเลยกได(แบบ hardcode)

โดยปกต CModel จะสามารถสงคาของชอแอททรบวทกลบมาเพอนำมาใชเปนชอปายกำกบได ซงเราสามารถทจะโอเวอรไรด(Overriding)เมธอรด attributeLabels() แลวกำหนดชอความปายกำกบใหมได

V.0.5.130815-091110 p.85

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสราง Actionการทำงานกบโมเดล(MODEL)ใน MVC นนสามารถทจะตดตอกบโมเดลจากสวนใด ๆ กไดไมวาจะเปนวว(VIEW) หรอคอนโทลเลอร(C0NTROLLER) ตวอยางเชน สวนของการลอคอนทจะตองมการดำเนนการบางอยางกบโมเดล ซงเราอาจวางการดำเนนการนนในสวนแอคชน(Action) ของคอนโทลเลอร เชน

จากตวอยางขางตนน เราไดสรางอนสแตนทชอวา $model ซงเปนอนสแสตนทของคลาส LoginForm ซงเปนคลาสโมเดล หากฟอรมลอคอนมการสงขอมลดวยวธการแบบPOST (Method POST) เราจะทำการรบคาขอขอมลจากฟอรมผานทางตวแปร $_POST['LoginForm'] เพอผานขอมลเหลานไปยง $model ในแบบ massive assignment (สงขอมลแบบเปนกอน array) จากนนจงทำการตรวจสอบกฎและหากถาไมมขอผดพลาดใด ๆเกดขนกจะทำการสงตอการทำงาน(Redirect)ไปยงหนาเอกสารกอนหนาน แตถาเกดขอผดพลาดขน กจะทำการเรนเดอรหนาวว login

การสราง FormYii ไดเครยมคลาสเพอใหงายตอการจดการกบฟอรม ตวอยางเชน การสรางชองกรอกขอมลประเภทขอความ เราอาจจะใชคลาส CHtml::textField() , หรอสรางชองกรอกขอมลประเภท Drop-down list อาจจะเรยกใชคลาส CHtml::dropDownList()

จากน เราจะใช CHtml ในการสราง login ฟอรมโดยมตวแปร $model เปนตวแปรทสงมาจากแอคชนทเรยกใชววน

V.0.5.130815-091110 p.86

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ซงหากทดสอบเรยกใชงานฟอรมน กจะไดรปแบบการแสดงผลดงน

V.0.5.130815-091110 p.87

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

และหากทดลองกรอกขอมลโดยใหเกดขอผดพลาดจากการตรวจสอบกฎ กจะแสดงขอผดพราดใหเหนดงรปขางลางน

สำหรบ Yii เวอรขน 1.1.1 เปนตนมาไดเพมวดเจต(wedget) ใหมขนมาเพอจดการเกยวกบฟอรมใหงายขนอกตวหนงคอ CActiveForm โดยมลกษณะการทำงานคลายคลงกนกบ CHtml

(มตอ)

V.0.5.130815-091110 p.88

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การใชงาน Form Builderเมอสรางฟอรม HTML บอยครงทเราตองตองเขยนมนซำ ๆ และเปนการยากทจะนำมนกลบใชไดอกในโปรเจคตาง ๆ เชน ตองการใหชองกรอกขอมลทกชองมปายกำกบและสวนการแจงเตอนขอผดพลาด ซงเหลานเราสามารถทจะนำคณสมบต Form Builder มาชวยปรบปรงการเขยนโคดใหดขนได

แนวคดพนฐานคณสมบต “Form Builder” ใน Yii นนคอการใชงานออบเจคของคลาส CForm เพอสราง HTML ฟอรม ซงรวมถงการกำหนดรปแบบของขอมลตามชนดของขอมล, นกพฒนาตองสรางและกำหนดคณสมบตใหกบออบเจคของ CForm และจงเรยกใชเมอตองการแสดงผล

ชองกรอกขอมลชนดตาง ๆ ของฟอรมนนเปนสวนทอยใตโครงสรางของอลเมนท form ซงหากเราเปรยบเทยบแลวออบเจคของ CFrom กคอรทของอลเมนท form นนเอง ดงนนการจดการกบอลเมนทลกของฟอรมนนสามารถดำเนนการไดในสองรปแบบคอ CForm::buttons และ CForm::elements โดยทในเมธอรดแรกนนเปนสวนของการจดการกบปม เชน submit , reset ในขณะทเมอธอรด CForm::elements เปนสวนจดการอลเมนทอน ๆ เชน ชองกรอกขอมลประเภทตาง ๆ , หรอปายขอความ

V.0.5.130815-091110 p.89

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสรางฟอรมอยางงายในหวขอนจะแสดงการใชงาน “Form Builder” จากฟอรม login โดยเรมจากการจากสวนของโคดในแอคชน login

จากโคดขางตน เราไดสรางออบเจคของ CForm เพอใชในการระบตำแหนงของพารธเอเลยส (path alias) application.views.site.loginForm โดยออบเจค CForm ทสรางมานมการระบใหมการเชอมโยงกบโมเดล LoginFrom หลงจากนนจงทำการตรวจสอบเงอนไขหากชองกรอกขอมลตาง ๆ ของฟอรมทสงขอมลมานนไมเกดขอผดพลาดใด ๆ จะทำการสงตอการทำงาน(redirect) ไปท “site/index” แตหากมขอผดพลาดเกดขนจะสงตอการทำงานไปยงหนา login

ความจรงแลวพารธเอเลยส(path alias) “application.views.site.loginForm” มนคอการอางองไปทพารธ “protected/views/site/loginForm.php” ซงแฟมนจะสงคากลบ(return)ออกมาเปน array ตามรปแบบท CForm ตองการ ดงแสดงในตวอยางตอไปน

V.0.5.130815-091110 p.90

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากตวอยางจะเหนการการตงคาชองกรอกขอมลตาง ๆ อยในรปแบบของอาเรย โดยคยของอาเรยนนคอพรอพเพอรตของคลาส CForm เชน title , elsements , buttons และในทายทสดเมอไดสงมลนไปใหววแลว(ในทนเราไดสงตวแปร $form ซงเปนอนสแตนทของ CForm ไปใหวว login) ในววกสามารถสงแสดงคาเหลานไดทนท เชน

การสงแสดงตวแปร $form นนอาจจะใช “echo $form;” หรอจะใชในรปแบบ “echo $form->render();” กไดเชนเดยวกน เพราะวา CForm นนไดอมพลเมนท เมธรอด __toString ซงเปน Magic method โดยใหเรยกใชเมธอรด render()

V.0.5.130815-091110 p.91

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การกำหนดฟอรมอลเมนทของ Form Builderอยางทไดกลาวมาในหวขอกอนหนาแลววาการสรางอลเมนทของ Form Builder นนจะใชพรอพเพอรต CFrom::elements และ CFom::buttons เปนตวกำหนดลกษณะชองชองกรอกขอมล โดยในทนจะยกตวอยางการใชงาน CForm:elements เปนหลกแตอยางไรกตามการใชงาน CForm::buttons กมรปแบบการใชงานไมแตกตางจาก CForm::elements

พรอพเพอรต CForm::elements สามารถกำหนดเปนอารเรยได เชน หากตองการสรางชองกรอกขอมลดวยอลเมนท <input name='username' type= 'text' maxlenght='32'> เราสามารถใช CForm:elements ในการสรางฟอรมโดยกำหนดคาใหกบพรอพเพอรตไดดงน

จากโคดขางตนเราสามารถกำหนดคาใหกบ type ไดหลายรปแบบดงน• text • hidden • password • textarea • fle • radio • checkbox • listbox • dropdownlist • checkboxlist • radiolist

V.0.5.130815-091110 p.92

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

• url • email • number • range • date

*** http://www.yiiframework.com/doc/api/1.1/CFormInputElement

การกำหนด type นนทำไดหลายแบบตามรายการในขางตน แตพวก type ทมลกษณะเปนแบบรายการ(list) เชน dropdownlist , checkboxlist และ radiolist นนตองสงคารายการตวเลอกตาง ๆ ใหกบพรอพเพอรต items ตวอยางเชน

โดย items ไดกำหนดคาของรายการตวเลอกมาจากเมธอรด getGenderOptions() ของโมเดล User

การกำหนด Sub-formSub-form นนใชเพอแบงฟอรมออกจากกนเปนสวน ๆ เพอการเชอมตอกบตาราง

V.0.5.130815-091110 p.93

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

มากกวาหนงตาราง เชน ฟอรมลงทะเบยน เราอาจแบงสวนของฟอรมเปนสองสวน โดยสวนแรกเปนสวนของขอมลเพอใชในการเขาสระบบ และสวนทสองเปนสวนของโปรไฟลซงทงสวนนอาจจะใชโมเดลคนละตวเพอแยกการจดเกบขอมลในคนละตาราง แตถาหากวารปแบบการจดเกบขอมลนนไมไดแยกตารางในการจดเกบขอมลเรากไมจำเปนทจะตองในงานในรปแบบ Sub-form

ในการกำหนด Sub-form นนมลกษณะเหมอนกนกบการประกาศแบบปกตตามทไดกลาวมากอนหนานแลว แตเพมสวนของพรอพเพอรต elements เพอแบงกลมของ Sub-form และใหกำหนด type เปน form ( 'type' => 'form' ) สวนรายละเอยด

V.0.5.130815-091110 p.94

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การนำไปใชงานจะกลาวในหวขอท 5 (การสรางฟอรมซอน)

การเขาถงอลเมนทของฟอรมการเขาถงอลเมนทของฟอรมทำไดงายเพยงระบถงอารเรยของอลเมนททตองการทเราไดประกาศไวใน Form-builder เทานน ตวอยาง เชน การอางถง อลเมนท username ของ login ฟอรม

หรอการเขาถงอลเมนท email ของ Sub-form 'user'

หรออาจจะอางการเขาถงอยางงาย ๆ ในรปแบบอารเรยไดเชนเดยวกน

การสรางฟอรมซอนหลงจากทเราไดสราง Sub-form กนไปแลว ในตอนนเราจะนำ Sub-form นนมาสรางฟอรมลงทะเบยน และฟอรมนจะมการทำงานกบสองโมเดล คอ User และ Profle โดยจะสราง actionRegister() ไวในสวนของคอนโทลเลอร

V.0.5.130815-091110 p.95

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากโดดจะเหนวามการเรยกใชงาน application.views.user.registerForm ซงเปน Form-builder ทไดจดสรางเตรยมไว และจากนนจงกำหนดให Sub-form “user” ใหทำงานกบโมเดล “User” และ Sub-form “profle” ทำงานรวมกนกบโมเดล “Profle” และทำการตรวจเชคเงอนของกฎ ซงถาหากถกตองตามกฎกจะทำการบนทกขอมล แตเนองดวยการตรวจสอบกฎนนไดทำไปแลว จงสงบนทกดวย $user->save(false) เพอระบวาใหทำการขามการตรวจสอบกฎเพอไมใหทำงานซำแลวจงสงใหไปท 'site/index' แตถาตรวจสอบกฎแลวผดพลาดจะถกสงใหไปทำงานทวว register

และในสวนของแฟม protected/views/user/registerForm.php เราไดกำหนดคาของฟอรมไวดงน (มตอ...)

V.0.5.130815-091110 p.96

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

และสดทายคอสคปของวว register

V.0.5.130815-091110 p.97

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.98

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การทำงานรวมกบฐานขอมล [8]ระบบฐานขอมลของ Yii พฒนามาจาก PDO (PHP Data Objects) ซง Yii DAO สามารถทจะเขาถงระบบฐานชอมลทแตกตางกนได หากเมอมการปรบเปลยนจากระบบฐานขอมลหนงไปยงอกระบบฐานขอมลหนงทแตกตางกนกสามารถทำไดโดยไมตองแกไขโคดโปรแกรมในสวนการขอมลขอมลแตอยางใด

Yii Query Builder ไดจดการสวนของ SQL query ใหอยในรปแบบของออบเจคเพอชวยลดความเสยงทจะถกโจมตจาก SQL inection

และในสวนของ Yii Active Record (AR) ยงจดการกบขอมลในรปแบบของ Object-Relational Mapping (ORM) ซงทำใหการเขยนโปรแกรมจดการกบขอมลไดงายขน โดยนำเสนอขอมลของตารางในรปแบบของคลาส และแถวขอมลในรปของอนสแตนซ , จากการออกแบบเหลานจงทำให Yii AR กำจดการเขยนคำสง SQL ทเกดขนซำ ๆ กบการดำเนนการนำเขา ปรบปรง แกไข และลบขอมล

ถงแมวา Yii ไดรวบรวมความสามารถในการจดการงานระบบฐานขอมลไวเกอบทงหมดแลวกตาม แตเรากยงคงสามารถทจะใชงานไลบรารฐายขอมลของคณเองใน Yii แอพพลเคชนได หรอใชงานรวมกนกบไลบรารเสรมอน ๆ

Data Access Objects (DAO)Data Access Objects (DAO) เปนสวนของ API ทใชในการจดการกบการเขาถงระบบฐานขอมลทมความแตกตางกน โดยทสามารถปรบเปลยนการใชงานระบบฐานขอมลทมความแตกตางกยโดยไมตองทำการแกไขโคดโปรแกรมแตอยางใด

Yii DAO ไดพฒนาตอยอดมาจาก PHP Data Obects (PDO) ซงเปนสวนขยาย(extension) ทสามารถเขาถงระบบฐานขอมลไดหลายชนด เชน MySQL , PostgreSQL ฯลฯ , ดงนนกอนทจะใชงาน Yii DAO ไดนนเราจะตองตดตงสวนขยาย PDO และ PDO driver เสยกอน ( http://php.net/manual/en/book.pdo.php )

V.0.5.130815-091110 p.99

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

คลาสหลกของ Yii DAO• CDbConnection: สวนของการเชอมตอไปยงฐานขอมล • CDbCommand: สวนของคำสง SQL เพอดำเนนการกบฐานขอมล • CDbDataReader: สวนการอานขอมลในแถวตอๆไป • CDbTransaction: สวนของทรานเซคชนของฐานขอมล

ซงจะอธบายถงการใชงานใหหวขอถดไป

การเชอมตอกบฐานขอมลในการเชอมตอกบระบบฐานขอมลใน Yii นนจะใชคลาส CDbConnection โดยการประกาศอนสแตนซของคลาสนขนมาใชงาน โดยจะผานคาพารามเตอรทจำเปนคอ dsn , username และ password โดยมตวอยางการใชงานดงน

การกำหนดคาพารามเตอรของ DSN นนจะมรปแบบคลายคลงกนกบ DSN ของ PDO ดงมรปแบบตอไปน

• SQLite: sqlite:/path/to/dbfle • MySQL: mysql:host=localhost;dbname=testdb • PostgreSQL: pgsql:host=localhost;port=5432;dbname=testdb • SQL Server: mssql:host=localhost;dbname=testdb • Oracle: oci:dbname=//localhost:1521/testdb

ดวยคลาส CDbConnection นนไดสบทอด(extends)มาจากคลาส CApplicationComponent เราจงสามารถทจะใชงานมนในรปแบบของ application components กได โดยการกำหนดในแฟมคอนฟกซ(application confguration)ใน

V.0.5.130815-091110 p.100

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

สวนของ db (หรอาจใชชออน) ดงน

หากไดประกาศสวนของการเชอมตอไวในแฟมคอนฟกซแลว เราจะสามารถทเขาถงการเชอมตอไดผานทาง Yii::app()->db ซงสามารถเรยกใชงานจากตำแหนงใด ๆ กไดของโคดโปรแกรม

การดำเนนการของขดคำสง SQLหลงจากททำการเชอมตอกบระบบฐานขอมลไดแลว การดำเนนการกบชดคำสง SQL นนจะใชงานผานทางอนสแตนซของคลาส CDbCommand โดยใชคำสง CDbConnection::createCommand() และระบพารามเตอรเปนชดคำสง SQL โดยมรปแบบการใชงานดงน

** Note ** คลาส CDbConnection::createCommand() จะรเทรนคลาส CDbCommand//Class CDbConnection

public function createCommand($query=null) { $this->setActive(true); return new CDbCommand($this,$query);

V.0.5.130815-091110 p.101

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

}

สำหรบการดำเนนการกบคำสง SQL ดวย CDbCommand นนมอยสองแนวทางดวยกน1. execute() จะใชงานกบชดคำสง SQL ประเภททไมมการสงกลบขอมล เชน insert , update

,delete หากการดำเนนการของชดคำสง SQL สำเรจฟงคชนจะสงคากลบมาเปนจำนวนรายการทถกดำเนนการ

2. query() จะใชงานกบชดคำสง SQL ประเภททมการสงคนขอมล เชน select โดยหากดำเนนการสำเรจ ฟงคชนจะสงคากลบมาเปนอนสแตนซของคลาส CDbDataReader ซงจะบรรจขอมลของผลลพธไว

ซงการดำเนนการของทงสองฟงคชนนจะทำงานตามปกต ยกเวนวาเกดขอขอผดพลาดกบชดคำสง SQL

การดงขอมลจากผลลพธของควรหลงจากทไดใชคำสง CDbCommand::query() และสงคากลบออกมาเปนอนสแตนซของ CDbDataReader แลว เราจะทำการดงแถวขอมลจากอนสแตนซดวยการเรยกใช CDbDataReader::reader() โดยจะทำการวนดงขอมลออกมาทละแถวจนหมดดวย foreach หรอ while ดงตวอยาง

V.0.5.130815-091110 p.102

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การใชงานทรานแซคชน (Using Transactions)เมอแอพพลเคชนไดดำเนการกบควรไมวาจะเปนการอานหรอการเขยนขอมลในฐานขอมลกตาม สงทสำคญอยางหนงคอ เราจะตองมนใจวาความครบถวนและสมบรณของขอมลซงเราอาจจะตองใชทรานแซคชนเขามาชวยจดการ ซงใน Yii ไดเตรยมคลาสเพอดำเนนการกบทรานแซคชนไวแลวคอ CDbTransaction โดยการดำเนนการของทรานแซคชนใน Yii นนมขนตอนดงน

• เรมตนการทำงานของทรานแซคชน• ดำเนนการควรขอมล ซงการปรบปรงขอมลใด ๆ จะยงไมเกดขนจรง• ยนยนทรานแซคชน การปรบปรงจะเกดขนจรง หากทรานเซคชนนนทำงานสมบรณ• หากถามรายการใดลมเหลว จะยกเลกการปรบปรงขอมลในทรานแซคชนนนทงหมด

จากขนตอนในการดำเนนการทางดานบน เราสามารถนำมาเขยนเปนโคดไดดงน

V.0.5.130815-091110 p.103

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

Binding Parametersความเสยงของเวบแอพพลเคชนอยางหนงกคอ การถกใสโคด SQL ทไมพงปรารถนามาทางชองกรอกขอมลตางๆ (SQL injection attacks) เพอหวงเขามาแทนทชดคำสง SQLเดมของโปรแกรม ดงนนนกพฒนาจงตอง “จดเตรยม” การเขยนโคดชดคำสง SQL ใหรดกมโดยการสงผานคาตาง ๆ ใหกบชดคำสงของ SQL โดยการใชแบบ “parameter placeholders” แทนการสงผานคาจรงทเกบอยในตวแปรลงไปในชดคำสง SQL ในแบบ “actual parameters”

parameters placeholder คอชอทถกกำหนดขนมาเพอใชแทนตวแปรในภายใจชดคำสง SQL (ตองไมกำหนดซำกน) โดยการกำหนดชอของ placeholder นนใหขนตนดวยเครองหมาย “ : ” (colon) และเมอนำไปใชกบชดคำสง SQL กไมจำตองระบเครองหมาย quote ใหกบ placeholder แตอยางใด

การผานคาใหกบ placeholder ทำไดโดยการเรยกใช CDbCommand::bindParam() หรอ CDbCommand::bindValue() และตองทำการกำหนดคาใหกบ placeholder กอนทจะสงดำเนนการควร

เมธอรด bindParam() และ bindValue() นน มความคลายกน แตความแตกตางกนเพยงอยางเดยวคอ bindParam() สงทผานให placeholder จะเปนตวแปรของ PHP ในขณะท bindValue() สงทผานให placeholder นนจะเปนคาใด ๆ ทไมไดอยในรปแบบของตวแปร

V.0.5.130815-091110 p.104

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

Binding columnsอกสงหนงทเราสามารถทำไดหลงจากทไดควรขอมลคอการถายขอมลของคอลมนเกบไวในตวแปรของ PHP แลวจงนำไปใช โดยใชเมธอรด bindColumn

การใชงานเทเบลพรฟกซYii สนบสนนการทำงานของชอตารางในแบบเทเบลพรฟกซ(Table prefx) ซงหมายความวา เราจะสามารถสรางตารางทมชอเดยวกนแตมชอนำหนาตารางทแตกตางกน การใชงานเทเบลพรฟกซนนมประโยชนและเปนทนยมใชกนมากในโฮสทมฐานขอมลกนใชงาน เชน มหลายแอพพลเคชนแตจำเปนตองใชฐานขอมลกอนเดยวกน ซงอาจทำใหเกดตารางทมชอซำกนได และเพอใหแยกแยะความแตกตางของฐานขอมลในแตละแอพพลเคชนเรากจะใชเทเบลพรฟกซมาชวย เชน แอพพลเคชนหนงอาจจะใชตารางทมชอนำหนาดวย tbl_ ในขณะทอกแอพพลเคชนหนงอาจใชตารางทขนตนดวย cms_ เปนตน

การใชงานเทเบลพรฟกซนน จะเรยกใช CDbConnection::tablePrefx เพอกำหนดคาของชอนำหนาตาราง จากนนการอางถงชอของตารางในชดคำสง SQL จะใช {{TableName}} โดยท TableName นนหมายถงชอตารางทตองการอางถงโดยไมตองใสชอของเทเบลพรฟกซ ตวอยางเชน ในฐานขอมลมตารางชอ tbl_user โดยท tbl_ คอเทเบลพรฟกซ ซงหากในโคดไดกำหนดคาเทเบลพรฟกซไวกอนแลว เราสามารถเขยนโคดเพอทจะควรขอมลไดดงน

V.0.5.130815-091110 p.105

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสรางควรดงขอมลดวย Yii Query BuilderYii Query Builder ไดจดเตรยมการเขยนชดคำสง SQL ไวในรปแบบของออบเจค ซงอนญาตใหนกพฒนาใชคลาสเมธอรดและพรอพเพอรตเพอกำหนดชดคำสง SQL ของตนเองได ซงเราอาจจะดำเนนการกบกบชดคำสง SQL เหลานในรปแบบทมองคประกอบแตกตางกนออกไปไดตามขอกำหนดของ SQL โดยการเรยกผาน DAO เชน

Query Builder จะใชงานไดอยางมประสทธภาพกตอเมอเราตองการเขยนชดคำสง SQLแบบทมหลายสวนประกอบ หรอการกำหนดเงอนไขในการควรภายในแอพพลเคชน ซงประโยขนหลก ๆ ทจะไดจากการใช Query Builder มดงน

• อนญาตใหสรางชดคำสง SQL เองได• ใสเครองหมาย Quotes ใหกบชอตารางและชอคอลมนโดยอตโนมต เพอปองกนความขดแยงของคำ

สงวนและอกขระพเศษ• สามารถสงคาผานพารามเตอรโดยใช “Parameter binding” ได เพอปองกนการถกโจมตดวย

เทคนค SQL injection• งายตอการโยกยายฐานขอมลไปยงระบบฐานขอมลทแตกตางกน

** หมายเหต Query Builder ไมสามารถแกไขเพมเตมควรทถกระบไปแลวในชดคำสง SQL ได เชน

V.0.5.130815-091110 p.106

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การเตรยม Query BuilderYii Query Builder ทำงานอยภายใตกรอบของ CDbCommand ซงเปนคลาสหลกในการควรขอมลใน DAO โดยการใชงาน Query Builder นนเราจะตองสรางอนสแตนซของคลาส CDbCommand เสยกอน ดงน

เราให Yii::app()->db เพอทำการเชอมตอไปยงฐานขอมล และตามดวย CDbConnection::createCommand() เพอสรางชดคำสง SQL ทตองการ ซงในทนเราจะไมผานคาใหกบเมธอรด createCommand() เพราะวาเราจะสรางชดคำสง SQL โดยใชวธ Query Builder ซงจะอธบายตอไปจากน

การสรางควรเพอดงขอมลการสรางควรเพอดงขอมลของชดคำสง SQL นนเราจะใชคำสง SELECT ในการดงขอมลซง Query Builder ไดเตรยมกลมของเมธอรดเพอใชกบสวนของประโยคคำสง SELECTและทกเมธอรดของกลมเมธอรดนจะสงคากลบ(return)มาเปนอนสแตนซของ CDbCommand ซงทำใหเราสามารถทจะเรยกใชงานเมธอรดเหลานไดในแบบตอเนองกน (method chaining) ไดอกดวยselect() ระบคาทตองการในสวนของควร SELECT selectDistinct() ระบคาทตองการในสวนของควร SELECT และจะสงคากลบแบบ DISTINCTfrom() ระบคาทตองการในสวนของควร FROM where() ระบคาทตองการในสวนของควร WHEREandWhere() เพมเงอนไขของ WHERE ดวยตวดำเนนการ ANDorWhere() เพมเงอนไขของ WHERE ดวยตวดำเนนการ ORjoin() เพมการเชอมโยงตาราง ในแบบ INNER JOINleftJoin() เพมการเชอมโยงตาราง ในแบบ LEFT JOINrightJoin() เพมการเชอมโยงตาราง ในแบบ RIGHT JOIN

V.0.5.130815-091110 p.107

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

crossJoin() เพมการเชอมโยงตาราง ในแบบ CROSS JOIN (อาจไมสนบสนนในบาง DBMS)naturalJoin() เพมการเชอมโยงตาราง ในแบบ NATUAL JOINgroup() ระบคาการ GROUP BYhaving() ระบคาการ HAVINGorder() ระบคาการ ORDER BYlimit() ระบคาการ LIMIToffset() ระบคาการ OFFSETunion() ระบคาการ UNION

select()

รปแบบฟงคชน function select($columns='*')

ตวอยาง // SELECT * select() // SELECT `id`, `username` select('id, username') // SELECT `tbl_user`.`id`, `username` AS `name` select('tbl_user.id, username as name') // SELECT `id`, `username` select(array('id', 'username')) // SELECT `id`, count(*) as num select(array('id', 'count(*) as num'))

selectDistinct()

รปแบบฟงคชน function selectDistinct($columns)

ตวอยาง selectDistinct('id, username')

V.0.5.130815-091110 p.108

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

from()

รปแบบฟงคชน function from($tables)

ตวอยาง // FROM `tbl_user` from('tbl_user') // FROM `tbl_user` `u`, `public`.`tbl_profle` `p` from('tbl_user u, public.tbl_profle p') // FROM `tbl_user`, `tbl_profle` from(array('tbl_user', 'tbl_profle')) // FROM `tbl_user`, (select * from tbl_profle) p from(array('tbl_user', '(select * from tbl_profle) p'))

where()

รปแบบฟงคชน function where($conditions, $params=array())

ตวอยาง // WHERE id=1 or id=2 where('id=1 or id=2') // WHERE id=:id1 or id=:id2 where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2)) // WHERE id=1 OR id=2 where(array('or', 'id=1', 'id=2')) // WHERE id=1 AND (type=2 OR type=3) where(array('and', 'id=1', array('or', 'type=2', 'type=3'))) // WHERE `id` IN (1, 2) where(array('in', 'id', array(1, 2)) // WHERE `id` NOT IN (1, 2) where(array('not in', 'id', array(1,2))) // WHERE `name` LIKE '%Qiang%' where(array('like', 'name', '%Qiang%')) // WHERE `name` LIKE '%Qiang' AND `name` LIKE '%Xue' where(array('like', 'name', array('%Qiang', '%Xue'))) // WHERE `name` LIKE '%Qiang' OR `name` LIKE '%Xue' where(array('or like', 'name', array('%Qiang', '%Xue')))

V.0.5.130815-091110 p.109

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

// WHERE `name` NOT LIKE '%Qiang%' where(array('not like', 'name', '%Qiang%')) // WHERE `name` NOT LIKE '%Qiang%' OR `name` NOT LIKE '%Xue%' where(array('or not like', 'name', array('%Qiang%', '%Xue%')))

ในการใชงาน where() นยงสามารถใชงานโอเปอรเรเตอรตาง ๆ ของ where เปนอารเรยทางพารามเตอรไดดงน

• and ตวอยางการใชงาน เชน array('and', 'id=1', 'id=2') ซงหมายถง id=1 and id=2 หรอ array('and', 'type=1', array('or', 'id=1', 'id=2')) ซงหมายถง type=1 AND (id=1 OR id=2)

• or รปแบบการใชงานเหมอนกนกบ and• in ตวอยางการใชงาน เชน array('in', 'id', array(1,2,3)) ซงหมายถง id IN (1,2,3)• not in ใชเหมอน in แตเพยงเปลยนเปน not in เทานน• like ตวอยางการใชงานคอ array('like', 'name', '%tester%') หมายถง name LIKE '%tester%'

หรอการใช and มาเชอม link เชน array('like', 'name', array('%test%', '%sample%')) ซงหมายถง name LIKE '%test%' AND name LIKE '%sample%'

• not like ใชเหมอนกนกบ like แตเปลยนเปน not like• or like ใชเหมอนกนกบ like แตเปลยนเปน or like• or not like ใชเหมอนกนกบ like แตเปลยนเปน or not like

andWhere()

รปแบบฟงคชน function andWhere($conditions, $params=array())

ตวอยาง ใชงานคลายกนกบ where() ยกเวนสวนของเงอนไข

orWhere()

รปแบบ function orWhere($conditions, $params=array())

ตวอยาง ใชงานคลายกนกบ where() ยกเวนสวนของเงอนไข

V.0.5.130815-091110 p.110

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

order()

รปแบบฟงคชน function order($columns)

ตวอยาง // ORDER BY `name`, `id` DESC order('name, id desc') // ORDER BY `tbl_profle`.`name`, `id` DESC order(array('tbl_profle.name', 'id desc'))

limit() และ offset()

รปแบบฟงคชน function limit($limit, $offset=null)function offset($offset)

ตวอยาง // LIMIT 10 limit(10) // LIMIT 10 OFFSET 20 limit(10, 20) // OFFSET 20 offset(20)

join() และทเกยวของ

รปแบบฟงคชน function join($table, $conditions, $params=array())function leftJoin($table, $conditions, $params=array())function rightJoin($table, $conditions, $params=array())function crossJoin($table)function naturalJoin($table)

ตวอยาง // JOIN `tbl_profle` ON user_id=id join('tbl_profle', 'user_id=id') // LEFT JOIN `pub`.`tbl_profle` `p` ON p.user_id=id AND type=1 leftJoin('pub.tbl_profle p', 'p.user_id=id AND type=:type', array(':type'=>1))

V.0.5.130815-091110 p.111

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

group()

รปแบบฟงคชน function group($columns)

ตวอยาง // GROUP BY `name`, `id` group('name, id') // GROUP BY `tbl_profle`.`name`, `id` group(array('tbl_profle.name', 'id'))

having()

รปแบบฟงคชน function having($conditions, $params=array())

ตวอยาง // HAVING id=1 or id=2 having('id=1 or id=2') // HAVING id=1 OR id=2 having(array('or', 'id=1', 'id=2'))

union()

รปแบบฟงคชน function union($sql)

ตวอยาง union('select * from tbl_profle')

การสงดำเนนการควรหลงจากทไดสรางชดคำสงจาก Query Builder แลวเราจะตองสงดำเนนการกบชดควรนน ซงเราสามารถเรยกใชงานไดทง CDbCommand::queryRow() หรอ CDbCommand::queryAll() ระหวางสองเมธอรดนมขอแตกตางกนกคอ queryRow() จะสงคากลบเพยงเรคคอรดแรกของผลลทธเทานน ในขณะท queryAll() จะสงคากลบทกเรคคอรดของผลลพทธ ดวอยางการใชงาน เชน

V.0.5.130815-091110 p.112

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การแสดงชดคำสง SQLsหากในบางครงเราตองการทจะแสดงชดคำสง SQL ทไดสรางไปแลว อาจจะเพอตรวจสอบความถกตอง ซงสามารถทำไดโดยการเรยกใช CDbCommand::getText()

การสรางควรในรปแบบอน ๆในบางครงการสรางควรโดยเขยนเปนเมธอรดแบบตอเนอง (method chaining)อาจไมใชทางเลอกทเหมาะสมนก , Yii Query Builder จงอนญาตใหสรางควรโดยการกำหนดคาพรอพเพอรตใหกบออบเจคไดเลย โดยชอของพรอพเพอรตทใชกำหนดควรม ดงน distinct , from , group , having , join , limit , offset , order , params , select , union , where โดยมรปแบบการใชงานดงน

การสรางควรหลายควรอนสแตนซของ CDbCommand นนสามารถนำกลบมาใชไดหลายครงในโคดเพอใชสรางควรหลายควร แตอยางไรกตามหากจะนำมนกลบมาใชใหมเราจำเปนตองลางควรเดมเสยกอนโดยใชเมธอรด CDbCommand::reset() ตวอยางเชน

V.0.5.130815-091110 p.113

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

V.0.5.130815-091110 p.114

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสรางควรเพอจดการกบขอมล ( insert , update , delete )การจดการกบขอมลดวยชดคำสง SQL นนกเพอการนำเขา ปรบปรง และลบขอมลออกจากระบบฐานขอมลโดยมคำสงทมารองรบการทำงานคอ insert , update , delete ซงการสรางชดคำสงเหลาน Query Builder ไดเตรยมเมธอรดทมชอเดยวกนกบคำสง SQLทไดกลาวมา โดยการใชงานเมธอรดเหลานไมเหมอนกนกบชดคำสง SELECT เมธอรดเพราะชดเมธอรดเหลานเมอสรางชดคำสง SQL เสรจกจะสงดำเนนการกบคำสงทนท

• insert() นำขอมลเขาตาราง• update() ปรบปรงขอมลในตาราง• delete() ลบขอมลในตาราง

insert()

รปแบบฟงคชน function insert($table, $columns)

ตวอยาง // build and execute the following SQL: // INSERT INTO `tbl_user` (`name`, `email`) // VALUES (:name, :email) $command->insert('tbl_user', array( 'name'=>'Tester', 'email'=>'[email protected]', ));

update()

รปแบบฟงคชน function update($table, $columns, $conditions='', $params=array())

ตวอยาง // UPDATE `tbl_user` SET `name`=:name WHERE id=:id $command->update('tbl_user', array( 'name'=>'Tester', ) ,

'id=:id', array(':id'=>1))

V.0.5.130815-091110 p.115

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

delete()

รปแบบฟงคชน function delete($table, $conditions='', $params=array())

ตวอยาง // DELETE FROM `tbl_user` WHERE id=:id $command->delete('tbl_user', 'id=:id', array(':id'=>1));

Active Recordถงแมวา Yii DAO จะสามารถอนญาตใหเราเขยนคำสง SQL เพอเขาควบคมการทำงานของฐานขอมลไดกจรง แตมนกคอนชางใชเวลาในการเขยนชดคำสง SQL อยพอสมควรแมกระทงในงานพนฐานทวไปเชน นำเขา ปรบปรง แกไข ลบขอมล ( CRUD ) และอกทงมนยงเปนเรองยงยากในการปรบปรงโคดโปรแกรมทมการเขยนชดคำสง SQL ผสมรวมปะปนอยกบโคด และแนวทางในการแกไขปญหาน คอ การใชงาน Active Record

Active Record (AR) ทนยมใชกนมากในบรรดาเทคนครปแบบ Object-relational Mapping (ORM) โดยคลาสของ AR นนจะเปรยบเสมอนกบตารางขอมล (หรอวว) ในขณะทพรอพเพอรตของคลาส AR จะเทยบไดกบแอททรบวทของตารางขอมล และอนสแตนทของ AR จะเทยบไดกบแถวหนง ๆ ในตารางขอมล โดยปกตแลวเมธอรดของAR จะจดการเกยวกบ CRUD ใหแลว ซงกจะสงผลใหเราสามารถทจะเขาถงขอมลผานออบเจคไดหลากหลายทาง ตวอยางเชน การนำเขาขอมลใหมไปยงตาราง tbl_post โดยมรปแบบโคดดงน

ตอไปเราลองมาดถงการตงคาและการใชงาน AR เพอใหใชงานความสามารถในการดำเนนการของ CRUD และจะแสดงใหเหนถงการใชงาน AR กบฐานขอมลทมความสมพนธกนในหวขอถดไป และเพอใหงายตอความเขาใจ ในทนเราจะใชตารางขอมลตอไปนเพอเปนตวอยางในการอธบายในหวขอน ดงน

V.0.5.130815-091110 p.116

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

CREATE TABLE tbl_post ( id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(128) NOT NULL, content TEXT NOT NULL, create_time INTEGER NOT NULL);

การเชอมตอกบระบบฐานขอมลโดยปกตAR จะอาศยอนสแตนซของ CDbConnection ในการเชอมตอกบระบบฐานขอมล ซงในทนเราจะสมมตใหแอพพลเคชนคอมโพแนนท db ในแฟมคอนฟกซ ถกกำหนดใหเปนอนสแตนซของคลาส CDbConnection ดวอยางเชน

ระบบฐานขอมลท AR สนบสนนการทำงานในปจจบนนไดแก• MySQL 4.1 หรอใหมกวา • PostgreSQL 7.3 หรอใหมกวา• SQLite 2 และ 3 • Microsoft SQL Server 2000 หรอใหมกวา• Oracle

Tip: มอยสองแนวทางในการทำงานกบฐานขอมลหลายๆตว คอ 1.ถา schemas ของฐานขอมลตางกน เราอาจจะสรางคลาส AR และดำเนนการกบ getDbConnection() ตวใหม หรอ 2.ปรบ CActiveRecord::db ใหเปนแบบ Dynamic

V.0.5.130815-091110 p.117

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การกำหนด AR คลาสในการเขาถงตารางขอมลนน สงแรกทเราจะตองทำคอการประกาศคลาส AR โดยทคลาสนตองสบทอด(extends)มาจาก CActiveRecord โดยทแตละคลาส AR นนจะตวแทนของตารางขอมลเพยงหนงตาราง และอนสแตนซ AR จะเปนตวแทนของแถวในตารางขอมล เชน โคดตอไปนเปนตวอยางสน ๆ ทแสดงใหเหนถงคลาส AR ทชอวาโพสซงเปนตวแทนของตาราง tbl_post

tip : เพราะวาบอยครงคลาส AR จะถกอางถงในหลายตำแหนง เราจงสามารถทจะนำเขาไดเรกทอรทงหมดทเกบคลาส AR ไดแทนทจะนำเขา(include)มาทละตว ตวอยางเชน หากแฟมของคลาส AR ทงหมดถกจดเกบอยท protected/models เราสามารถตงคาในแอพพลเคชนคอนฟกซไดดงน return array( 'import'=>array( 'application.models.*', ), );

โดยปกตชอของคลาส AR จะเหมอนกนกบชอตารางในฐานขอมล แตหากตองการใหแตกตางกนกสามารถ Override เมธอรด tableName() แลวสงคากลบเปนชอตารางทตองการ

คาของคอลมนตาง ๆ ในแถวขอมลนนสามารถเขาถงไดผานทางพรอพเพอรตของ

V.0.5.130815-091110 p.118

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

อนสแตนซ AR สำหรบตวอยางตอไปนเปนการกำหนดคาใหกบคอลมน title

ถงแมวาเราจะไมเคยประกาศพรอพเพอรต title ในคลาส Post มากอน แตเรากสามารถทจะเขาถงมนไดตามตวอยางขางตน นนกเพราะวา title เปนคอลมนในตาราง tbl_post และ CActiveRecord จะสรางพรอพเพอรตตาง ๆ เพอการเขาถงโดยการชวยเหลอของ __get() ซงเปนเมจกเมธอรดของ PHP

การนำเขาขอมลใหมในการนำเขารายการขอมลใหมสตารางขอมลนน เราจะสรางอนสแตนซของคลาส AR และสงคาผานทางพรอพเพอรตทมความสมพนธกนกบคอลมนของตารางนน ๆ และจากนนจงเรยกใชงานเมธอรด save() เพอทำการนำเขาขอมลทกำหนดไว เชน ตวแปร $post เปนอนสแตนซของคลาส Post (คลาส AR , CActiveRecord ) จากนนจงกำหนดคาผานทางพรอพเพอรต title , content , create_time ( พรอพเพอรตเหลานมความสมพนธกนกบคอลมนของตารางขอมล ) จากนนจงเรยกใชเมธอรด save() เปนลำดบสดทายเพอทำการบนทกขอมลทไดกำหนดไวใหกบพรอพเพอรตลงสตารางขอมล

จากตวอยางเราไมไดกำหนดขอมลใหกบพรอพเพอรต id เพราะเนองจากคอลมน id ในตารางขอมลนนถกกำหนดใหเปน auto-increment

แตหากวา เราตองการทจะกำหนดคาเรมตนใหกบคอลมนใด ๆ นอกเหนอจากการกำหนดทสคมาของตารางขอมลแลว กสามารถทำไดโดยการทกำหนดไวทพรอพเพอรตของคลาส AR ได เชน

V.0.5.130815-091110 p.119

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เรายงสามารถกำหนดคาโดยใช CDbExpression เพอเรยกใชงานฟงคชนของ MySQL ตวอยางเชน NOW()

การอานขอมลเมธอรดในการอานขอมลจากตารางของมลของ AR นนมหลายเมธอรดดวยกน เชน fnd, fndAll เปนตน โดยทเมธอรด fnd() , fndByPk() , fndByAttributes() , fndBySql() จะสงคากลบมาเพยงแถวเดยวเทานน

จากตวอยาง เราเรยกใชเมธอรด fnd ผานทาง Post::model() ซงเมธอรด model() นนเปน static method ทจะสามารถเรยกใชงานไดจากทก ๆ คลาส AR โดยจะสงคากลบ(return)ออกมาเปนอนสแตนทของ AR เพอทจะใชในการเขาถงเมธอรดในระดบตาง ๆ ในออบเจคได ( เชน static method )

V.0.5.130815-091110 p.120

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

หากเมธอรด fnd คนหาพบขอมลตามเงอนไขกจะสงคากลบมาเปนอนสแตนซของ Postซงจะประกอบไปดวยพรอพเพอรตทมความเชอมโยงกบคอลมนของตารางขอมลซงจะเกบคาขอมลของคอลมนในแถวขอมลนน ๆ ไว โดยทเราสามารถอานคาเหลานไดผานทางออบเจคพรอพเพอรต เชน echo $post->title;

เมธอรด fnd จะสงคากลบเปน null หากไมพบขอมลใด ๆ ในฐานขอมลจากเงอนไขของควรทเราไดกำหนดไว

เมอเราเรยกใชเมธอรด fnd เราสามารถทจะใช $condition และ $params ในระบเงอนไขใหกบควร ในทนเราจะใช where เพอกำหนดเปนเงอนไขในชดคำสง SQL และจะกำหนดคาอารเรยใหกบ $params เพอสงผานคาขอมลไปยง placeholder เชน

เรายงสามารถใช $condition ในการระบเงอนไขของควรทซบซอน แทนทจะใชเปนขอความปกต กจะเปลยนมาเปนการใชอนสแตนซของ CDbCriteria เพอสงเปนเงอนไขแทน ซงมนจะอนญาตใหเราระบเงอนไขในแบบอน ๆ นอกเหนอจาก where ไดอกดวย ตวอยางเขน

หรออาจใชอกแนวทางอนคอการผานเปนอารเรยแทนใหกบเมธอรด fnd โดยคยและคาทของคยจะเหมอนกนกบการใช CDbCriteria ตวอยางเชน

V.0.5.130815-091110 p.121

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

เมอตองการใหตอบกบผลลพธทงหมดทเปนไปตามเงอนไขทระบไวในควร เราสามารถทจะใชเมธอรด fndAll ซงจะมลกษณะการใชงานเชนเดยวกนกบเมธอรด fnd ดงน

หากไมพบขอมลใด ๆ ตามเงอนไขของควร fndAll จะสงคากลบมาเปนอารเรยเปลา ซงมนจะแตตางกนกบ fnd ทจะสงคากลบมาเปน null หากไมพบขอมลใด ๆ

ยงไปกวานนเมธอรด fnd และ fndAll ยงไดอำนวยความสะดวกในการใชงานดวยเมธอรดตาง ๆ อก ตวอยางเชน

การปรบปรงขอมลการปรบปรงขอมลโดยใช AR นนเปนเรองงายเชนเดยวกนการนำเขา หรอ คนหาขอมล ซงสามารถทำไดดงน

เรายงคงใชเมธอรด save() ในการบนทกขอมลเชนเดยวกนการการนำเขา แตหากวาอนสแตนซของ AR นนถกสรางมาจากโอเปอรเรเตอร new (ไมไดเรยกใชแบบ static)

V.0.5.130815-091110 p.122

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การเรยกใชงานเมธอรด save() จะหมายถงการนำเขาขอมลรายการใหมลงในตารางขอมล แตถาอนสแตนซของ AR นนเปนผลมาจากการเรยกใชเมธอรด fnd , fndAll แลว การเรยกใช save() จะหมายถงการปรบปรงขอมลทมอยเดมในตาราง ซงในความจรงเราอาจจะให CActiveRecord::isNewRecord ในการตรวจสอบวาอนสแตนซของ AR นนเปนรายการใหมหรอไมกได

มนมความเปนไปไดวาการปรบปรงขอมลในตารางโดยไมตองทำการคนหามนกอนดวย fnd , fndAll ซง AR ไดอำนวยความสะดวกดวย static method เหลาน เชน

จากตวอยางขางตน $attributes เปนอารเรยของชอคอลมน และสวน $counters คออารเรยของลำดบคาทตองการเพมใหกบคอลมน และ $conditions , $params คอสวนของเงอนไขและการผานคาดงทเคยยกตวอยางมาบางแลว

การลบขอมลการลบขอมลนนมลกษณะการใชงานคลายคลงกนกบการปรบปรงขอมลคอ สงคนหาขอมลกอนแลวจงดำเนนการลบ โดยมตวอยางดงน

ยงมเมธอรดทสามารถททำใหสามารถลบขอมลไดโดยไมตองคนหาขอมลกอน เขน

V.0.5.130815-091110 p.123

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ความถกตองของขอมลบอยครงทเราตองการทจะตรวจสอบความถกตองของขอมลไมวาจะกระทำการนำเขา หรอปรบปรงขอมลกตาม เพอใหขอมลเหลานนถกตองและสมบรณกอนทจะนำจะไปบนทกลงตารางขอมล

AR มความสามารถในการตรวจสอบความถกตองของขอมลโดยอตโนมตเมอมการเรยกใชงานเมธอรด save() โดยการตรวจสอบความถกตองนนมฐานมาจากกฎทถกระบบไวในเมธอรด rules() ของคลาส AR สวนรายละเอยดการสรางกฎนนไดอธบายไปแลวในหวขอ “การสรางกฏในการตรวจสอบขอมล”

เมอขอมลถกบนทกจากการเพมหรอแกไขจากผใชผานทางฟอรมของ HTML ซงเราจะตองรบขอมลจากฟอรมมาเพอกำหนดคาใหกบพรอพเพอรตของ AR ทมความเชอมโยงกนกบคอลมนของตารางขอมล เชน

แตหากถาจำนวนคอลมนมจำนวนมากซงอาจจะดยงยากทจะกำหนดคาเปนรายตว เราสามารถทจะใชพรอพเพอรต attributes แทนพรอพเพอรตแบบรายคอลมน เชน

V.0.5.130815-091110 p.124

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การปรบแตงCActiveRecord ไดจดเตรยมคลาสเพอใหนกพฒนาสามารถเขาควบคม(Overridden) เมธอรดพเศษบางตว เพอใหสามารถปรบแตงการทำงานบางอยางได เชน

• beforeValidate และ afterValidate: การทำงานกอนและหลง ของการตรวจสอบความถกตอง.• beforeSave และ afterSave: การทำงานกอนและหลงการบนทกขอมลของอนสแตนซ AR• beforeDelete และ afterDelete: การทำงานกอนและหลงการลบขอมลของอนสแตนซ AR• afterConstruct: การทำงานทเกดจากสรางอนสแตนทซ AR จากโอเปอรเรเตอร new.• beforeFind: การทำงานกอนท AR จะใชคณสมบตการการคนหา (เชน fnd(), fndAll()).• afterFind: การทำงานหลงจากทอนสแตนซ AR ไดสรางผลลพธจากการควร

การทำทรานเซคชนดวย ARในทกอนสแตนซ AR จะสามารถเรยกใชงานพรอพเพอรต dbConnection (read-only)โดยจะสงคากลบเปนอนสแตนซ CDbConnection เพอทจะใชงานคณสมบตทรานเซคชนของ Yii DAO ภายใตการทำงานของ AR

V.0.5.130815-091110 p.125

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

Named Scopesเนมดสโคป คอตวแทนของขอกำหนดตาง ๆ ในควร ซงเราสามารถสรางไวเพอประยกตใชกบควรของแอคทฟเรคอรดได

เนมดสโคป จะถกประกาศใน CActiveRecord::scopes() โดยจะระบขอสโคปและขอกำหนดของควรเปนแบบอารเรย เชนตวอยางทางดานลางนไดกำหนดชอของสโคปไว 2 ตวดวยกนคอ published และ recently ภายใตคลาสโมเดล Post

สำหรบสโคปทชอ recently นนเปนการระบขอกำหนด “order” โดยมคาเปน “create_time DESC” และ “limit” เกบคา “5”

เมอมการเรยกใชงานเมธอรด fnd เราสามารถทจะเรยกใชเนมดสโคปในแบบของสายเมธอรด (chained) เชน หากตองการคนหารายการทไดเผยแพรไปแลวและพงภถกโพสไปลาสด 5 รายการ เราอาจเรยกใชเนมดสโคป published และ recently มาใชงานรวมกบเมธอรด fnd ดงน

โดยทวไปแลวเนมดสโคปเราจะตองเขยนไวทางดานซานมอของเมธอรด fnd และการใชเนมดสโคปนนจะตองใชงานในรปแบบ “class-level” โดยเรยก “ชอคลาส::model()” เชน Post::model

V.0.5.130815-091110 p.126

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสรางพารามเตอรใหกบเนมดสโคปเราสามารถทจะสรางพารามเตอรเพอสงผานใหกบเนมดสโคปได ตวอยางเชน หากเราตองการทจะกำหนดจำนวนรายบทความทโพสเขาไปใหมผานทางเนมดสโคป recently แทนทจะกำหนดในเมธอรด CActiveRecord::scopes กปรบมาเปลยนมาเปนการประการเปนเมธอรดใหมแทน เชน

และเมอเราตองการเรยกใชเนมดสโคปนเรากยงคงเรยกใชงานไดในรปแบบเดม แตในตอนนสามารถทจะสงคาพารามเตอรใหกบเนมดสโคป recently ได (หากไมสงคาพารามเตอร คาดฟอลตจะเปน 5 )

ดฟอลตสโคปคลาสโมเดลตาง ๆ สามารถทจะกำหนดดฟอลตสโคปเพอประยกตใชกบควรของโมเดลนน ๆ ได ตวอยางเชน เวบไซทสนบสนนการทำงานแบบหลายภาษา ซงโดยปกตแลวเราอาจจะแสดงเนอหาในภาษาตามทถกระบไว

การใชงานดฟอลตสโคปนน จะตองทำการโอเวอรไรดเมธอรด CActiveRecord::defaultScope โดยมรปแบบดงน

V.0.5.130815-091110 p.127

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

และในตอนนเมธอรด defaultScope จะถกเรยกใชโดยอตโนมตเมอมการเรยกใชควร

Note : defaulScope จะทำงานเฉพาะควร select เทานน และจะไมมผลกบ insert, update ,delete

Relational Active Recordจากในหวขอกอนหนาน คงทำใหเราไดเหนถงวธการใชงาน Active Record (AR) ในการเรยกใชขอมลจากตารางขอมล แตนนกเปนการใชงานจากเพยงหนงตารางเทานน และในหวขอนเราจะอธบายถงการใช AR ในการเชอมโยงขอมลกบตารางหลายตาราง

การใชงาน “relational active record” แนะนำวาควรกำหนดความสมพนธของ primary key และ foreign key กบตารางขอมลทมความสมพนธเชอมโยงกน ทงนกเพอตองการใหขอมลนนมความถกตองสมบรณ แตอยางไรกดคณสมบตของ foreign key อาจจะไมสนบสนนกบระบบฐานขอมลบางตวกได

ในทนจะยกตวอยางของ ER diagram เพอแสดงใหเหนถงความสมพนธระหวางตารางขอมล

V.0.5.130815-091110 p.128

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การประกาศความสมพนธกอนทจะใชความสามารถของรเลชนควรใน AR นน เราจำเปนทจะตองทำให AR รถงความสมพนธระหวางคลาส AR กนเสยกอน

ความสมพนธระหวาคลาส AR สองคลาสนนกเปรยบเสมอนกนกบความสมพนธกนระหวางตารางสองตาราง โดยจากจดนไปจะอธบายถงความสมพนธระหวางตารางขอมลสองตาราง(A และ B) ซงความสมพนธระหวางสองตารางนนมอย 3 รปแบบดวยกนคอ

• one-to-many เชน tbl_user และ tbl_post• one-to-one เชน tbl_user และ tbl_profle• many-to-many เชน tbl_category และ tbl_post

และความสมพนธ 3 รปแบบน ใน AR สามารถแบงออกเปน 4 ชนดดวยกนคอ• BELONGS_TO หากความสมพนธระหวาง A และ B เปนแบบ one-to-many เมอ B เปนสวน

หนงของ A เชน Post เปนสมาชกของ User• HAS_MANY หากความสมพนธระหวาง A และ B เปนแบบ one-to-many เมอ A มอยหลาย

รายการใน B เชน User มอยหลายรายการใน Post• HAS_ONE จะคลายคลงกนกบ HAS_MANY แตแตกตางกนท A จะมแคหนงเดยวใน B เทานน เชน

หนง User มหนง Profle เทานน• MANY_MANY เปนความสมพนธในแบบ many-to-many ซงควรจะหลกเลยงความสมพนธในรป

แบบนและเปลยนไปเปนแบบ one-to-many เพราะหลาย ๆ DBMS ไมสนบสนนความสมพนธในรปแบบน ซงในทางเทคนคแลวเราสามารถปรบ MANY_MANY ใหเปนแบบ BELONGS_TO ผสมกบ HAS_MANY เชน Post มไดหลาย Category และ Category กมหลาย Post

การกำหนดความสมพนธของของ AR นนจะตองทำการโอเวอรไรดเมธอรด relations() ของ CActiveRecord โดยเมธอรดจะสงคากลบมาเปนอารเรยซงภายในนนจะเปนคาคอนฟกซของความสมพนธ เชน หากกำหนดอารเรยของความสมพนธเพยงหนงความสมพนธ จะใชรปแบบดงน

V.0.5.130815-091110 p.129

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

จากรปแบบ VarName คอ ชอของความสมพนธ ในสวน RelationType คอ การระบชนดของความสมพนธใน 4 รปแบบ คอ self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY และ self::MANY_MANY ในสวน ClassName คอ ชอของคลาส ARทมความสมพนธกนกบคลาส AR น ในสวน ForeignKey คอการระบ foreign key ทมความสมพนธ และในสวนของ option คอสวนตวเลอกทระบเพมเตม

จากตวอยางตอไปน จะแสดงใหเหนถงวธการกำหนดความสมพนธระหวางคลาส AR สองคลาสคอ User และ Post

ในกรณท foreign key ประกอบดวยคอลมนมากกวาหนงคอลมน ในกรณนเราจะประกาศ foreign key ใหอยในรปแบบของอารเรย เชน array('key1' , 'key2') และหากกรณทตองการระบในแบบ PK->FK กใหประกาศในรปแบบ array('fk'=>'pk') เชน array('fk_c1'=>'pk_c1' , 'fk_c2'=>'pk_c2') , สำหรบความสมพนธในแบบ MANY_MANY ตารางททำหนาทในการเชอมโยง จะตองถกระบไวในสวนของforeign key เชน categories ซงเปนความสมพนธทอยในคลาส Post จะตองระบ foreign key คอ tbl_post_category(post_id, category_id)

V.0.5.130815-091110 p.130

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การประกาศความสมพนธในคลาส AR นนจะสงผลกระทบใหเกดการเพมขนของพรอพเพอรตในคลาสนน ๆ ซงเราสามารถใชคณสมบตของความสมพนธเหลานไดโดยอาศยพรอพเพอรตทเพมขนมาในอนสแตนซ AR เชน หาก $author เปนอนสแตนซของ User เราสามารถใช $author->posts เพอเขาถงความสมพนธกบ Post ได

การดำเนนการกบรเลชนนอลควร (Relational Query)วธทงายกบการดำเนนการรเลชนนอลควรนน ทำไดโดยการเรยกใชรเลชนนอลพรอพเพอรต (relational properties)ของอนสแตนซ AR , รเลชนนอลควรจะดำเนนการโดยการเชอมโยงความสมพนธของสองตารางและกรองขอมลของ AR ปจจบนดวย Primary key ตวอยางเชน

หากการเชอมโยงขอมลนนไมมขอมล กรณทใชความสมพนธแบบ BELONGS_TO และ HAS_ONE ผลลพธจะสงคากลบเปน null และหากใชความสมพนธในแบบ HAS_MANY และ MANY_MANY จะสงคากลบเปนอารเรยเปลา ซงปกตแลว HAS_MANY และ MANY_MANY จะสงคากลบเปนออบเจค

วธการในแบบน (lazy loading)เปนวธการทสะดวก แตอาจไมมประสทธภาพมากนก ตวอยางเชน เราตองการทจะเรยกขอมลนกเขยนสำหรบ N บทความ ทำใหเราจะตองดำเนนการ(join)จำนวน N ครง ซงจะเหนวาคอนขางทจะยงยาก ดงนนเราจงอาจหนมาใชวธแบบ “eager loading” แทน

วธในแบบ “eager loading” จะเรยกใชงานความสมพนธระหวาง AR โดยการเรยกใชเมธอรด with() ของอนสแตนซ AR นน รวมกนกบเมธอรด fnd หรอ fndAll ดงน

จากโคดขางตนจะสงคากลบมาเปนอารเรย ซงไมเหมอนกนกบวธแบบ “lazy loading” ซงสงคากลบเปนออบเจค

V.0.5.130815-091110 p.131

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

ดวยวธการในแบบ “eager loading” เรายงเรยกใชความสมพนธไดมากกวาหนงความสมพนธในเมธอรด with() เชน เราตองการขอมล posts , author , และ categories

เรายงสามารถใชงานวธการแบบ “eager loading” แบบซบซอนแทนแบบอางองชอความสมพนธในแบบปกตในเมธอรด with() เชน

จากตวอยางขางตนจะสงคาทกบทความ(posts) ทเชอมโยงกบนกเขยน(author) และ categories(หมวดหมเนอหา) นอกจากนนยงสงกลบคารายละเอยดผเขยน(profle) และเนอหา(posts) ของผเขยนแตละรายกลบมาอกดวย

หรออาจจะกำหนด with เรยกใชงาน CDbCriteria::with โดยมลกษณะการใชงานดงน

หรอ

V.0.5.130815-091110 p.132

PHP เฟรมเวรค ดวย Yii frameworks โดย อนชต ออนหรญ

การสรางความสมพนธดวยควร โดยไมระบความสมพนธในโมเดลในบางครงเราอาจตองการใชความสามารถของควรในการสรางความสมพนธระหวางตารางโดยทไมตองระบความสมพนธไวในโมเดล เชน นกเขยน(user)หนง ๆ เขยนบทความไดหลายบทความ(post) ซงกอนหนานเราเคยกำหนดความสมพนธทถกกำหนดไวใน post โมเดลทชอวา published

http://www.yiiframework.com/doc/guide/1.1/en/database.arr

V.0.5.130815-091110 p.133