Game-Plants-vs-Zombies để ôn tập môn kinh tế chính trị.pptx
Create easymoduleinphpfox
1. Cách tạo một module đơn giản trên phpfox
Ở bài viết này, tôi sẽ trình bày một cách chi tiết các bước xây dựng một module đơn giản trên công cụ
phpfox. Chúng ta sẽ tiếp cận bằng cách thực hiện một ví dụ cụ thể, các bạn có thể áp dụng những chi tiết
trong ví dụ này để áp dụng cho những project của các bạn.
Đề bài: Viết một module trên phpfox tạo một user và insert thông tin user đó vào cơ sở dữ liệu, đồng thời
hiển thị thông tin user vừa tạo trên một menu ở AdminCP.
Cách thực hiện:
Phiên bản sử dụng: phpfox 3.5.1
Bạn có thể download phpfox tại đây.
Hướng dẫn cài đặt phpfox bạn có thể tham khảo ở đây.
Create a new product
Đầu tiên bạn sẽ tạo một product mới (nơi chứa module của bạn). Tuy nhiên, đây chỉ là bước tùy chọn vì
bạn có thể đặt module của mình vào một product bất kì có sẵn trên phpfox. Mặc dù vậy, việc sử dụng một
product riêng của bản thân sẽ giúp bạn có thể tùy biến dễ dàng những chức năng trong nó. Các bước để
tạo một product mới như sau:
Đăng nhập với tài khoản AdminCP và truy nhập đường dẫn sau:
Extensions >> Product >> Create New Product
Điền đầy đủ các thông tin vào form và click nút submit:
Dưới đây tôi sẽ giải thích chi tiết thông tin của từng trường:
2.
Product ID: giá trị ID duy nhất của product. Nó có thể là kí tự số, chữ cái và dấu gạch dưới (_), và
luôn ở dạng chữ cái thường. Ở đây tôi sẽ chọn là create_user.
Title: tiêu đề của product, thứ mà sẽ hiển thị trong danh sách các product. Ở đây tôi sẽ chọn là
Create new user.
Description: mô tả ngắn về product. Ở đây tôi sẽ chọn là Create a new user manually.
Version: phiên bản hiện tại của product. Do tôi mới tạo product này nên tôi sẽ chọn là 1.0.
Product URL: URL của website của bạn, ở đây tôi sử dụng localhost nên sẽ điền là: localhost.
Version Check URL: URL để phpfox kiểm tra phiên bản release của product. Ở đây tôi điền là
localhost/version.php.
Active: thiết lập trạng thái của product là active hoặc inactive. Chọn Yes.
Create new module in AdminCP
Đăng nhập vào AdminCP và vào theo đường dẫn:
Extension >> Module >> Create New Module
Tiếp theo chúng ta sẽ điền đầy đủ vào form dưới đây và click nút submit:
Chi tiết thông tin của từng trường:
Product: tên của product chứa module của bạn. Ở đây tôi sẽ chon là Create new user.
Module ID: id của module. Ở đây tôi chọn là createuser.
Add to Menu: chọn Yes để module của bạn xuất hiện trong Module menu.
Sub Menu: Khi bạn chọn Yes ở phần Add to Menu, bạn sẽ bắt buộc phải điền thông tin ở mục Sub
Menu này. Ở đây chúng ta sẽ định nghĩa tên của các sub menu và URL tương ứng. Tôi sẽ tạo 2 sub
menu: Show info để hiển thị thông tin người dùng, với link createuser được hiểu là đường dẫn
http://localhost/phpFox-3.5.1/upload/index.php?do=/admincp/createuser/; Add new tạo form
để điền thông tin người dùng và insert thông tin đó vào cơ sở dữ liệu, với link createuser.add đại
3.
diện
cho
đường
dẫn
http://localhost/phpFox3.5.1/upload/index.php?do=/admincp/createuser/add/.
Info: Mô tả ngắn về module. Ở đây tôi chọn là Admin can create a new user manually!.
Build file structure
Dẫn đến folder /module/ trên server của bạn nơi chứa file cài đặt của phpfox. Tạo một folder mới với tên
của module mà bạn vừa tạo, của tôi là createuser. Bên trong folder mới bạn sẽ tạo theo cấu trúc sau:
/include/
/include/component/
/include/component/ajax/
/include/component/block/
/include/component/controller/
/include/component/controller/admincp
/include/plugin/
/include/service/
/static/
/static/css/default/default/
/static/image/
/static/jscript/
/template/
/template/default/
/template/default/block/
/template/default/controller/
/template/default/controller/admincp
Chú ý rằng đây là cấu trúc file dạng đầy đủ của một module, vì vậy tùy vào mục đích của bạn mà bạn có
thể chỉ cần tạo một số thư mục cần thiết.
Create a controller
Controller là những file php điều khiển tất cả các page của phpfox. Đầu tiên hãy tạo một php class file cho
controller của chúng ta:
/module/createuser/include/component/controller/admincp/index.class.ph
p
Nội dung của file index.class.php như sau:
index.class.php
<?php
class Createuser_Component_Controller_Admincp_Index extends Phpfox_Component
{
public function process() {
}
}
4. ?>
Tiếp theo chúng ta sẽ tạo một file HTML cho controller vừa tạo của chúng ta:
modulecreateusertemplatedefaultcontrolleradmincpindex.html.php
Trong file index.html.php, bạn có thể thêm dòng sau để kiểm tra tính kết nối giữa file controller và html
mà bạn vừa tạo.
index.html.php
Helloworld!
Truy nhập vào đường dẫn sau:
http://localhost/phpFox-3.5.1/upload/index.php?do=/admincp/createuser/
Hoặc truy nhập vào AdminCP và đi theo đường dẫn:
Module >> Createuser >> Show info
Đây là kết quả thu được:
Giải thích chi tiết:
Tên lớp trong file index.class.php là:
Createuser_Component_Controller_Admincp_Index
Nếu thay dấu gạch dưới (_) bằng dấu gạch trái (/) thì nó sẽ nhắc bạn tới đường dẫn đến file index.class.php
của chúng ta:
/module/createuser/include/component/controller/admincp/index.class.ph
p
Lớp này sẽ kế thừa từ lớp Phpfox_Component, lý do là nó nằm trong thư mục Component.
Để thực thi được controller này, ta cần cung cấp phương thức public process().
Cái tên index ở đây là bắt buộc khi bạn muốn dẫn đến module gốc ở đường link:
http://localhost/phpFox-3.5.1/upload/index.php?do=/admincp/createuser/
5. Tiếp theo chúng ta sẽ tạo file add.class.php, đây sẽ là controller của đường dẫn:
http://localhost/phpFox-3.5.1/upload/index.php?do=/admincp/createuser/add/
Và tất nhiên bạn vẫn sẽ phải tạo một file html tương ứng (add.html.php) ở thư mục
modulecreateusertemplatedefaultcontrolleradmincp để hiển thị thông tin cần thiết.
Ta sẽ xây dựng form trong add.html.php để nhập thông tin user cần tạo. Đây là dạng form mà tôi đã tạo.
Và dưới đây là đoạn code tương ứng:
add.html.php
<html>
<body>
<form action="{url link='admincp.createuser.index'}"
method="post" id="add_new_user">
<div class="user_create">
<div class="table_header">
User Infomation
</div>
<div class="table">
<div class="table_left">
{required}Full name:
</div>
<div class="table_right">
<input type="text" name="full_name"
size="40" value="yourname" />
</div>
</div>
<div class="table">
<div class="table_left">
{required}Email:
</div>
<div class="table_right">
<input type="text" name="email"
size="40" value="someone@example.com" required />
</div>
</div>
7. </div>
</div>
</form>
</body>
</html>
Giải thích code:
Action ở form là:
action="{url link='admincp.createuser.index'}"
Link 'admincp.createuser.index’ có dạng ‘[admincp.]module_name.file_name_prefix’, phần admincp. có
thể có hoặc không tùy thuộc vào việc module thực hiện trên admincp hay trên site thông thường. Ý nghĩa
là form này sau khi click submit sẽ thực hiện đoạn code trong file index.class.php và index.html.php.
Các thẻ div ở đây tôi có sử dụng các class được định nghĩa sẵn trong phpfox để đồng nhất với những form
của các module khác. Thông tin về các class này bạn có thể xem trong các file html nằm trong các module
có sẵn của phpfox.
Từ {required} thay thế cho dấu * màu đỏ.
Tiếp theo là một vòng lặp khá đặc biệt:
{foreach from=$months item=month}...{/foreach}
Vòng lặp này có nghĩa là duyệt tất cả các phần tử trong mảng $months, mỗi phần tử sẽ được đại diện bởi
biến $month. Trong PHP, vòng lặp này sẽ được viết lại như sau:
foreach($months as $month){}
Câu hỏi là mảng $months này được lấy từ đâu ra? Thực ra mảng $month được gán trong file
add.class.php. Nội dung file add.class.php như sau:
add.class.php
<?php
class Createuser_Component_Controller_Admincp_Add extends Phpfox_Component{
public function process() {
$month = array('January', 'February', 'March', 'April', 'May',
'June', 'July', 'August', 'September', 'October', 'November', 'December');
$day = array();
$year = array();
for ($i = 1; $i < 32; $i++) {
$day[] = $i;
}
for ($j = 1900; $j < 2015; $j++) {
$year[] = $j;
}
$this->template()->assign(array(
'months' => $month,
'days' => $day,
'years' => $year
));
}
8. }
?>
Bởi vì đoạn mã của chúng ta sử dụng mô hình MVC, tức là logic PHP trong file class tách biệt với logic thiết
kế trong file html, vì vậy các thông tin trong file class sẽ được gán vào các biến để sử dụng trong file html.
Phpfox cung cấp phương thức assign() có trong lớp Phpfox_Template để thực hiện phép gán này.
Hiển thị thông tin người dùng trên menu Show info
Menu
Show
info
có
url
dẫn
đến
module
gốc
http://localhost/phpFox3.5.1/upload/index.php?do=/admincp/createuser/. Do đó ta sẽ xây dựng giao diện cho menu này qua file
index.html.php và điều khiển bằng controller index.class.php.
Nội dung file index.html.php:
index.html.php
<html>
<div class="table_header">
Show user info
</div>
<div class="table">
<div class="table_left">
Name:
</div>
<div class="table_right">
{$fulname}
</div>
</div>
<div class="table">
<div class="table_left">
Email:
</div>
<div class="table_right">
{$email}
</div>
</div>
<div class="table">
<div class="table_left">
Birthday:
</div>
<div class="table_right">
{$birthday}
</div>
</div>
<div class="table">
<div class="table_left">
Gender:
</div>
<div class="table_right">
{$gender}
</div>
9. </div>
</html>
Các biến cần lấy ở đây là $fulname, $email, $birthday, $gender. Những biến này sẽ được lấy bằng mảng
$_POST thông qua form được xây dựng ở file add.html.php.
Nội dung của file index.class.php:
index.class.php
<?php
class Createuser_Component_Controller_Admincp_Index extends Phpfox_Component
{
public function process() {
$this->template()->assign(array(
'fulname' => $_POST['full_name'],
'email' => $_POST['email'],
'password' => md5($_POST['password']),
'birthday' => $month . $_POST['day'] .
$_POST['year'],
'gender' => $_POST['gender']
));
}
}
?>
Đến đây ta sẽ test thử việc hiển thị thông tin người dùng. Truy nhập theo đường dẫn
http://localhost/phpFox-3.5.1/upload/index.php?do=/admincp/createuser/add/ hoặc đăng nhập vào
AdminCP, truy nhập vào đường dẫn Module ≫ Createuser ≫ Add new, nhập đầy đủ thông tin vào form
sau:
Click Submit và hệ thống sẽ tự động điều hướng đến link http://localhost/phpFox3.5.1/upload/index.php?do=/admincp/createuser/index/:
10. Insert thông tin người dùng vào cơ sở dữ liệu
Để truy nhập và thực hiện các phương thức lên cơ sở dữ liệu, tôi sẽ tạo một service extends từ
Phpfox_Service. File service này nằm trên đường dẫn:
modulecreateuserincludeservicecreateuser.class.php
Phpfox quy định mỗi module chỉ có một service duy nhất để thao tác với cơ sở dữ liệu và chỉ có tên dạng
module_name.class.php. Nội dung của file createuser.class.php:
createuser.class.php
<?php
class Createuser_Service_Createuser extends Phpfox_Service {
public function insert_user() {
$month = $_POST['month'];
switch ($month) {
case 'January': $month = '01';
break;
case 'February': $month = '02';
break;
case 'March': $month = '03';
break;
case 'April': $month = '04';
break;
case 'May': $month = '05';
break;
case 'June': $month = '06';
break;
case 'July': $month = '07';
break;
case 'August': $month = '08';
break;
case 'September': $month = '09';
break;
case 'October': $month = 10;
break;
case 'November': $month = 11;
break;
case 'December': $month = 12;
break;
}
$insert = Phpfox::getLib('database')->insert('phpfox_user',
array(
11. 'user_group_id' => '2',
'full_name' => $_POST['full_name'],
'email' => $_POST['email'],
'password' => md5($_POST['password']),
'birthday' => $month . $_POST['day'] .
$_POST['year'],
'gender' => $_POST['gender']
));
return $insert;
}
}
?>
Tên lớp vẫn tuân thủ theo định dạng được định nghĩa ở trên.
Do giá trị $month ban đầu ở dạng chữ mà không phải dạng số, trong khi dạng hiển thị birthday trong cơ
sở dữ liệu là mmddyyyy, nên ta sẽ chuyển giá trị $month từ dạng chữ sang dạng số cho phù hợp.
Có 2 cách để thực hiện insert vào cơ sở dữ liệu:
$this→database()→insert(‘table_name’, array(‘collumn_name_1’ =>‘value_1’,
‘collumn_name_2’ => ‘value_2’, …));
Phpfox::getLib('database')->insert(‘table_name’, array(‘collumn_name_1’ =>‘value_1’,
‘collumn_name_2’ => ‘value_2’, …));
ở đó column_name_i là tên cột thứ i, còn value_i là giá trị của cột tương ứng.
Tiếp theo chúng ta sẽ thực thi service này. Yêu cầu là click nút Submit thì service này cũng được thực thi,
nên ta sẽ thực hiện việc thực thi này trong phương thức process của file index.class.php. Chúng ta sẽ thêm
đoạn code sau trong file index.class.php.
Phpfox::getService('createuser')->insert_user();
Phương thức getService nhận tham số là tên module và gọi đến phương thức insert_user() để thực hiện
việc insert thông tin người dùng vào cơ sở dữ liệu.
Test
Chúng ta sẽ thực hiện test với người dùng John Adam ở trên. Đây là ảnh cơ sở dữ liệu trước khi click nút
Submit.
12. Sau khi click nút Submit.
Chú ý: Do ở đây tôi thực hiện trên localhost nên các đường dẫn đều bắt đầu bằng localhost, nếu bạn tạo
module trên server của bạn, hãy thay localhost bằng tên site của bạn trong các đường dẫn mà tôi đưa ra.