Hướng dẫn Hướng dẫn viết block hệ thống cho Nukeviet 4x [khoanglang12]

--= Roll With The Wind =--
Quản trị viên
Block của hệ thống hay còn gọi là block giao diện hoặc block Global.
Block này được đặt trong thư mục Blocks của modules hoặc đặt trong thư mục themes/themes_sử_dụng/ blocks/

Các biến có thể dùng trong khi viết block dùng chung cho các hướng dẫn bên dưới

$db : Dùng để truy vấn vào csdl
$db_config : Dùng để xác định tiền tố của các bảng CSDL mặc định khi cài sẽ là nv4
$module_info : Dùng để xác định tên thêm đang dùng ví dụ (default, modern) và nhiều thành phần của mảng trong bảng này các bạn có thể var_dump($module_info) để biết thêm các thành phần khác của nó
$global_config : Dùng để xác định tên thêm mặc định, tên site, ... các bạn có thể var_dump( $global_config ) để có thêm các thành phần khác của nó
$site_mods : Dùng đễ xác định quyền, tên module hiện thời truy cập, bao gồm cả module_data, module_file... các bạn có thể var_dump( $global_config ) để biết thêm chi tiết
$block_config : Dùng để xuất nội dung từ hàm cấu hình của block
$nv_Request : Dùng để lấy thông tin từ các Request submit form

Phần 1: Hướng dẫn viết block theo theme
Để viết một block theo theme bạn cần xác định đường dẫn chứa file block của nó như sau:
Code:
/themes/theme_ban/blocks/ten_block.php // Đây là file xử lý chính
/themes/theme_ban/blocks/ten_block.ini // Đây là file cấu hình
/themes/theme_ban/blocks/ten_block.tpl // Đây là file Xtemplate
1. Cấu trúc và cách đặt tên blocks
Tên file .php có dạng global.tenblock.php
Tên file .ini giống tên file .php.
Ví dụ file global.global.company_info.php và global.company_info.ini
Ngoài ra block còn có file ngôn ngữ nếu blocks sử dụng đa ngôn ngữ.
Nếu đặt block trong thư mục blocks của module thì file .php và .ini đặt trong cùng thư mục blocks của module, còn file ngôn ngữ đặt trong thư mục language của module, tên file ngôn ngữ có dạng block.global.tenblock_vi.php
Ví dụ block.global.company_info_vi.php

Còn file .tpl thì đặt trong thư mục themes/theme sử dụng/modules/. Tên file .tpl ta có thể đặt tùy ý, nhưng để dễ nhớ tránh nhầm lẫn ta nên đặt giống với các file .php, .ini

2. File xử lý chính
File xử lý chính là file .php
Block hệ thống có thể được sử dụng nhiều lần trên 1 trang, cùng hoặc khác funcs do đó để kiểm tra xem block đã được sử dụng chưa, tránh sự trùng lặp các phần thì ta đặt code trong câu điều kiện sau:

Code:
if (!nv_function_exists('nv_news_blocks')) {     function nv_block_example {
        // Nội dung code
    } }
Ví dụ 
<!--?php
if ( ! defined( 'NV_MAINFILE' ) ) die( 'Stop!!!' ); 
if ( ! nv_function_exists( 'nv_block_example' ) ) {
     function nv_block_example ( )
    {
      $content ='Hello world'; 
        return $content;     } }

if ( defined( 'NV_SYSTEM' ) ) {
    $content = nv_block_example( ); }
Nội dung block được đặt trong 1 function, ở đây là function nv_block_example
Nếu như block có cấu hình ta thêm 2 function cấu hình là nv_block_config_example nv_block_config_example_submit
Function nv_block_config_example là phần nhập dữ liệu từ giao diện cấu hình block của người dùng
Code:
function nv_block_config_example ( $module, $data_block, $lang_block )
    {
        $html = "";         $html .= "";         $html .= "   " . $lang_block['year'] . "";         $html .= "   ";         $html .= "";       $html .= "";         $html .= "   " . $lang_block['name'] . "";         $html .= "   ";         $html .= "";         return $html;     }
Function nv_block_config_example_submit là phần xử lý dữ liệu đã được cấu hình ở phần cấu hình block
Code:
 function nv_block_config_example_submit ( $module, $lang_block )
    {
        global $nv_Request;         $return = array();         $return['error'] = array();         $return['config'] = array();         $return['config']['year'] = $nv_Request->get_int( 'config_year', 'post', 0 );         $return['config']['name'] = $nv_Request->get_string( 'config_name', 'post', '' );         return $return;     }
Tiếp theo là đến function chính nv_block_example là nội dung của block
Code:
function nv_block_example ( $block_config )
    {
      $content ='Xin chào ' . $block_config['name'] . ' ';       $content .='Tuổi của bạn là: ' . $block_config['year']; 
        return $content;     }
Nội dung block hoàn chỉnh sẽ như sau:
Code:
if ( ! nv_function_exists( 'nv_block_example' ) ) {

function nv_block_config_example ( $module, $data_block, $lang_block )
    {
        $html = "";         $html .= "";         $html .= "   " . $lang_block['year'] . "";         $html .= "   ";         $html .= "";       $html .= "";         $html .= "   " . $lang_block['name'] . "";         $html .= "   ";         $html .= "";         return $html;     }  function nv_block_config_example_submit ( $module, $lang_block )
    {
        global $nv_Request;         $return = array();         $return['error'] = array();         $return['config'] = array();         $return['config']['year'] = $nv_Request->get_int( 'config_year', 'post', 0 );         $return['config']['name'] = $nv_Request->get_string( 'config_name', 'post', '' );         return $return;     }
function nv_block_example ( $block_config )
    {
      $content ='Xin chào ' . $block_config['name'] . ' ';       $content .='Tuổi của bạn là: ' . $block_config['year']; 
        return $content;     } 
} 
if ( defined( 'NV_SYSTEM' ) ) {
    $content = nv_block_example( $block_config ); }
Sau đó bạn tạo file cấu hình có nội dung như sau:
Code:
<block>
    <config>
        <name>huong</name>
        <year>1991</year>
    </config>
    <datafunction>nv_block_config_example</datafunction>
    <submitfunction>nv_block_config_example_submit</submitfunction>
</block>
Giá trị 1991 và "huong" là giá trị cấu hình mặc định khi thiết lập block.
<datafunction>nv_block_config_example</datafunction> Đây là tên function sẽ được gọi để hiển thị phần cấu hình của block khi thực hiện thao tác thêm hoặc sửa block (Ngoài trang chỉnh sửa block)
<submitfunction>nv_block_config_example_submit</submitfunction> Là tên function xử lý dữ liệu cấu hình block khi lưu block

3. Thư viện Xtemplate
Xtemplate là 1 thư viện Nukeviet hỗ trợ để tách PHP và HTML ra thành 2 phần riêng biệt. Ta sử dụng thư viện này để xuất code html cũng như nội dung ra khỏi php, ở đây là đưa html và nội dung vào file .tpl
Để làm được việc này ta chỉnh sửa function chính nv_block_example thành như sau:
Code:
function nv_block_example ( $block_config )
    {
      global $module_info;       $xtpl = new XTemplate( 'global.ten_blokck.tpl', NV_ROOTDIR . '/themes/' . $module_info['template'] . '/blocks' );       $xtpl->assign( 'YEAR', $block_config['year'] );       $xtpl->assign( 'NAME', $block_config['name'] );       $xtpl->parse( 'main' );       return $xtpl->text( 'main' );     }
Trong đó
Code:
      $xtpl = new XTemplate( 'global.ten_blokck.tpl', NV_ROOTDIR . '/themes/' . $module_info['template'] . '/blocks' );
Là đường dẫn của file .tpl. Đường dẫn ở đây là /themes/theme_ban/blocks/global.ten_block.tpl
Nếu như bạn đặt tất cả các files .php .ini .tpl vào thư mục blocks của theme thì thay đường dẫn file tpl như sau:
Code:
$xtpl = new XTemplate('global.ten_blokck.tpl', NV_ROOTDIR . '/themes/' . $block_theme . '/blocks');
4. File hiển thị nội dung .tpl
File này là để thể hiện giao diện người dùng, hoàn toàn bạn sử dụng html, ngoài ra bạn có thể dùng css, js.. để trang trí cho block theo ý mình.
File này được đặt trong cặp BEGIN và END
Code:
<!-- BEGIN: main -->
Nội dung Blocks
<!-- END: main -->
Giá trị các biến được lấy bằng cách sử dụng cấu trúc {YEAR} và {NAME}
Ví dụ file .tpl
Code:
<!-- BEGIN: main -->
<div class="name"> Tên của bạn là: {NAME}</div>
<div class="year"> Bạn sinh năm: {YEAR} 
<!-- END: main -->
COMPLETED !
Các bạn có bất kỳ thắc mắc nào về block có thể đặt câu hỏi tại đây.
 
--= Roll With The Wind =--
Quản trị viên
Trong 1 số block ta thấy các dòng sau ở function chính của block trong file .php
PHP:
if (file_exists(NV_ROOTDIR . '/themes/' . $global_config['module_theme'] . '/blocks/global.social.tpl')) {
$block_theme = $global_config['module_theme'];
} elseif (file_exists(NV_ROOTDIR . '/themes/' . $global_config['site_theme'] . '/blocks/global.social.tpl')) {
$block_theme = $global_config['site_theme'];         } else {             $block_theme = 'default';       
}
$xtpl = new XTemplate('global.social.tpl', NV_ROOTDIR . '/themes/' . $block_theme . '/blocks');
Đoạn này là điểu kiện để lấy đường dẫn của block, hay nói chính xác hơn là lấy giá trị của biến $block_theme.

Giải thích:
- file_exists: là hàm kiểm tra xem file hoặc thư mục có tồn tại hay không.
- NV_ROOTDIR: Đường dẫn đến thư mục gốc chứa website của bạn. Ví dụ domain của bạn là nuke.vn, code website của bạn đặt trong thư mục website thì đường dẫn thư mục gốc của bạn là
http://nuke.vn/folder/
-
$global_config['module_theme']: Đường dẫn đến thư mục module trong theme của bạn
- $global_config['site_theme'] : Đường dẫn đến thư mục theme của bạn
Ta hiểu đoạn này như sau, nếu tôn tại file global.social.tpl trong thư mục blocks của modules trong theme thì gán biến $block_theme là $global_config['module_theme']; khi đó đường dẫn của file .tpl được lấy là themes/theme sử dụng/ modules/module sử dụng/ blocks
Nếu không thì gán biến $block_theme là $global_config['site_theme']; khi đó đường dẫn của file .tpl được lấy là themes/theme sử dụng/ blocks/
Nêu trong theme bạn đang dùng không tồn tại file này thì sẽ lấy trong theme mặc định là theme default.

Thực chất của câu điều kiện này chỉ là để bạn có thể đặt file .tpl ở nhiều nơi khác nhau mà không sợ bị lỗi khi sử dụng block/
 
Thành viên mới
hay, bạn làm một cái demo để hiểu hơn
 
Thích: anhyeuviolet
Thành viên quá tích cực
Quản trị viên
:D ôi 1 thời....
 
Thích: hoangkyanh0109
Thành viên mới
Cho em hỏi là làm cách nào để lấy giá trị mặc định trong Config khi người dùng không nhập giá trị vào vậy ạ?