Viết ứng dụng bổ sung cho diễn đàn

Một phần của tài liệu Tìm hiểu và viết ứng dụng trên diễn đàn khoa công nghệ thông tin (Trang 46 - 56)

1. Viết chức năng bổ sung (Plugin):

Khi sử dụng MyBB, chắc chắn sẽ có lúc ta muốn bổ xung một vài chức năng cho diễn đàn của mình (như là shop, bank, game, ...). Muốn làm được như vậy ta cần có các plugin để cài đặt cho MyBB của mình. Tuy nhiên không phải lúc nào bạn cũng tìm được một plugin ưng ý hay thậm chí là không thể tìm nổi một plugin nào gần giống với mong muốn. Nếu bạn có thể lập trình PHP và biết về HTML (cũng như CSS và Javascript thì càng tốt), ta hoàn toàn có thể tự viết cho mình một plugin theo ý mình. Để có thể lập trình plugin được,ta cần phải biết plugin là gì và cách quản lý các plugin của diễn đàn (đây là điều tất nhiên).

a) Giới thiệu chung

Tìm hiểu và viết ứng dụng trên diễn đàn khoa CNTT GVHD: Thầy Hoàng Trọng Thạch

Danh sách các tập tin plugin

Mỗi file PHP trong thư mục này đại diện cho một plugin và chứa thông tin về plugin đó bào gồm:

- Thông tin về plugin (Tên plugin, tác giả, phiên bản, ...)

- Mô tả các đoạn code sẽ được thực thi khi người dùng cài đặt, hủy bỏ

(uninstall), kích hoạt (activate) hay ngưng kích hoạt (Deactivate) plugin đó (Ví dụ như tạo thêm/xóa bỏ bảng trong CSDL, chèn thêm/xóa bỏ trường vào bảng, tạo thêm/xóa bỏ setting, ....).

- Mô tả các đoạn code sẽ được thi hành ở một phần nào đó của diễn đàn để đưa thêm các tính năng vào đó (có thể hiểu giống như chèn thêm code vào các file sử lý của MyBB như member.php, index.php, usercp.php, modcp.php, ...).

- Để bắt đầu việc tạo một plugin mới, bạn cần chọn một cái tên cho plugin đó để đặt tên cho file PHP. Tên này chỉ dùng các ký tự a-z và số từ 0-9 và dấu gạch dưới (_). Bạn nên đặt làm sao để không trùng với một plugin nào khác và có liên quan đến chức năng của plugin tuy nhiên không nên đặt quá dài (chỉ khoảng 15 ký tự đổ lại thôi). Nếu bạn đặt tên dài quá thì lúc viết code bạn sẽ khổ đó. Để cho thống nhất, mình tạm gọi tên plugin là xxxx (nhớ kĩ nhé kẻo tí lại lẫn lộn vào nhau).

Sau khi đã chọn được tên thích hợp, công việc tiếp theo là mở một tệp có tên là xxxx.php (xxxx là tên của plugin). Với nội dung cơ bản gồm một hàm có tên

là xxxx_info() hàm này trả về thông tin của plugin dưới dạng mảng một chiều. Cụ thể:

<?

// Ngăn chặn việc truy cập trực tiếp file này if(!defined("IN_MYBB"))

{

die("Direct initialization of this file is not

allowed.<br /><br />Please make sure IN_MYBB is defined."); }

function xxxx_info() {

return array(

"name" => "Tên plugin",

"description" => "Mô tả cho plugin",

"website" => "http://abc.com (Địa chỉ website của plugin)",

"author" => "Tác giả của plugin",

"authorsite" => "http://abc.com (Địa chỉ website của tác giả)", "version" => "1.0 (Phiên bản)", "guid" => "", "compatibility" => "*" ); } ?>

Lưu tại tập tin plugin xxxx.php đúng đường dẫn. Bây giờ ta vào AdminCP ->

Configuration -> Plugins thì sẽ thấy plugin của mình có trong danh sách plugin với 1 nút chọn là Active (Kích hoạt). Nếu ta kích hoạt thử thì sẽ chẳng thấy gì vì chưa mô tả hoạt động của plugin này.

Bây giờ hãy mở lại plugin của mình ra và có thể mô tả thêm quá trình kích hoạt/ ngưng kích hoạt cũng như cài đặt/ hủy bỏ plugin của mình. Cụ thể như sau:

Tìm hiểu và viết ứng dụng trên diễn đàn khoa CNTT GVHD: Thầy Hoàng Trọng Thạch

// ta có thể viết code tạo bảng, tạo trường, thêm settings, chèn HTML vào Template, .... tại đây

} (adsbygoogle = window.adsbygoogle || []).push({});

Khi đã có mô tả cho kích hoạt thì tất nhiên là phải có mô tả cho việc ngưng kích hoạt. Ta phải viết code làm sao để việc kích hoạt và nhưng kích hoạt trái ngược nhau. Việc kích hoạt tạo thêm ra cái gì thì phần ngưng kích hoạt phải xóa đi cái đó. Để mô tả cho việc ngưng kích hoạt, ta cần tạo thêm một hàm nữa là xxxx_deactivate() như thế này:

function xxxx_deactivate() {

// code ngưng kích hoạt ở đây

// ta có thể viết code xóa bảng, xóa trường, xóa settings, xóa HTML vào Template, .... đã được tạo ra trong hàm xxxx_activate() tại đây

}

Ta hoàn toàn có thể viết code để kiểm tra và cho hệ thống biết plugin này đã được kích hoạt hay chưa. Ví dụ như nếu một bảng nào đó đã được tạo rồi thì mới được coi là đã kích hoạt plugin này. Khi đó nếu bảng chưa được tạo thì người dùng có kích hoạt plugin này rồi thì cũng bị coi như là chưa kích hoạt. Điều này giúp bạn tránh được việc có lỗi khi tạo bảng trong lúc kích hoạt mà plugin vẫn bị coi như là kích hoạt rồi. Để làm được điều này ta cần tạo một hàm tên là xxxx_is_activated(). Hàm này trả về giá trị true nếu xác nhận rằng plugin đã được kích hoạt và ngược lại.

function xxxx_is_activated() {

// code xác nhận ở đây

// Ví dụ: Kiểm tra xem nếu bảng table_name tồn tại thì là đã kích hoạt thành công. if ($db->table_exists("table_name")) { RETURN true; } else { RETURN false; } }

Như đã ta đã nghiên cứu trong phần quản lý plugin, các plugin có dữ liệu sẽ không chỉ có nút Activate và Deactivate mà còn có thêm Install & Activate và Uninstall. Sở dĩ có thêm 2 nút đó để người dùng có thể ngưng kích hoạt một plugin mà không làm mất dữ liệu của plugin đó.

Ví dụ: Nếu ta tạo plugin để khi cài đặt (install) thì nó tạo một bảng trong CSDL rồi trong quá trình sử dụng plugin sẽ ghi dữ liệu vào bảng đó. Nếu đưa việc tạo và xóa bảng này vào hàm xxxx_activate() và hàm xxxx_deactivate() thì lúc ngưng kích hoạt (deactivate) plugin thì cái bảng đó bị xóa mất, người dùng không có cách nào ngừng hoạt động tạm thời plugin trong một thời gian mà vẫn dữ được nguyên cái bảng đó cùng các bản ghi trong đó. Tuy nhiên nếu ta đưa việc tạo/xóa bảng này vào các hàm mô tả việc cài đặt và hủy bỏ plugin thì người dùng hoàn toàn có thể làm được.

Để mô tả việc cài đặt bạn thêm một hàm với tên là xxxx_install() vào trong file PHP của plugin. Giống như hàmxxxx_activate(), hàm này sẽ được gọi khi người dùng nhấn vào Install & Activate.

function xxxx_install() {

// code cài đặt viết tại đây

// Có thể tạo bảng, tạo trường hay thêm settings tại đây. }

Để mô tả việc hủy bỏ (uninstall) bạn thêm một hàm với tên là xxxx_uninstall() vào trong file PHP của plugin. Giống như hàmxxxx_deactivate(), hàm này sẽ được gọi khi người dùng nhấn vào Uninstall.

function xxxx_uninstall() {

// Code hủy bỏ những gì đã cài đặt tại đây

// Ta phải viết code đề xóa bỏ toàn bộ những "sản phẩm" do quá trình cài đặt tạo ra trong hàm xxxx_install()

}

Tìm hiểu và viết ứng dụng trên diễn đàn khoa CNTT GVHD: Thầy Hoàng Trọng Thạch

// code xác nhận ở đây

// Ví dụ luôn: Kiểm tra xem nếu bảng table_name tồn tại thì là đã cài đặt thành công. if ($db->table_exists("table_name")) { RETURN true; } else { RETURN false; } }

c) Đưa các chức năng vào plugin

Ở phần gới thiệu, chúng ta đã biết cách mô tả cho hệ thống biết phải làm gì khi plugin được cài đặt/hủy bỏ hay kích hoạt/ngưng kích hoạt. Đó sẽ là nền tảng cho những hoạt động của plugin này.Tiếp theo ta sẽ đưa code của plugin vào các trang của hệ thống MyBB nhằm đưa các chức này của plugin vào đó.

Người chưa viết plugin cho MyBB bao giờ sẽ cho rằng nếu muốn bổ xung code của mình vào 1 file trong hệ thống của MyBB thì tất nhiên là phải mở file đó ra rồi chèn code vào chỗ cần thiết trong file đó. Do vậy sẽ rất bất tiện phải không?

Tuy nhiên mọi việc lại đơn giản hơn thế rất nhiều. Bạn sẽ không phải chèn code của mình vào các file đó nữa mà chỉ việc thông qua một hệ thống hỗ trợ của MyBB được gọi là HOOKS (những cái móc). Hệ thống hooks cho phép khai báo các hàm sẽ được gọi trong các "thời điểm" của hệ thống. Ví dụ ta có thể khai báo để sau khi đăng bài viết thì 1hàm trong plugin sẽ được gọi và tiến hành các công việc cần thiết.

Để có thể biết được các hook và vị trị của nó trong các file hệ thống của MyBB ta có thể vào trang http://wiki.mybboard.net/index.php/MyBB_Plugin_Hooks. Trang này ghi rất rõ các file có hệ thống hook, hook có tên là gì (Cột Hook Name) và được gọi ở dòng thứ bào nhiêu của file đó cùng với các biến quan trọng có thể dùng trong hook đó (cột Parameter). Để cho chắc chắn về vị trí của hook trong file, ta hãy mở file đó ra và tìm dòng:

$plugins->run_hooks("Hook name");

Việc này cũng sẽ giúp ta hiểu thêm về các code xử lý của MyBB quanh vị trí đó để có hướng lập trình hook một cách phù hợp. (adsbygoogle = window.adsbygoogle || []).push({});

Để cho đơn giản chúng ta hãy cùng xem một ví dụ trong file PHP của plugin: $plugins->add_hook("postbit", "xxxx_postbit");

function xxxx_postbit($post) {

$post['message'] = "<strong>Hello world!</strong><br /><br />{$post['message']}"; }

Đây là đoạn code trích từ plugin Hello world có sẵn trong MyBB (plugin này nhằm hướng dẫn cách viết plugin). Đoạn code nhằm đưa thêm hàm vào vị trí postbit trong file ./inc/functions_post.php (dòng 601). Hàm xxxx_postbit có tác dụng đưa thêm đoạn code sau vào trước biến $post['message'] (tức là đưa vào trước mỗi bài viết code đó:

<strong>Hello world</strong>

Ta có thể kích hoạt thử plugin Hello world thì sẽ rõ.

Qua code trên chúng ta rút ra một điều: Để khai báo một hook ta viết code như sau: $plugins->add_hook("Tên hook","Tên hàm sử lý");

Sau khi đã khai báo hàm nào thì ta phải tạo hàm đó ra và tiến hành sử lý số liệu theo ý mình. Để dễ hiểu hơn chúng ra hãy xem code của một plugin đơn giản:

<?

if(!defined("IN_MYBB")) {

die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");

}

// khai báo thông tin plugin function xxxx_info() {

return array(

"name" => "Tên plugin",

"description" => "Mô tả cho plugin",

"website" => "http://abc.com (Địa chỉ website của plugin)", "author" => "Tác giả của plugin",

"authorsite" => "http://abc.com (Địa chỉ website của tác giả)", "version" => "1.0 (Phiên bản)",

"guid" => "", "compatibility" => "*"

Tìm hiểu và viết ứng dụng trên diễn đàn khoa CNTT GVHD: Thầy Hoàng Trọng Thạch

} ?>

Plugin này sẽ đưa ra lời chào mừng bằng hàm alert() của Javascript bằng cách in ra một đoạn HTML qua hàm echo() trong hàm xxxx_show_alert()

echo "<script language='javascript'>alert('Chào mừng bạn trở lại!');</script>"; Vì khai báo hook cho hàm xxxx_show_alert() là "member_do_login_end" nên hàm này chỉ được gọi vào dòng 1027 của file member.php tức là khi thành viên đăng nhập xong.

2. Viết 1 trang mới (custom pages) cho diễn đàn: a) Giới thiệu custom pages

Custom pages cũng giống như component của joomla, cho phép ta tạo ra 1 trang mới trong diễn đàn và thực hiện 1 số chức năng khác.

Tìm hiểu và viết ứng dụng trên diễn đàn khoa CNTT GVHD: Thầy Hoàng Trọng Thạch

b) Tạo custom page Hello world:

Một ví dụ tạo 1 custom pages xuất ra "Chào mừng bạn " + username + "đến với diễn đàn".

Để tạo 1 custom pages, đầu tiên ta vào: Admin CP > Templates > Modify / Delete > Expand "Global Templates" > Add template.

Tại đây ta tạo 1 template mới đơn giản như sau: Template name: hello_world (adsbygoogle = window.adsbygoogle || []).push({});

Template set: <html> <head> <title>{$mybb->settings[bbname]}</title> {$headerinclude} </head> <body> {$header} <br />

<table width="100%" border="0"> <thead> <tr> <th>Hello Page</th> </tr> <tbody> <tr>

<td>Chào mừng bạn {$username} đến với diễn đàn</td> </tr> </tbody> </table> {$footer} </body> </html></body> </html>

Và đây là phần nội dung của tập tin thực thi

Tạo 1 trang custom page có đường dẫn: mybb/hello.php

Khi mybb/hello.php được gọi, thì nó sẽ gọi templae hello_world mà ta định nghĩa Trang hello.php

<?php

define('IN_MYBB', 1); // (1a) require "./global.php"; // (1b)

$username = $mybb->user['username']; // tên account thành viên (3) eval("\$hello = \"".$templates->get("hello_world")."\";"); // (4) output_page($hello); // (5)

?>

1: rất quan trọng ta không được bỏ nó, chúng ta cần phải đảm bảo có sự kết nối với database, tiếp nhận template, hiển thị header, footer,… nó là thành phần chính của trang.

2: Hiển thị trên thanh menu của trang. Ví dụ với ví dụ trên sẽ hiển thị: Diễn đàn / Hello world page

3: Tại đây ta có thể lập trình truy vấn, viết hàm hay include các hàm thư viện khác,… Tất cả đều trả về 1 biến, và biến này sẽ được sử dụng trong template

Trong ví dụ trên ta có biến $username là tên account thành viên đăng ký, $mybb là 1 đối tượng được mybb tạo sẵn trong các lớp mà global.php tạo ra, ngoài ra còn có $setting,… ta có thể xem trong global.php và inc/init.php

Và khi đó trong template ta chỉ việt gọi lại

<td>Chào mừng bạn {$username} đến với diễn đàn</td>

4,5: Các mã lên trên sẽ được dịch ra template, cùng tên với template mà ta đã tạo.

Một phần của tài liệu Tìm hiểu và viết ứng dụng trên diễn đàn khoa công nghệ thông tin (Trang 46 - 56)