Thứ Năm, 17 tháng 11, 2011

Hướng dẫn viết block cho phiên bản NukeViet 3.0

Standard
Lâu rồi Xman không viết bài hướng dẫn nào cho mọi người vì bận nhiều việc riêng quá. Hôm nay tranh thủ viết bài hướng dẫn cách bạn viết block cho phiên bản NukeViet 3.0.


Yêu cầu:
-Phiên bản NukeViet 3.0
-Một trình soạn thảo text

OK, bài này mình sẽ hướng dẫn một cách chung nhất và bạn có thể viết được 1 block theo ý mình.

Đối với các blocks dạng global nằm trong thư mục includes/blocks mà bạn muốn sử dụng xuyên suốt trên toàn bộ các khu vực tức là có thể chạy trên tất cả các module cách thức đặt tên như sau:
MÃ: CHỌN TẤT CẢ
global.tênblock.php

trong đó global là bắt buộc để hệ thống nhận dạng đó là block.

Đối với các blocks của module thường nằm trong thư mục modules/tênmodule/blocks thì cách thức đặt tên như sau:
MÃ: CHỌN TẤT CẢ
module.tênblock.php

trong đó bắt buộc phải bắt đầu bằng từ "module".
Do đó các bạn xác định sẽ viết block dạng nào và thuộc module nào thì nhớ là đặt đúng vị trí thư mục và đúng tên.

Cấu trúc 1 block của NV (NukeViet) bạn có thể thấy ví dụ như block global about như sau:
MÃ: CHỌN TẤT CẢ
<?php

/**
* @Project NUKEVIET 3.0
* @Author VINADES.,JSC (contact@vinades.vn)
* @Copyright (C) 2010 VINADES., JSC. All rights reserved
* @Createdate 3/25/2010 18:6
*/
if ( ! defined( 'NV_SYSTEM' ) ) die( 'Stop!!!' );

if ( ! function_exists( 'nv_message_about' ) )
{
    function nv_message_about()
    {
        global $global_config, $db, $lang_global, $site_mods, $module_file;

        $sql = "SELECT `id`,`title`,`alias`,`bodytext` FROM `" . NV_PREFIXLANG . "_about` WHERE status = 1 LIMIT 1";
        $result = $db->sql_query( $sql );
        $num = $db->sql_numrows( $result );
        if ( $num )
        {
            list( $id, $title, $alias, $bodytext ) = $db->sql_fetchrow( $result );
            $link = NV_BASE_SITEURL . "?" . NV_LANG_VARIABLE . "=" . NV_LANG_DATA . "&amp;" . NV_NAME_VARIABLE . "=about&amp;" . NV_OP_VARIABLE . "=" . $alias;
            $bodytext = strip_tags( $bodytext );
            $bodytext = nv_clean60( $bodytext, 300 );
            $xtpl = new XTemplate( "global.about.tpl", NV_ROOTDIR . "/themes/" . $global_config['site_theme'] . "/blocks/" );
            $xtpl->assign( 'LINK', $link );
            $xtpl->assign( 'TITLE', $title );
            $xtpl->assign( 'BODYTEXT', $bodytext );
            $xtpl->parse( 'main' );
            $content = $xtpl->text( 'main' );
            return $content;
        }
    }
}

$content = nv_message_about();

?>


Phần mở đầu chính là thông tin về tác giả và mô tả về block các bạn có thể bỏ qua cũng được
MÃ: CHỌN TẤT CẢ
/**
* @Project NUKEVIET 3.0
* @Author VINADES.,JSC (contact@vinades.vn)
* @Copyright (C) 2010 VINADES., JSC. All rights reserved
* @Createdate 3/25/2010 18:6
*/


Tiếp theo đó là phần khai báo kiểm tra xem có thuộc hệ thống hay không và chống truy cập trực tiếp.

Đối với block dạng global thì ta sẽ khai báo như sau:
MÃ: CHỌN TẤT CẢ
if ( ! defined( 'NV_SYSTEM' ) ) die( 'Stop!!!' );


Đối với block của module thì ta sẽ khai báo cú pháp như sau:
MÃ: CHỌN TẤT CẢ
if ( ! defined( 'NV_IS_MOD_TENMODULE' ) ) die( 'Stop!!!' );

trong đó TENMODULE chính là tên thư mục module mà bạn muốn viết block cho module này

Tiếp theo là :
MÃ: CHỌN TẤT CẢ
if ( ! function_exists( 'nv_message_about' ) )
{
function nv_message_about()
{
....code content...
}
}

Nhiệm vụ của dòng này là php sẽ kiểm tra xem hàm "nv_message_about" có tồn tại hay chưa nếu chưa thì tiến hành khai báo hàm này nếu có rồi thì sẽ không khai báo nữa, hàm này là tuỳ ý bạn đặt tên, lý do đó chính là hệ thống NV cho phép bạn thêm trên 1 trang nhiều nhiều block cùng 1 file do đó nếu trên cùng 1 trang và khai báo hàm đã được khai báo sẽ phát sinh lỗi.

Ngoài ra thông thường nếu block của bạn không cần phải xử lý những chức năng hay dữ liệu bằng việc tạo ra các hàm xử lý đặc biệt thì có thể bỏ qua không cần khai báo dòng trên.

OK, trong đoạn trên các bạn để ý dòng "...code content..." đây chính là phần bạn cần lập trình để tạo ra block theo mục đích của mình.

Để có thể thực hiện và lấy dữ liệu từ hệ thống 1 cách chính xác bạn cần phải hiểu qua một vài biến global mà hệ thống cung cấp cho bạn:
MÃ: CHỌN TẤT CẢ
global $global_config, $db, $lang_global, $module_file,....;


$global_config: đây chính là mảng chứa những giá trị cấu hình của hệ thống nếu bạn cần.
$db: đây chính là 1 object cho phép bạn truy cập những method được xây dựng sẵn trong class mysql của hệ thông
$lang_global: đây chính là mảng chứa giá trị là những định nghĩa ngôn ngữ xây dựng sẵn của hệ thống
$module_name: đây chính là tên module đang được truy cập đến.
$module_data: đây chính là tên bảng mysql được thiết lập và tạo ra trong csdl mà module đang được truy cập đến để lấy dữ liệu.


Thông thường nếu bạn là 1 người phát triển 1 module nào đó những biến mà bạn tạo ra nếu có thể dùng được và cho phép dùng ở dạng global ở block thì các bạn có thể khai báo thêm vào phần phía sau trong dòng code trên.

CONSTANT VARIBALE:

NV_PREFIXLANG: đây chính là kết hợp giữa giá trị $db_config['prefix'] và NV_LANG_DATA tức là sẽ lấy giá trị tiền tố trong quá trình bạn cài đặt NV và viết tắt của ngôn ngữ hiện tại đang dùng có thể là "vi" hoặc "en" hoặc 1 ngôn ngữ nào đó mà trên hệ thống của bạn có.
NV_BASE_SITEURL : biến này sẽ trả về giá trị là thư mục hoặc cấp cao nhất mà website của bạn đang chạy ví dụ đường dẫn website của bạn là http://user.vn/ thì hàm này trả về là "/"
NV_LANG_VARIABLE: biến này trả về giá trị chính là "lang"
NV_LANG_DATA: như đã giải thích ở NV_PREFIXLANG
NV_NAME_VARIABLE: biến này trả về giá trị ví dụ là "nv"
NV_OP_VARIABLE: biến này trả về giá trị ví dụ là "op"
NV_ROOTDIR: biến này trả về chính là đường dẫn vật lý trên đĩa cứng đang chứa thư mục chạy nukeviet của bạn ví dụ như của xman là : D:/xampp/htdocs/nukeviet3svn lưu ý là không có dấu / ở cuối cùng


Sau đây là hướng dẫn cách bạn truy xuất vào csdl của nukeviet. Trước khi thực hiện bạn phải xác định được bạn muốn lấy dữ liệu từ bảng nào, và truy xuất bao nhiêu row trong csdl. Ví dụ sau đấy là lấy ra các bản ghi trong module about tạo ra tôi sẽ làm như sau
MÃ: CHỌN TẤT CẢ
        $sql = "SELECT `id`,`title`,`alias`,`bodytext` FROM `" . NV_PREFIXLANG . "_about` WHERE status = 1 LIMIT 1";
        $result = $db->sql_query( $sql );

Thông thường thì khi lấy dữ liệu thì sẽ kèm theo nó là lấy dữ liệu theo điều kiện ví dụ ở đây là WHERE status = 1 tức là tôi chỉ lấy SELECT những bản ghi có trường "status" = 1 tương đương với việc bản ghi này ý nghĩa có thể cho phép hoạt động trên site trong bảng FROM `" . NV_PREFIXLANG . "_about` . Trường "status" chinh là trường mà người viết module đặt ra và sẽ khác nhau với mỗi module ví dụ có module sẽ là "active" hoặc khác do đó không cố định. Nếu bạn không lấy theo điều kiện nào thì có thể bỏ câu lệnh WHERE đằng sau này.

Trong câu lệnh trên tôi chỉ lấy ra id, title, alias và bodytext từ bảng about và với điều kiện status là 1
Để trả về kết quả có thực hiện câu lệnh sql trên được hay không tôi sử dụng gán kết quả vào biến $result bằng phương thức $db->sql_query($sql):
MÃ: CHỌN TẤT CẢ
$result = $db->sql_query( $sql );

Ở đây mỗi lần truy cập tôi chỉ lấy được 1 bản ghi do đó để lấy hết số lượng bản ghi đáp ứng được điều kiện của tôi thì tôi sử dụng vòng lặp WHILE:
MÃ: CHỌN TẤT CẢ
while ( list( $id, $listcatid, $publtime, $exptime, $title, $alias, $homeimgthumb ) = $db->sql_fetchrow( $result ) )

Trong câu lệnh trên tôi dùng hàm list và gán các giá trị lấy được từ csdl vào biến tương ứng với số field trong câu lệnh SELECT phía trên. Để lấy được các bản ghi tôi sử dụng phương thức $db->sql_fetchrow:
MÃ: CHỌN TẤT CẢ
$db->sql_fetchrow( $result )

và $result chính là kết quả trả về từ $db->sql_query

Sau khi đã có dữ liệu chính là các biến:
MÃ: CHỌN TẤT CẢ
$id, $listcatid, $publtime, $exptime, $title, $alias, $homeimgthumb


thì các bạn có thể thay đổi hoặc sửa đổi tuỳ theo ý thích của mình và điều quan trọng sau cùng đó là muốn hiển thị kết quả ra cho người dùng như thế nào.

Để xuất dữ liệu hiển thị ra ngoài bạn chỉ việc đẩy các giá trị vào biến:
MÃ: CHỌN TẤT CẢ
$content

Ví dụ tôi chỉ xuất đơn thuần các biến ra ngoài mà chưa định dạng html hiển thị như sau:
MÃ: CHỌN TẤT CẢ
$content = $id. $listcatid. $publtime. $exptime. $title. $alias. $homeimgthum;


Ok trên đây là cách thức xây dựng 1 block đơn thuần và vấn đề của bạn là ứng dụng nó vào kết hợp với các mã html cho các biến trên để dịnh dạng đẹp mắt hơn cho việc hiển thị ra bên ngoài.
Cuối cùng là vào admin và thử thêm block này và chiêm ngưỡng thành quả.

Chúc các bạn thành công, Xman !







0 nhận xét:

Đăng nhận xét