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";
$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 ba chấm (…)
Hàm highlight_code(): Tô màu xâu ký tự.
$string = highlight_code($string);
Hàm này sử dụng hàm highlight_string() của PHP, vì thế màu được sử dụng được xác định trong file php.ini
Hàm highlight_phrase(): Sẽ highlight một cụm từ trong một xâu text, tham số đầu tiên xác định string, tham số thứ hai là cụm muốn highlight, tham số thứ ba và tham số thứ tư là thẻ html mở và đóng màu bạn muốn.
Hàm create_slug(): Khi dùng hàm này với tham số là một chuỗi string, kết quả trả về là một chuỗi mới được cắt bỏ các dấu cách từ chuỗi cũ.
$title = "Cộng hòa xã hội chủ nghĩa Việt Nam?"; $url_title = url_title($title);
// Kết quả: conghoaxahoichunghiavietnam
Hàm này rất hữu ích trong việc tạo các URL thân thiện với bộ máy tìm kiếm. Chẳng hạn:
http://yoursite.com/index.php?ini=dangkyphongmay
2.3.2.3. exporttoexcel helper
Bao gồm các hàm hỗ trợ việc xuất dữ liệu ra định dạng khác (.xls, .tsv hay .csv):
Hàm cleandata($str): hàm chuẩn hóa dữ liệu dạng html sang dạng excel Hàm exp($data): sẽ gọi các hàm để chuẩn hóa dữ liệu sang dạng cần export.
Các hàm này cùng với lớp ExportDataExcel (System/ Lib/ ExportDataExcel.php) rất có ích trong việc xuất dữ liệu trong cơ sở dữ liệu thành các file văn bản (ví dụ như .xls, hay .tsv,.csv…).
Muốn sử dụng được các hàm này để có thể xuất dữ liệu ra Excel (định dạng .xls) ta có thể làm như đoạn mã sau:
<?php function cleanData(&$str) { $str = preg_replace("/\t/", "\\t", $str); $str = preg_replace("/\r?\n/", "\\n", $str); if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"'; }
// filename for download
$filename = "website_data_" . date('Ymd') . ".xls"; header("Content-Disposition: attachment; filename=\"$filename\""); header("Content-Type: application/vnd.ms-excel"); $flag = false; $data= session::get('ex'); if(! $data==NULL){ foreach($data as $row) { if(!$flag) {
// display field/column names as first row echo implode("\t", array_keys($row)) . "\r\n"; $flag = true;
}
array_walk($row, 'cleanData');
echo implode("\t", array_values($row)) . "\r\n"; }
exit(); }
else
{ echo(" Không có dữ liệu expost!"); }
CHƢƠNG 3. XÂY DỰNG ỨNG DỤNG “QUẢN LÝ ĐĂNG KÝ SỬ DỤNG PHÒNG THỰC HÀNH MÁY TÍNH TRƢỜNG ĐẠI HỌC HẢI DƢƠNG”
SỬ DỤNG FRAMEWORK THỬ NGHIỆM 3.1. Giới thiệu về quy trình quản lý và sử dụng phòng thực hành.
Hiện nay, trường Đại học Hải Dương có 05 phòng thực hành. Do công việc quản lý các phòng thực hành vẫn còn chưa được tin học hóa, chủ yếu dựa trên sổ sách nên công tác quản lý nhiều lúc vẫn còn tồn tại nhiều bất cập. Quy trình quản lý các phòng thực hành được thực hiện như sau:
Công tác đăng ký lịch thực hành và sắp xếp lịch thực hành được mô tả như sau:
- Vào thứ 6, hoặc thứ 7 hàng tuần, Giảng viên đều đến đăng ký lịch thực hành của mình cho tuần tới;
- Giảng viên có thể đăng ký phòng máy vào một trong 3 buổi trong ngày (sáng, chiều - 5 tiết; tối - 3 tiết), không được đăng ký 2 phòng trùng một buổi trong cùng ngày, không được 2 giảng viên đăng ký 1 phòng trùng một buổi trong cùng ngày.
Công tác quản lý các phòng thực hành:
- Mỗi một phòng máy đề có sổ theo dõi tình trạng của các thiết bị nói chung và của các máy tính trong phòng, để kịp thời khắc phục khi gặp sự cố.
- Mỗi máy tính, thiết bị trong phòng thực hành đều được gán mã; (ví dụ: M01A201, M02A201, M01B1201 hoặc M01B2201,…)
- Khi thực hành tại phòng máy, GVBM đều phải ghi lại lớp thực hành, giờ thực hành, môn thực hành, và số máy của từng sinh viên, sau khi thực hành giáo viên sẽ phải kiểm tra hết các thiết bị phòng máy nếu có hỏng hóc hay sự cố đều phải có sự ghi chép đầy đủ vào sổ quản lý phòng thực hành.
- Khi xảy ra hỏng hóc thì bộ phận quản lý phòng máy sẽ lên kiểm tra và khắc phục. Nếu không khắc phục được thì sẽ được mang đi bảo hành hoặc sửa chữa hoặc đề xuất mua mới (tùy vào từng trường hợp). Tất cả các thông tin về máy tính đang được sửa chữa, hay các thiết bị đã được thay thế sẽ được ghi lại trong sổ theo dõi thiết bị trong phòng.
3.2 Phân tích nhu cầu
Hệ thống chia người sử dụng chương trình thành ba quyền Admin/ người quản lý phòng máy, Giảng viên, Sinh viên
Những chức năng chính của một hệ thống quản lý phòng thực hành: - Admin/ người quản lý phòng máy:
Quản lý tài khoản người dùng
Xem lịch thực hành các phòng máy theo từng tuần
Xem tình trạng máy móc thiết bị trong phòng.
Cập nhật tình trạng máy móc thiết bị trong phòng.
Cập nhật thông tin máy tính trong phòng (Thêm, sửa, xóa máy tính và linh kiện trong máy)
- Giảng viên:
Đăng ký, xóa, hoặc thay đổi lịch phòng thực hành cho lớp và môn học đang giảng dạy.
Xem lịch giảng dạy thực hành của mình.
Xem tình trạng máy móc, thiết bị trong phòng.
Báo hỏng máy móc thiết bị trong phòng thực hành. - Sinh viên: Xem lịch thực hành của lớp mình
3.3. Thiết kế hệ thống