php เฟรมเวิร์ด้วย yii - sci.ru.ac.th ·...
TRANSCRIPT
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 โดย อนชต ออนหรญ
เรมตนไปกบ 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 โดย อนชต ออนหรญ
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 โดย อนชต ออนหรญ
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 โดย อนชต ออนหรญ
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 โดย อนชต ออนหรญ
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 โดย อนชต ออนหรญ
การทำงานกบฟอรม [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 โดย อนชต ออนหรญ
การทำงานรวมกบฐานขอมล [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 โดย อนชต ออนหรญ
การสรางควรเพอจดการกบขอมล ( 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