• Save
Yii
Upcoming SlideShare
Loading in...5
×
 

Yii

on

  • 2,087 views

 

Statistics

Views

Total Views
2,087
Views on SlideShare
1,980
Embed Views
107

Actions

Likes
6
Downloads
0
Comments
1

1 Embed 107

http://hoangduyenmeomun.wordpress.com 107

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • thanks its very useful to me
    how to download this slide
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Yii Yii Presentation Transcript

  • GET THINGS DONE WITH QUICKLY BUILD A WEBAPP USING YII GIULIANO IACOBELLI - @Giuliano84 - me@giulianoiacobelli.com
  • WEB LÀ TẬP HỢP CÁC CÔNG CỤ ĐÁNG KINH NGẠC
  • THÔNG THƯỜNG MỌI THỨ BẮT ĐẦU TỪ Ý TƯỞNG
  • NẾU NÓ LÀ Ý TƯỞNGĐÚNG VÀ THỰC HIỆN TỐT..
  • NẾU BẠN CÓ Ý TƯỞNG, HÃY THỰC HIỆN NÓ.HÃY TIẾN LÊN VÀ KHÁM PHÁ
  • SO LET ME INTRODUCE YOU TO
  • YII LÀ GÌ?Yii là component có tính thể hiện cao -framework PHP căn bản cho lập trình cácứng dụng web có kích cỡ lớn. Nó có khảnăng tái sử dụng lớn trong các chương trìnhweb và có thể đẩy nhanh đáng kể quá trìnhlập trình.
  • NÓ DỄ?NÓ NHANH?NÓ BẢO MẬT? CHUẨN NÓ LÀ(YII) !!!
  • THE MVC PATTERNMVC là mẫu thiết kế mởrộng theo hướng lập trìnhweb nhằm chia các côngviệc một cách logic từ giaodiện người dùng, để các lậptrình viên có thể dễ dàngthay đỗi từng phần màkhông ảnh hưởng đến phầnkhác.
  • THE MVC PATTERN Giả sử một ứng dụng Web gồm có nhiều ứng dụng con:• Front end:webstie công khai cho người dùng bình thường;• Back end: website có tiện ích quản trị dành cho việc quản lý ứng dụng.• Console: Ứng dụng gồm có các câu lệnh điều khiển chạy ở cửa sổ terminal hoặc các công việc được đặt lịch để hỗ trợ cho toàn ứng dụng;• Web API: Cung cấp giao diện tới bên thứ ba để tích hợp vào ứng dụng.
  • M for MODEL Models được sử dụng để lưu trữ dữ liệu và các quy tắc công việc liên quan. Model tiêu biểu cho một đối tượng dữ liệu đơn lẻ, có thể là một hàng trong một bảng cơ sở dữ liệu hoặc là các phần nhập vào form của người dùng.• nên chứa các thuộc tính đại diện cho dữ liệu đặc thù;• nên chứa công việc một cách logic (ví dụ: các quy tắc chuẩn hóa) để chắc chắn dữ liệu tiêu biểu thi hành các yêu cầu thiết kế;• có thể chứa mã để thao tác dữ liệu. Ví dụ, một model SearchForm tiêu biểu cho việc tìm kiếm dữ liệu dữ liệu nhập vào, có thể chứa phương thức search để thực hiện việc tìm kiếm thực sự.
  • C for CONTROLLERController là chất keo gắn models, views và các thành phầnkhác lại với nhau trong một ứng dụng chạy được. Chúng đápứng việc giao dịch trực tiếp với các yêu cầu của người dùngcuối.• Có thể truy cập $_GET, $_POST và các biến PHP khác, tiêu biểu cho các yêu cầu của người dùng;• có thể tạo các đối tượng model và quản lý vòng đời của chúng.• nên tránh việc chứa các câu lệnh SQL nhúng vào, chúng tốt hơn nên được để trong model.• nên tránh việc chứa bất kỳ mã HTML hoặc bất kỳ ngôn ngữ đánh dấu thể hiện nào khác. Nó tốt hơn nên để trong views.
  • V for VIEWView là chương trình PHP gồm có phần lớn các phần tử của giao diện người dùngdựa trên sự phân tách giữa logic và trình bày, phần lớn đoạn logic nên được đặttrong controller hoặc model thay vì để trong view.• nên chứa phần lớn mã trình bày, như HTML và mã PHP đơn giản để duyệt, định dạng và render dữ liệu;• nên tránh chứa mã thể hiện các câu truy vấn db rõ ràng. Mã như vậy nên để ở models.• nên tránh truy cập trực tiếp tới $_GET, $_POST, hoặc các biến tương tự khác tiêu biểu cho các yêu cầu của người dùng cuối. Đây là công việc của controller.
  • CẤU TRÚC CỦA ỨNG DỤNGYII
  • TOÀN BỘ CHƯƠNG TRÌNHĐây là file "bootstrap", nghĩa là tất cả các tương tác người dùng đều quanó. Ví dụ như để hiển thị bản nghi nhân viên thì phải thông qua URL. Nóchỉ là mã PHP mà người dùng cuối có thể yêu cầu trực tiếp thực thi. // Bỏ dòng này đi nếu ở chế độ sản phẩm defined(YII_DEBUG) or define(YII_DEBUG,true); // include file bootstrap Yii require_once(path/to/yii/framework/yii.php); // Tạo một thể hiện của ứng dụng và chạy nó $configFile=path/to/config/file.php; Yii::createWebApplication($configFile)->run();
  • YII WORKFLOW 1 – Yêu cầu bằng URL http://example.com/index.php?r=post/ show&id=1 và Web server kiểm soát yêu cầu này bằng cách thực thi chương trình khởi động index.php. 2 - Mã khởi động tạo ra một thể hiện của ứng dụng và chạy nó. 3 - Ứng dụng thu được thông tin yêu cầu chi tiết của người dùng từ một thành phần ứng dụng đặt tên là request. 4 - Ứng dụng xác định cotroller nào được yêu cầu và thực thi với sự giúp đỡ của thành phần ứng dụng tên là urlManager.
  • YII WORKFLOW 5 - Ứng dụng tạo ra một thể hiện của controller được yêu cầu để kiểm soát xa hơn yêu cầu của người dùng. Controller xác định rằng chương trình hành động này chuyển đến phương thức đặt tên là actionShow trong lớp controller. 6 - Hành động này đọc model Post có ID là 1 từ cơ sở dữ liệu. 7 - Hành động này render view đặt tên là show với model Post. 8 - View đọc và hiển thị các thuộc tính của model Post. 9,10,11 - View thực thi một số widget, nhúng kết quả đã render trong layout và hiển thị nó tới người dùng.
  • OK, OK, I GOT IT, TOO MUCH TALK..CHÚNG TA CÙNG CÓ Ý TƯỞNG ĐỂ XÂY DỰNG..
  • VÀ Ý TƯỞNG TUYỆT VỜI LÀ..
  • BLOG!OK, NÓ KHÔNG TUYỆT VỜI NHƯNG VỚI ĐIỀU NÀY TÔI CHẮC CHẮN LÀ TẤT CẢ CÁC BẠN BIẾT ĐƯỢC CHÚNG TA SẼ XÂY DỰNG CÁI GÌ
  • KHỞI ĐỘNG • TẠO MỘT THƯ MỤC “BLOGDEMO” TRONG THƯ MỤC GỐC APACHE CỦA BẠN • TẢI FILE YiiBlogDemo.zip TỪ http://goo.gl/nOqef VÀ GIẢI NÉN NÓ • MỞ FRAMEWORK.ZIP VÀ ĐẶT NỘI DUNG CỦA NÓ TRONG THƯ MỤC “BLOGDEMO”
  • CHUẨN BỊ YiiChạy câu lệnh console đơn giản“blogdemo/framework/yiic webapp ../“để tạo ra bộ khung ứng dụng Web xây dựng với Yii.Điều này sẽ tạo một khung ứng dụng Yii ở thư mục WebRoot/testdrive.
  • ỨNG DỤNG WEBỨng dụng này có đầy đủ chức năng, với các đặc trưng như ngườidùng đăng nhập và form liên hệ. Đó là điểm bắt đầu tốt cho việcthực hiện các đặc trưng phức tạp hơn.
  • BLOG THƯỜNG CÓ GÌ? • BÀI VIẾT • NGƯỜI DÙNG • BÌNH LUẬN • TAG
  • DBSCHEMA.SQL
  • CÀI ĐẶT CƠ SỞ DỮ LIỆUreturn array( ...... components=>array( ...... db=>array( connectionString => mysql:host=localhost;dbname=blog, emulatePrepare => true, username => root, password => , charset => utf8, tablePrefix => tbl_, ), ), ......);
  • SINH MODELSChúng ta cần tạo lớp model cho các bảng cơ sở dữ liệu. Yii có một thành phầntuyệt vời là Gii nó hoàn toàn tự động tiến trình này (gọi là scaffolding) chochúng ta. modules=>array( gii=>array( class=>system.gii.GiiModule, password=>pick up a password here, ), ),
  • MODEL GENERATOR Gii
  • CÁC MODEL TA CÓ• User.php chứa lớp User và có thể được sử dụng để truy xuất bảng tbl_user;• Post.php chứa lớp Post và có thể được sử dụng để truy xuất bảng tbl_post;• Tag.php chứa lớp Tag và có thể được sử dụng để truy xuất bảng tbl_tag;• Comment.php chứa lớp Comment và có thể được sử dụng để truy xuất bảng tbl_comment;• Lookup.php chứa lớp Lookup và có thể được sử dụng để truy xuất bảng tbl_lookup.
  • CRUD OPERATIONSSau khi tạo các lớp model, ta có thể sử dụng CrudGenerator để sinh ra mã thực thi CRUD operation chonhững model này. Chúng ta sẽ làm điều này cho các modelPost và Comment.
  • AUTHENTICATING USERỨng dụng blog của ta cần phân biệt giữa chủ hệ thốngvà người dùng vãng lai. Vì vậy, ta cần thực hiện tínhnăng xác thực người dùngXác thực người dùng được thực thi trong class thực hiệngiao diện IUserIdentity. Khung ứng dụng sử dụng lớpUserIdentity cho mục đích này.Lớp này được lưu trong file /wwwroot/blogdemo/protected/components/UserIdentity.php.
  • AUTHENTICATING USERỨng dụng đã cung cấp xác thực người dùng bằngcách kiểm tra username và password đều là demohoặc admin.Bây giờ ta sẽ chỉnh sửa mã tương ứng để việc xácthực được hoàn thiện dựa trên bảng User.
  • EDITING USERIDENTITY.PHPpublic function authenticate(){ $username=strtolower($this->username); $user=User::model()->find(LOWER(username)=?,array($username)); if($user===null) $this->errorCode=self::ERROR_USERNAME_INVALID; else if(!$user->validatePassword($this->password)) $this->errorCode=self::ERROR_PASSWORD_INVALID; else { $this->_id=$user->id; $this->username=$user->username; $this->errorCode=self::ERROR_NONE; } return $this->errorCode==self::ERROR_NONE;}public function getId(){ return $this->_id;}
  • RECAP• Xác định các yêu cầu cần hoàn thiện;• Chúng ta cài đặt Yii framework và tạo khung ứng dụng;• Chúng ta thiết kế và tạo cơ sở dữ liệu của blog;• Chúng ta tạo ra CRUD operation cơ bản;• Chúng ta chỉnh sửa phương thức xác thực để kiểm tra dựa vào bảng tbl_user.
  • CUSTOMIZING POST MODELViệc sinh model Post là được rồi nhưng giờ chúng ta cầnchỉ rõ các quy tắc chuẩn hóa và các đối tượng liên quan• Các quy tắc chuẩn hóa đảm bảo các giá trị của thuộc tính đưa vào bởi người dùng là chuẩn xác trước khi chúng được lưu vào cơ sở dữ liệu. Ví dụ, trạng thái thuộc tính của Post sẽ là số 1,2, hoặc 3.• Tùy biến quan hệ chúng ta có thể khai thác sức mạnh của đặc tính bản ghi quan hệ hiện thời (Relational ActiveRecord (RAR)) để truy xuất thông tin đối tượng liên quan của bài viết,ví dụ như tác giả và bình luận của bài viết, không cần đến việc viết các câu lệnh SQL phức tạp.
  • VALIDATION RULESDựa trên yêu cầu vừa phân tích, chúng ta chỉnhsửa phương thức rules() như sau:public function rules(){ return array( array(title, content, status, required), array(title, length, max=>128), array(status, in, range=>array(1,2,3)), array(tags, match, pattern=>/^[ws,]+$/, message=>Tags can only contain word characters.), array(tags, normalizeTags), array(title, status, safe, on=>search), );}
  • MODEL RELATIONSChúng ta tùy biến phương thức relations() như sau:public function relations(){ return array( author => array(self::BELONGS_TO, User, author_id), comments => array(self::HAS_MANY, Comment, post_id, condition=>comments.status=.Comment::STATUS_APPROVED, order=>comments.create_time DESC), commentCount => array(self::STAT, Comment, post_id, condition=>status=.Comment::STATUS_APPROVED), );}Chúng ta cũng giới thiệu trong lớp class Comment extends CActiveRecord {model Comment hai hằng số sử const STATUS_PENDING=1;dụng ở phương thức trên: const STATUS_APPROVED=2; ...... }
  • REPRESENTING STATUS IN TEXTVì trạng thái của bài viết được lưu vào cơ sở dữ liệu dưới dạngsố, nên chúng ta cần cung cấp văn bản đại diện để nó trựcquan hơn khi được hiển thị tới nhiều người dùng cuối. Ở hệthống lớn, yêu cầu như vậy là rất phổ biến.Như một giải pháp chúng, chúng ta sử dụng bảng tbl_lookupđể lưu bản đồ giữa các giá trị số và các văn bản đại diện, nócần thiết cho những đối tượng dữ liệu khác nữa.Chúng ta chỉnh sửa lớp model Lookup như sau để truy cập dễdàng hơn vào dữ liệu văn bản trong bảng.
  • LOOKUP.PHPclass Lookup extends CActiveRecord{ private static $_items=array(); public static function items($type) { if(!isset(self::$_items[$type])) self::loadItems($type); return self::$_items[$type]; } public static function item($type,$code) { if(!isset(self::$_items[$type])) self::loadItems($type); return isset(self::$_items[$type][$code]) ? self::$_items[$type][$code] : false; } private static function loadItems($type) { self::$_items[$type]=array(); $models=self::model()->findAll(array( condition=>type=:type, params=>array(:type=>$type), order=>position, )); foreach($models as $model) self::$_items[$type][$model->code]=$model->name; }}
  • POST POSSIBLE STATUSES class Post extends CActiveRecord { const STATUS_DRAFT=1; const STATUS_PUBLISHED=2; const STATUS_ARCHIVED=3; ...... }Bây giờ chúng ta có thể gọi Lookup::items(PostStatus) đểlấy danh sách của các trạng thái bài viết có thể (chuỗi vănbản được đánh chỉ mục bằng các giá trị dạng số trả về), vàgọi Lookup::item(PostStatus,Post::STATUS_PUBLISHED) để lấy chuỗi đại diện củatrạng thái được xuất bản.
  • CONFIGURING ACCESS RULESpublic function accessRules(){ return array( array(allow, // cho phép tất cả người dùng thực thi các hành động list và show actions=>array(index, view), users=>array(*), ), array(allow, // cho phép người sử dụng đã được xác thực thực thi bất kỳ hành động nào users=>array(@), ), array(deny, // từ chối mọi người dùng users=>array(*), ), );} Các trạng thái quy tắc: mọi người dùng có thể truy cập vào hành động index và view, còn người dùng đã được xác thực thì có thể truy cập vào bất kỳ hành động nào, kể cả hành động quản trị.
  • CREATE AND UPDATECác hoạt động tạo và cập nhật là tương tự. Cả hai cần hiển thị formHTML để thu thập những cái người dùng nhập vào, chuẩn hóachúng, và lưu chúng vào cơ sở dữ liệu.Gii sinh ra một phần của view /wwwroot/blog/protected/views/post/_form.php nó được nhúng vào cả view tạo và cập nhật đểrender ra form HTML cần thiết.Chúng ta muốn thêm danh sách thả xuống để thu thập thông tinnhập vào của người dùng cho thuộc tính STATUSecho $form->dropDownList($model,status,Lookup::items(PostStatus));
  • CREATE AND UPDATESau đó ta chỉnh sửa lớp Post để nó có thể tự động thiết lập mộtvài thuộc tính (create_time, author_id) trước khi bài viết đượclưu vào cơ sở dữ liệu. Ta ghi đè lên phương thức beforeSave()như sau protected function beforeSave() { if(parent::beforeSave()) { if($this->isNewRecord) { $this->create_time=$this->update_time=time(); $this->author_id=Yii::app()->user->id; } else $this->update_time=time(); return true; } else return false; }
  • CÁC VẤN ĐỀ VỀ STYLE
  • LÀM THẾ NÀO ĐỂ MƯỢN STYLE? http://twitter.github.com/bootstrap
  • QUICKLY BUILD A NICE UI
  • WEB LÀ MỘT KHÁI NIỆM THẬT SỰ RỘNG LỚN
  • ĐẦU TIÊN LÀĐIỆN THOẠI!
  • HÃY NHÌN VÀO CÁC CON SỐ http://www.phonecount.com/pc/count.jsp
  • KIẾN THỨC VỀ THIẾT KẾ TƯƠNG TÁC
  • BOOTSTRAP RESPONSIVENESSNó hỗ trợ một số media queries nằm trong một file đơngiúp cho dự án của bạn thích hợp trên nhiều thiết bị và độphân giải màn hình khác nhau. @media (min-width:400px) { }
  • Cảm ơn Giuliano Iacobelli giuliano.iacobelli me@giulianoiacobelli.com http://giulianoiacobelli.com Connect with me:Ps: slide 47 and 48 were borrowed from this amazing presentation of Brad Frost