create easymoduleinphpfox

12
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:

Upload: entu-di

Post on 13-Jun-2015

650 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Create easymoduleinphpfox

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:

Page 2: Create easymoduleinphpfox

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

Page 3: Create easymoduleinphpfox

diện cho đường dẫn http://localhost/phpFox-

3.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() {

}

}

Page 4: Create easymoduleinphpfox

?>

Tiếp theo chúng ta sẽ tạo một file HTML cho controller vừa tạo của chúng ta:

\module\createuser\template\default\controller\admincp\index.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/

Page 5: Create easymoduleinphpfox

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

\module\createuser\template\default\controller\admincp\ để 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="[email protected]" required />

</div>

</div>

Page 6: Create easymoduleinphpfox

<div class="table">

<div class="table_left">

{required}Password:

</div>

<div class="table_right">

<input type="password" name="password"

size="40" value="" required/>

</div>

</div>

<div class="table">

<div class="table_left">

{required}Birthday:

</div>

<div class="table_right">

<select name="month">

<option value="">Month: </option>

{foreach from=$months item=month}

<option

value={$i++}>{$month}</option>

{/foreach}

</select>

/

<select name="day">

<option value="">Day: </option>

{foreach from=$days item=day}

<option

value={$day}>{$day}</option>

{/foreach}

</select>

/

<select name="year">

<option value="">Year: </option>

{foreach from=$years item=year}

<option

value={$year}>{$year}</option>

{/foreach}

</select>

</div>

</div>

<div class="table">

<div class="table_left">

{required}I am:

</div>

<div class="table_right">

<select name="gender">

<option value="">Select: </option>

<option value="1">Male</option>

<option value="2">Female</option>

</select>

</div>

</div>

<div class="table_clear">

<input type="submit" value="{phrase

var='core.submit'}" class="button" name="submit" />

Page 7: Create easymoduleinphpfox

</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

));

}

Page 8: Create easymoduleinphpfox

}

?>

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/phpFox-

3.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>

Page 9: Create easymoduleinphpfox

</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/phpFox-

3.5.1/upload/index.php?do=/admincp/createuser/index/:

Page 10: Create easymoduleinphpfox

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:

\module\createuser\include\service\createuser.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(

Page 11: Create easymoduleinphpfox

'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.

Page 12: Create easymoduleinphpfox

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.