Các controller đóng vai trò mấu chốt trong những ứng dụng xây dựng bằng Hiphop framework. Controller được khai báo như là một PHP class bình thường, mở rộng (extends) từ lớp Controller cơ sở trong Hiphop. Tên của Controller class luôn phải trùng
với tên file chứa nó và viết hoa chữ cái đầu tiên. Ví dụ: file header.php chứa class
Header.
Trong Hiphop framework, các lớp controller được phân chia làm hai loại: controller gốc và controller con (cấp 1, 2…) tùy theo cấp của các thành phần View mà các lớp Controller gọi tới.
- Controller gốc: được đặt tên dựa theo các URL, các phương thức bên trong controller gốc tạo ra tùy thuộc vào yêu cầu gửi từ mỗi URL. Một lớp Controller gốc thường chứa nhiều method và đó chính là điểm vào chương trình và là nơi HTML page được sinh ra. Một controller gốc có thể chứa nhiều con là controller con cấp 1.
- Controller con: là một controller, chỉ có thể được gọi từ controller mức trên của mình mà không thể gọi trực tiếp qua URL. Controller con có nhiệm vụ chính là trả về cho controller cha thành phần View do chính controller này đảm nhiệm thông qua các dịch vụ lấy từ Model. Để khai báo các “con” của mình, controller cần khai báo một mảng gồm danh sách tên các controller con thông qua biến $this->children. Controller con chỉ chứa duy nhất một hàm có tên index().
Ví dụ về cây phân cấp controller một trang web trong Hiphop:
Controller gốc
Controller cấp 1 Controller cấp 2 Controller cấp 3
Hình 3.0.13 Minh họa Sơ đồ phân cấp controller trang chủ 3.3. View - Template
View đơn giản là một trang web hoặc một thành phần nhỏ trên trang (VD: header, footer, sidebar…) được định nghĩa bằng các file php chứa mã HTML và các biến logic, đặt trong thư mục application/views/. View không bao giờ được gọi một cách trực tiếp mà phải được gọi qua một Controller cụ thể. Mỗi controller “sở hữu” một view riêng biệt bằng cách khai báo biến $this->template trong nó.
Xét một ví dụ đơn giản để hiểu hơn về các khái niệm controller, view trong Hiphop framework.
Khi người dùng gõ vào thanh địa chỉ (address bar) của trình duyệt để tải về trang web có URL:
yoursite.com/index.php?route=blog/
Hiphop sẽ tìm tới file controller được đặt tên blog.php và nạp file này.
Chúng ta sẽ tìm hiểu cách thức tạo ra một lớp Controller thực sự trong một ứng dụng. Sử dụng một text editor, tạo file có tên blog.php có nội dung như sau và đặt vào thư mục
application/controllers/
class Blog extends Controller { function __construct() { parent::__construct(); }
function index() {
$this->template = "blogview"; $this->children = array("header"); $this->render(TRUE);
} }
Trong ví dụ trên, controller gốc là Blog, controller con cấp một là Header được khai báo trong mảng $this->children().
Biến $this->children(): Khai báo các Controller con của Controller hiện tại
Biến $this->template(): Khai báo đường dẫn file View, chỉ ra template (view) của controller hiện tại. Trong mỗi controller việc khai báo template là điều
bắt buộc.
Biến $this–>data: là biến kiểu array, được truyền tới blogview để hiển thị sau khi gọi hàm $this–>render(TRUE)trong phương thức index.
Lời gọi hàm $this–>render(TRUE): Là lời gọi bắt buộc phải có trong mỗi phương thức của controller. Tham số đi kèm là TRUE nếu controller này là controller gốc, là FALSE nếu controller là controller con. Dòng này thực thi các code PHP có trên view và trả lại một string chứa mã HTML cho toàn bộ trang nhưng không in chúng ra, thay vào đó, giá trị này được truyền vào biến $output khởi tạo từ class Output, một lớp có chức năng xử lý giao thức HTTP và trả lại cho trình duyệt. $this->render(params) luôn là dòng được viết cuối cùng trong
phương thức.
Đây là các ràng buộc mà các lập trình viên phải tuân thủ khi xây dựng các ứng dụng để Hiphop framework hiểu và hỗ trợ.
Như đã nói ở trên, Segment thứ hai của URL chỉ ra phương thức nào trong Controller gốc sẽ được thực hiện. Khi Segment thứ hai trống, mặc định Hiphop sẽ thực hiện toàn bộ các dòng code nằm bên trong phương thức index(). Các method này chỉ là nơi điều phối các lớp khác để sinh ra HTML chứ không trả về HTML một cách trực tiếp cho trình duyệt thông qua giao thức HTTP.
Trở lại ví dụ trên, hãy tạo một file có tên blogview.php cónội dung như sau và đặt vào thư mục application/views/. Đây chính là thành phần View của Blog controller.
<?php echo $header;?>
<h1><?php echo $message;?></h1> </body>
</html>
Tiếp theo, tạo Header controller (controller con) bằng cách tạo file header.php có nội dung như sau, đặt vào thư mục application/controller/
class Header extends Controller { function __construct() { parent::__construct(); }
function index() {
$this->id = 'header';
$this->data['title'] = 'Demo Blog'; $this->template = "header_view"; $this->render(FALSE);
}
Biến $this->id là thành phần bắt buộc phải khai báo trong mỗi Controller con, giá trị của biến $this->id sẽ được dùng làm tên biến truyền vào thành phần View của Controller cha, biến này chứa toàn bộ mã HTML do view của controller đó sinh ra. Nhìn vào dòng đầu tiên của blogview.php ta sẽ thấy biến $header được echo, đây chính là View của Header controller.
Hình 3.0.14 blogview.php Hình 3.0.15 header.php
<html> <head>
<title><?php echo $title;?></title> </head>
<body>
Bây giờ, mở lại URL ban đầu bằng trình duyệt. Kết quả trên màn hình là trang web có title “Demo Blog” cùng dòng chữ: “Welcome to My Blog”
3.4. Các lớp Model
Các lớp Model là các PHP class thừa kế từ lớp Model cơ sở của Hiphop framework, được thiết kế với mục đích chính là xử lý các thông tin trong database. Ví dụ, để quản lý một Blog, bạn cần có một lớp model chứa các hàm làm các nhiệm vụ như: thêm, sửa, xóa hoặc đọc các dữ liệu bài viết.
class Blog_model extends Model { function __construct() { parent::__construct(); } function getTenEntries() {
$query = $this->db->query('SECLECT * FROM entry LIMIT 10, 0'); return $query->result_array();
}
function insertEntry() {
$this->db->query(“INSERT INTO entry VALUE {$_POST['title']}”s); }
}
Các model được đặt trong thư mục application/model/. Có thể đặt vào các thư mục con trong của application/model/. Nguyên mẫu cơ bản của một lớp Model:
function __construct() {
parent::__construct(); }
}
Tên file chứa class này có dạng: model_name.php, trùng với tên class Model. Chú ý rằng, tên của class Model bắt buộc phải viết hoa chữ cái đầu tiên.
Các class Model được nạp và gọi từ các phương thức trong lớp Controller. Để làm được điều này, trong phương thức của Controller phải có hàm:
$this->load->model('Sub_folder/Model_name', 'name_object');
Tham số thứ hai định nghĩa tên của đối tượng được khởi tạo từ class Model_name. Nếu không có tham số thứ 2, tên của đối tượng này sẽ được Hiphop framework đặt trùng với tên của class Model. Chúng ta có thể truy cập tới các phương thức của lớp Model một cách dễ dàng sau khi đã load Model:
$this->load->model('Model_name', 'name'); $this->name->functionInModel();
Dưới đây là ví dụ về một lớp controller, lấy dữ liệu từ Model và truyền vào View class Blog extends Controller {
function index() {
$this->load->model('Blog_model');
$this->data['entries'] = $this->Blog_model->getNewsEntries(); $this->template = 'blog_view';
$this->render(TRUE); }
CHƯƠNG 4: HỆ THỐNG CÁC LỚP THƯ VIỆN VÀ HÀM HỖ TRỢ - LIBRARY & HELPER
Hệ thống lớp thư viện và hàm hỗ trợ trong Hiphop giúp các lập trình viên thao tác trong việc xây dựng ứng dụng của mình nhanh và hiệu quả hơn. Chương này giới thiệu đầy đủ các lớp thư viện (library) và các hàm trợ giúp trong Hiphop cũng như cách thức sử dụng chúng trong quá trình xây dựng ứng dụng.
4.1 Các lớp thư viện4.1.1. Email library 4.1.1. Email library
Là công cụ mạnh mẽ giúp đơn giản hóa việc gửi email. Lớp thư viện Email hỗ trợ các tính năng sau đây:
Hỗ trợ đa giao thức: Mail, Sendmail và SMTP
CC and BCCs
Email dạng chữ (text) hoặc HTML
Hỗ trợ gửi file đính kèm
Sau đây là ví dụ minh họa việc gửi mail trong Hiphop dễ dàng thế nào.
$this->load->library('email');
//Cấu hình việc gửi email
$config['protocol'] = 'sendmail';
$config['mailpath'] = '/usr/sbin/sendmail'; $config['charset'] = 'iso-8859-1';
$config['wordwrap'] = TRUE;
$this->email->initialize($config);
$this->email->setFrom('your@example.com', 'Your Name'); $this->email->setTo('someone@example.com');
$this->email->setCC('cc@example-mail-box.com'); $this->email->setBCC('bcc@ example-mail-box.com'); $this->email->setSubject('Testing email class');
$this->email->setMessage('Testing the email class.');
$this->email->send();
Với trường hợp gửi tới nhiều địa chỉ mail, chỉ cần làm như đoạn code sau:
$list = array('one@example.com', 'two@example.com', 'three@example.com'); $this->email->to($list);
Hàm $this->email->attach() giúp gửi file đính kèm. Đặt đường dẫn file đính kèm trong tham số đầu tiên của hàm:
$this->email->attach('/path/to/photo1.jpg'); $this->email->attach('/path/to/photo2.jpg'); $this->email->attach('/path/to/photo3.jpg'); $this->email->send();
4.1.2. Database library
Trước khi làm việc với thư viện này, cần thiết đặt các thông số kết nối như username,
password, tên database trong file system/config/database.php theo mẫu sau: $currentConnection = 'default'; $db['default']['hostname'] = "localhost"; $db['default']['username'] = "root"; $db['default']['password'] = ""; $db['default']['database'] = "database_name_1"; $db['default']['dbdriver'] = "mysql";
Lý do mảng $db phải ở dạng hai chiều có liên quan tới tính năng hỗ trợ nhiều kết nối tới nhiều cơ sở dữ liệu của Hiphop framework. Ví dụ, trong ứng dụng của bạn cần tới một kết nối tới database khác, chỉ cần thêm thiết đặt sau vào file database.php bên trên:
$db['test']['hostname'] = "localhost"; $db['test']['username'] = "root"; $db['test']['password'] = "";
$db['test']['database'] = "database_name_2"; $db['test']['dbdriver'] = "mysql";
“Test” là một tên ngẫu nhiên ta đặt cho kết nối thứ hai. Tương tự chúng ta có thể định nghĩa các kết nối khác một cách dễ dàng.
Theo mặc định, sau khi câu lệnh: $this->load->database();
được thưc hiện, kết nối default sẽ mặc định được nạp vào controller (cụ thể là biến
Sau khi nạp một kết nối database, chúng ta có thể dùng được các phương thức trong lớp Database để tương tác với database qua kết nối này.
a. escape()
Tự động thêm ký tự nháy đơn (‘) cho tham số trong hàm. Hàm này đặc biệt hữu ích trong việc viết các câu truy vấn an toàn nhằm tránh lỗi SQL Injection.
$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
b. query()
$query = $this->db->query('YOUR QUERY’);
Hàm query() trả về một đối tượng kết quả database. Khi câu lệnh Query có kiểu “Đọc” (SELECT), nó trả về một đối tượng và khi đó chúng ta có thể dùng các hàm result_array(), num_rows()… dưới đây. Khi câu lệnh query là kiểu “Ghi”
(UPDATE, DELETE, INSERT), nó trả về TRUE hoặc FALSE tương ứng với trạng thái thành công hay thất bị của câu truy vấn.
c.result_array
Trả về kết quả truy vấn dưới dạng mảng, mảng rỗng khi không có kết quả nào được tìm thấy trong câu truy vấn. Hàm này thường được sử dụng trong các câu lệnh lặp:
$query = $this->db->query("YOUR QUERY"); foreach ($query->result_array as $row) { echo $row['title']; echo $row['name']; echo $row['body']; } d.num_rows
Hàm này trả lại số dòng của kết quả câu truy vấn
$query = $this->db->query('SELECT * FROM my_table'); echo $query->num_rows;
Hàm này trả về một hàng kết quả của câu truy vấn. Tham số trong hàm chỉ ra thứ tự của hàng được lấy, nếu hàm không chứa tham số, mặc định hàng đầu tiên của truy vấn sẽ được trả về.
$query = $this->db->query("YOUR QUERY"); if ($query->num_rows() > 0) { $row = $query->row(); echo $row['title']; echo $row['name']; echo $row['body']; }
4.1.3. Phân trang với Pagination class
« First < 1 2 3 4 5 > Last »
Giả sử bạn muốn tạo các liên kết để chuyển hướng trang của bạn sang một trang khác như trên, chỉ cần làm theo ví dụ sau:
$page = $this->get['page']; $this->load->library('pagination'); $config['total’] = '200'; $config['limit'] = '20'; $config['page'] = $page; $config[‘style_links’] = ‘css_class_links’; $config['$style_results'] = 'css_class_results'; $config['url'] = site_url('home/listEntry&page=%s’); //Khởi tạo các giá trị thiết đặt để tạo link phân trang $this->pagination->initialize($config);
echo $this->pagination->createNavigation();
4.1.4 Quản lý session của PHP với session class
Để sử dụng được thư viện này, cần nạp vào controller bằng đoạn mã sau: $this->load->library(‘session’);
Dùng các hàm set(), get() để tạo session và lấy các giá trị của session: $this->session->set(‘name_session_1’, ‘gia_tri_session_1’);
$this->session->set(‘name_session_1’, ‘gia_tri_session_1’);
4.1.5 Tạo ảnh Captcha ngặn chặn các chương trình tự động
Để sử dụng, cần nạp thư viện này vào Controller bằng đoạn mã sau: $this->load->library(‘captcha’);
Các hàm có thể sử dụng:
a. getCode()
Khi thư viện captcha được nạp, nó sẽ tự động sinh ra một chuỗi ký tự ngẫu nhiên. Bạn dùng hàm này để lấy chuỗi ngẫu nhiên đó, phục vụ cho mục đích kiểm tra chuỗi số nhập vào của người dùng có có trùng với chuỗi ngẫu nhiên dc sinh ra hay không. $this->session->set('captcha') = $this->captcha->getCode();
b. showImage()
Hiển thị ảnh captcha cho người dùng: $this->captcha->showImage();
4.1.6 Tải file lên server với Upload class
Việc upload file trên server thực sự dễ dàng với thư viện upload của Hiphop framework. $config['upload_path'] = './uploads/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '1000'; $config['max_width'] = '800'; $config['max_height'] = '600'; $this->load->library('upload', $config); $this->upload->do_upload();
Để lấy các thông tin trả về của file đã upload, chỉ cần gọi hàm: $this->upload->data();
Những thông tin này ở dạng mảng (array), bao gồm các thông tin như ví dụ sau: Array
(
[file_type] => image/jpeg [file_path] => /path/to/your/upload/ [orig_name] => mypic.jpg [file_extension] => .jpg [file_size] => 22.2 [image_width] => 800 [image_height] => 600 [image_type] => jpeg )
4.1.7 Tải file với giao thức FTP - FTP class
Như cách sử dụng các thư viện thông thường, để sử dụng được FTP class, bạn cần thêm hàm sau trong Controller:
$this->load->library(‘ftp’);
Sau khi được nạp, biến $this->ftp sẽ chứa toàn bộ đối tượng FTP được khởi tạo từ FTP class. Các hàm sẵn có:
a. $this->ftp->connect()
Kết nối và đăng nhập vào server với các thông tin đăng nhập. Hàm này phải được dùng đầu tiên khi muốn làm việc với server qua giao thức FTP
$config['hostname'] = 'ftp.example.com'; $config['username'] = 'your-username'; $config['password'] = 'your-password'; $config['port'] = 21; $config['passive'] = FALSE; $config['debug'] = TRUE; $this->ftp->connect($config); b. $this->ftp->chmod()
Thiết đặt quyền hạn cho file hoặc thư mục trên server. Ví dụ: $this->ftp->chmod(‘/public_html/’, 777);
c. $this->ftp->list_files()
$list = $this->ftp->list_files('/public_html/');
d. $this->ftp->close()
Đóng kết nối tới máy chủ, sử dụng khi hoàn thành các công việc cần làm với kết nối FTP vừa tạo.
4.2 Các Helper4.2.1. Array Helper 4.2.1. Array Helper
Nằm trong file system/helpers/array_helper.php
Bao gồm các hàm có chức năng hỗ trợ làm việc, xử lý mảng.
Để sử dụng được các hàm trong file này, cần dòng khai báo sau trong Controller: $this->load->helper(‘array’);
Các hàm có thể sử dụng:
a. element()
Cho phép nạp thêm phần tử vào mảng, hàm này kiểm tra xem có chỉ số mảng này ko và giá trị tương ứng của nó. Nếu một giá trị tồn tại thì trả lại giá trị đó, nếu giá trị ko tồn tại thì trả lại giá trị false, bất kể bạn có xác định các giá trị mặc định qua ba biến.
Ví dụ:
$array = array('color' => 'red', 'shape' => 'round', 'size' => ''); echo element('color', $array); // returns "red"
echo element('size', $array, NULL); // returns NULL
b.random_element()
Trả về giá trị ngẫu nhiên của một mảng. $ran = array(‘1’, ‘2’, ‘4’); echo random_element($ran);
4.2.2. Text Helper
Bao gồm các hàm hỗ trợ làm việc với text
$this->load->helper(‘text’); Các hàm có thể sử dụng:
a. word_cutter()
Cắt xén một xâu ra các từ với độ dài mong muốn Ví dụ:
$string = "UET is the only Vietnamese university having one among the best 100 students";
$string = word_cutter($string, 4); // Returns: UET is the only…
Tham số thứ ba là hậu tố thêm vào string, mặc định là dấu(3 chấm) …
b. character_cutter()
Cắt xâu thành các ký tự có độ dài xác định. Hàm này luôn đảm bảo sự toàn vẹn của các từ nên có thể số ký tự của xâu kết quả có thể sai số không đáng kể.
Ví dụ:
$string = "UET is the only Vietnamese university having one among the best 100 students";
$string = character_cutter($string, 20); // Returns: UET is the only Vietnamese …
Tham số thứ ba là hậu tố thêm vào xâu, nếu không khai báo thì helper mặc định là dấu … c. highlight_code()
Tô màu xâu ký tự.