Quy trình xử lý một yêu cầu của ứng dụng viết bởi PHP Framework được mô tả qua sơ đồ sau (Xem hình 2.4):
Bước 1: File index.php được dùng như một front controller, có nhiệm vụ khởi tạo các tài nguyên cơ bản cần thiết cho việc chạy Framework thử nghiệm.
Bước 2: File ini.php kiểm tra HTTP request để xác nhận những việc phải làm, và tiến hành xử lý dữ liệu bằng cách gọi lớp join_path để trả về cho user.
Bước 3: Lớp join_path tiến hành xử lý dữ liệu, ở đây chính là xử lý model - view - controller. Lớp join_path sẽ ghép các thành phần Model, View, Controller lại với nhau. Với việc quy định các file trong Controller, View được đặt tên: Controller_ini, và View_ini sẽ giúp cho lớp join_path sẽ dễ dàng gọi, và ghép các thành phần Controller và View liên quan đến nhau thông qua địa chỉ URL và giá trị biến ini
Bước 4: Cuối cùng thành phần View được gọi và gửi tới trình duyệt. 2.2.2.2. Các thành phần
Các thành phần cốt lõi trong Framework thử nghiệm bao gồm:
File index.php: Khi user yêu cầu, file index.php ở bên ngoài sẽ đóng vai trò tiếp nhận thông tin đầu tiên, sau đó nó sẽ khởi tạo các lớp cơ sở (ở file
Registry.php trong Core_Ac, và mysql.php trong Database) và triệu gọi các hàm
(ở file load_common.php, common.php, ini.php trong Core_Ac, và ini.php
View View
Model Controller Index.php
Hình 2.4. Quy trình xử lý một HTTP Request của Framework thử nghiệm
ini.php
View View
Model Controller Index.php
autoload.php trong Lib) để có thể load các lớp hoặc các hàm tương ứng. Trong
đó quan trọng nhất là 3 thành phần Registry, load_common và autoload. - Class Registry (system/Core_Ac/Registry.php): Là một final class.
Registry đóng vai trò làm thư viện đăng ký với hệ thống các class sử dụng.
- Function autoload (system/Lib/autoload.php): là hàm có nhiệm vụ tự động khởi tạo các class khi được triệu gọi mà chưa được khai báo với hệ thống.
- Function load_common (system/Core_Ac/load_common.php): là một hàm có vai trò load các common vào trang. Ví dụ như ini.php.
Trong thư mục Core_Ac tập trung các thành phần đóng vai trò xử lý các yêu cầu của user, bao gồm các request với thành phần xử lý chính là ini.php. ini sẽ triệu gọi các thành phần cần thiết để xử lý dữ liệu trả về cho user, ở đây là xử lý mvc tương ứng với tham số truyền biến ini trên address, thông qua lớp
join_path.
Class join_path (system/Core_Ac/Join_path.php): là một lớp có vai trò ghép các thành phần của Model, View, Controller.
File Config.php (system/config.php): chứa toàn bộ cấu hình hệ thống. File mysql.php (system/Database/mysql.php): Database là phần PHP giao tiếp tốt nhất. Các hệ quản trị cơ sở dữ liệu mở mạnh mẽ và phong phú: OCI (Oracle đóng góp), DB2 (IBM đóng góp), libmysql (MySQL AB đóng góp), pgsql do cộng đồng PostgreSQL đóng góp và luôn hỗ trợ các bản database mới nhất. Ngoài ra PHP có sẵn một database server SQLite nhúng đi kèm với mọi bản PHP 5.0+ có thể giúp các lập trình viên tiện trong việc xử lý các nhóm data nhỏ nhưng đủ mạnh mẽ như Microsoft Access. Framework thử nghiệm cung cấp một thư viện giao tiếp với MySql - hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến nhất thế giới và được các nhà phát triển rất ưa chuộng khi lựa chọn giải pháp lưu trữ thông tin. Thư viện này không chỉ giúp tiết kiệm được thời gian khi lập trình viên làm việc với hệ thống database mà còn giúp lập trình viên tránh được các lỗi báo mật (SQL Injection) khi viết câu lệnh SQL.
Các thư viện – Library (các class trong system/Lib): Framework thử
nghiệm cung cấp một tập hợp các thư viện hỗ trợ lập trình đa dạng, giúp các lập trình viên xây dựng ứng dụng web nhanh và hiệu quả hơn. Mỗi thư viện thực chất là một PHP class chứa nhiều các phương thức trong nó, và cũng có thể được gọi như những lớp Model. Đặc biệt với Framework thử nghiệm khi sử dụng các lớp trong thư viện lập trình viên có thể sử dụng nó mà không cần phải khai báo (name_class::function(): sử dụng hàm function trong name_class). Với lớp Registry (system/Core_Ac/Registry.php) - Framework thử nghiệm sẽ tự động dò tìm và khai báo với hệ thống các lớp sử dụng, và với hàm autoload
(system/Core_Ac/autoload.php) -Framework thử nghiệm sẽ tự động khởi tạo các lớp để sử dụng.Ví dụ: với session::set('taikhoan',$this->arrlogin[0]['L_User']), Framework thử nghiệm sẽ dò tìm xem đã khai báo class session chưa, nếu chưa nó sẽ tự động dò tìm trong system/Lib và khai báo cho hệ thống để sử dụng. Ngoài ra với Framework thử nghiệm người sử dụng có thể mở rộng thư viện theo ý của riêng mình, với điều kiện là tên của class phải trùng với tên file và được đặt trong thư mục Lib.
Các hàm trợ giúp – Helper (đặt trong system/Helpers): Không giống với
Library, Helper không phải là một class hướng đối tượng, chỉ là một file chứa một hoặc nhiều hàm cùng tập trung hỗ trợ một nhiệm vụ cụ thể trong quá trình xây dựng ứng dụng. Ví dụ: Cookie Helper là chứa một tập hợp các hàm xử lý các vấn đề liên quan tới cookie (thiết đặt/sửa/xóa cookie). Tuy nhiên cũng giống với Library, lập trình viên cũng có thể sử dụng các Helper mà không cần phải khai báo.
2.2.2.3. Các khái niệm khi sử dụng framework thử nghiệm
Một số các khái niệm ban đầu khi sử dụng Framework thử nghiệm xây dựng ứng dụng web:
Địa chỉ URL: Framework thử nghiệm nhìn website như một tập các trang web rời rạc, gắn kết với nhau qua URL và hệ thống thư viện mức code. URLs trong Framework thử nghiệm được thiết kế nhằm mục đích thân thiện cả cho người và các bộ máy tìm kiếm.
yousite.com/index.php?ini = value
Giá trị của biến ini được truyền qua chuỗi truy vấn (query string) được coi như dữ liệu vào, Framework thử nghiệm dùng giá trị này để xác định Controller nào sẽ được gọi để thực hiện yêu cầu của người dùng. Ví dụ:
yousite.com/index.php?ini = lop&code = K12CD.CNTT1
Khi nhận được URL này từ trình duyệt, Framework thử nghiệm sẽ khởi tạo một đối tượng từ class Controller_Lop (trong system/Application/Controller) và thực hiện phương thức tương ứng với sự kiện người dùng lựa chọn (ở ví dụ trên là sự kiện sửa thông tin lớp K12CD.CNTT1)
Lớp Model: là một php class kế thừa lớp mysql, được thiết kế nhằm mục đích xử lý các thông tin trong cơ sở dữ liệu như chèn, sửa, xóa,… dữ liệu.
<?php
class Model extends mysql {
public $results;
}
public function getall($sql_str){
$results = $this->get_list($sql_str); return $results; } function __destruct() { } } ?>
Các lớp trong Controller: Các controller đóng vai trò mấu chốt trong những ứng dụng xây dựng bằng Framework thử nghiệm. Trong các Controller đều phải khai báo đối tượng Model để sử dụng trong việc xử lý dữ liệu trả về cho View tương tứng. Tên của lớp Controller phải luôn luôn trùng tên với file chứa nó, và nó sẽ được đặt tên dựa theo URL (có định dạng Controller_ini, với ini được lấy từ địa chỉ của trang). Ví dụ: với trang localhost/index.php?ini=lop, sẽ có lớp Controller tương ứng với nó là Controller_lop ở trong file Controller_lop.php.Một lớp Controller có thể có nhiều phương thức, và đó chính là điểm vào của chương trình và là nơi trang HTML được sinh ra.
<?php class Controller_lop { private $model; public $_thongbao; public $_lop; public $_lopedit;
public function __construct(){ $this->model = new Model();
$this->_thongbao=''; $this->_lop= $this->_lop(); if (isset($_GET['code'])) { $this->_lopedit=$this->_lopedit(); } if(isset($_POST['btn_save'])){ $this->btn_save(); } if(isset($_POST['btn_delete'])){ $this-> btn_delete();
} }
public function _lopedit(){
return $this->model->getall("select * from
tbl_class where Code_Class='". $_GET['code']."'"); }
public function _lop(){
return $this->model->getall('select * from
tbl_class order by Name_Class'); }
public function btn_save() { if(!$_GET['code']){ $this->model- >insert('tbl_class',array('Code_Class'=>$_POST['malop' ],'Name_Class'=>$_POST['tenlop'],'Khoahoc'=>$_POST['kh oahoc'])); } else { $this->model- >update('tbl_class',array('Code_Class'=>$_POST['malop' ],'Name_Class'=>$_POST['tenlop'],'Khoahoc'=>$_POST['kh oahoc']),"Code_Class='". $_GET['code']."'"); } $this->_lop= $this->_lop();
$this->_thongbao = "Lưu dữ liệu thành công!"; if (isset($_GET['code']))
{
$this->_lopedit=$this->_lopedit(); }
}
public function btn_delete() {
$this->model->results =$this->model-
>remove('tbl_class',"Code_Class='". $_GET['code']."'");
$this->_lop= $this->_lop(); }
}
Các lớp trong View: View đơn giản là một trang web hoặc một thành phần nhỏ trên trang (VD: header, footer,…) đượ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/. Trong file View_ini.php bắt buộc phải khởi tạo một đối tượng Controller tương ứng (cụ thể là đối tượng lớp Controller_ini) để có thể xử lý yêu cầu người dùng.Tên của file View cũng sẽ được đặt tên dựa vào địa chỉ URL (View_ini.php, với ini lấy từ địa chỉ URL của trang). Với cách đặt tên như vậy các Controller và các View liên quan tới nhau đều có phần tên chung là giá trị chuỗi ini. Như vậy mỗi controller “sở hữu” một view riêng biệt. Và khi cần ghép các thành phần Controller, Model, View, Framework thử nghiệm sẽ sử dụng hàm _Ac_join() trong lớp join_path để nạp các thành phần đó vào trong chương trình. Ví dụ: View_lop
<div style="width:100%;position:relative;float:left"> <?php
$controller = new Controller_lop; ?>
<fieldset style="padding: 2">
<legend>Thêm mới/ sửa thông tin</legend> <table border="0">
<tr>
<td style="width:130px">Mã phòng ban/lớp:</td> <td>
<input type="text" name="malop" value="<?php
if(is_array( $controller->_lopedit)){ echo($controller->_lopedit[0]['Code_Class']);}?>" style="width:100px" /> </td> </tr> <tr> <td>Tên phòng ban/lớp:</td> <td>
<input type="text" name="tenlop" value="<?php
if(is_array( $controller->_lopedit)){
echo($controller->_lopedit[0]['Name_Class']);}?>" style="width:300px" />
</td> </tr> <tr>
<td>Khóa :</td> <td>
<textarea rows="10" style="width:400px;height:40px" name="khoahoc" cols="50"><?php if(is_array(
$controller->_lopedit)){ echo($controller- >_lopedit[0]['Khoahoc']);}?></textarea> </td> </tr> <tr> <td colspan="2">
<input type="button" onclick="window.location.href ='?ini=<?php echo($_GET["ini"]);?>';" class="addbtn" value="Thêm mới" name="btn_add" />
<input type="submit" class="savebtn" value="Lưu dữ liệu" name="btn_save" />
<?php
if (isset($_GET['code'])){ ?>
<input type="submit" class="deletebtn" value="Xóa dữ liệu" name="btn_delete" /> <?php } ?> <br /> <span style="color:red"> <?php echo($controller->_thongbao); ?> </span> </td> </tr> </table> </fieldset> <fieldset style="padding: 2"> <legend>Danh sách lớp</legend>
<table class="tbl" border="1" style="border:1 solid #777;border-collapse:collapse">
<tr style="padding-top:5px;padding-
align:center"> <td style="width:40px">TT</td> <td style="width:100px">Mã phòng ban/lớp</td> <td style="width:220px">Tên phòng ban/lớp</td> <td style="width:400px">Khóa học</td> <td></td> </tr> <?php $dem=0; if(is_array($controller->_lop)){
foreach ($controller->_lop as &$rows) { $dem=$dem +1 ; ?> <tr> <td style="text-align:center"><?php echo($dem);?></td> <td><?php echo($rows['Code_Class']);?></td> <td><?php echo($rows['Name_Class']);?></td> <td><?php echo($rows['Khoahoc']);?></td> <td><a href="?ini=lop&code=<?php echo($rows['Code_Class']);?>"><img style="border:none" src="<?php echo(BASE_URL)?>resource/images/edit.png" /></a></td> </tr> <?php } } ?> </table> </fieldset> </div>
Xét một ví dụ đơn giản để hiểu hơn về các khái niệm controller, view trong Framework thử nghiệm. Sau khi người dùng đăng nhập ứng dụng, và yêu cầu trang “Đăng ký phòng máy” có URL:
Framework thử nghiệm sẽ sử dụng đối tượng lớp Join_path để nạp các file Controller có tên là Controller_dangkyphongmay.php, file Model và file View có tên là View_dangkyphongmay.php. Từ đây ứng dụng sẽ chạy theo đúng mô hình M-V-C.
2.3. Hệ thống các lớp thƣ viện và hàm hỗ trợ trong Framework thử nghiệm
2.3.1. Các lớp thư viện
2.3.1.1. Email (System/Lib/Email.php)
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 Framework thử nghiệm dễ dàng thế nào.
//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();
2.3.1.2. Database library (system/Database/mysql.php)
Trước khi làm việc với thư viện này, chúng ta phải thiết đặt các thông số kết nối như username, password, và tên cơ sở dữ liệu trong file config (config.php) như sau:
define('DB_NAME', 'databasename'); define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', 'localhost');
Tiếp theo phải khởi tạo đối tượng model trong lớp controller (ví dụ:
$this->model = new Model();) để sử dụng các phương thức trong lớp mysql tương tác với cơ sở dữ liệu (vì lớp model kế thừa lớp mysql).
Phương thức connect(): được sử dụng để kết nối cơ sở dữ liệu
$this->model->connect();
Phương thức dis_connect(): được sử dụng để ngắt kết nối cơ sở dữ liệu.
$this->model->dis_connect();
Phương thức insert($table, $data):được sử dụng để thêm một đối tượng
vào trong cơ sở dữ liệu.
$this->model->insert(‘tbl_class', array('Code_Class'=>$_POST['malop'], 'Name_Class'=>$_POST['tenlop'],
'Khoahoc'=>$_POST['khoahoc']));
Phương thức update($table, $data, $where): được sử dụng để cập nhật cơ sở dữ liệu. $this->model->update('tbl_class', array('Code_Class'=>$_POST['malop'], 'Name_Class'=>$_POST['tenlop'], 'Khoahoc'=>$_POST['khoahoc']), "Code_Class='". $_GET['code']."'");
Phương thức remove($table, $where): được sử dụng để xóa dữ liệu.
$this->model->results=$this->model-
>remove(‘tbl_class’,"Code_Class='". $_GET['code']."'");
Phương thức get_list($sql): Trả ra một danh sách kết quả của câu truy vấn sql.
Name_Class');
Phương thức Get_row(): trả ra kết quả là một record, sử dụng trong trường hợp muốn lấy chi tiết của một tin.
$this->model->get_row("select * from tbl_class where Code_Class='". $_GET['code']."'")
2.3.1.3. Pagination(System/Lib/Pagination.php) Thực hiện phân trang website Thực hiện phân trang website
« 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 như sau:
$page = $this->get['page']; $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();
2.3.1.4. Session class (System/Lib/Session.php)
Quản lý session của PHP, 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->get(‘name_session_1’);
2.3.1.5. Upload class (System/Lib/upload.php)
Tải file lên server, việc upload file trên server thực sự dễ dàng với thư viện upload của Framework thử nghiệm.
$config['upload_path'] = './uploads/'; $config['allowed_types'] = 'gif|jpg|png'; $config['max_size'] = '1000'; $config['max_width'] = '800'; $config['max_height'] = '600'; $this->upload->do_upload();
Để lấy các thông tin trả về của file đã upload, chỉ cần gọi hàm:
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_name] => your_pic.jpg [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 )
2.3.1.6. ExportDataExcel class (System/Lib/ExportDataExcel.php)
Lớp này cung cấp thư viện export bao gồm có nhiều định dạng. Ví dụ như export ra excel (.xls) hay các file định dạng tsv hay csv
Trong đó có các hàm:
+ ExportData: có nhiệm vụ add các Header theo định dạng dữ liệu cần export. Nhiệm vụ tiếp theo đó là add các dòng dữ liệu vào trong bảng.
+ ExportDataExcel, ExportDataCSV, và ExportDataTSV: quy định loại dữ liệu cần xuất ra và các header để phù hợp với cấu trúc file (ở đây là các dữ liệu dạng Excel, TSV và CSV).
2.3.2. Các hàm hỗ trợ
2.3.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.
Hàm 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
Hàm 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);
2.3.2.2. Text Helper
Bao gồm các hàm hỗ trợ làm việc với text
Hàm 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) Hàm 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";