Tìm kiếm nhanh

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

Thảo luận trong 'Coding' đăng bởi huongpro_love, 20/07/2016 14:11.

  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    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:

    Root/themes/theme_ban/blocks/ten_block.php // Đây là file xử lý chính
    Root/themes/theme_ban/blocks/ten_block.ini // Đây là file cấu hình
    Root/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

    Continue...

     
    dangdinhtu Nuke Viet thích điều này.
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    2. File xử lý chính

    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:
     

    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  phần nhập dữ liệu từ giao diện cấu hình block của người dùng

    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

     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

    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: 
     

    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:

    <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

     

    Contnue..

     
    Nuke Viet thích điều này.
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    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: 

    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 đó 

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

    $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

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

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

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

     
    Nuke Viet thích điều này.
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Trong 1 số block ta thấy các dòng sau ở function chính của block trong file .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/website/

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


    Continue...

     
    dangdinhtu Nuke Viet thích điều này.
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

    Cái này nói chung các loai block hay nói riêng về block giao diện hả bạn ?

    Vì một số khai niệm mình đọc thấy chưa phân rõ ràng.

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    >_< a lại trêu em rồi. Đây là em viết cho block global đó a.

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Chỗ nào chưa rõ ràng vậy a?

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Có một số chỗ em viết sai mà ko edit lại được hì. 

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

    Ví dụ như đoạn này chẳng hạn

     

    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

     

     

    Phần đó thì đang mô tả cho block module.

    Còn block theme thì nó có mục language.

    Như block global.company_info.php chẳng hạn, thì nó truy vấn vào vi.php hoặc en.php tương ứng với ngôn ngữ giao diện.

    Có một mẹo nữa đó là đưa language của cấu hình block vào file ini thay vì tạo 1 file lang PHP.

     

     
    huongpro_love thích điều này.
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng


    Vâng anh,

    Ở đây em đang nói đến block global đặt trong thư mục blocks của module ấy anh. Ví dụ block global.block_news_cat.php đặt trong modules/news/blocks/ thì file ngôn ngữ block.global.block_news_cat_vi.php đặt trong modules/news/language

    E quên chưa nói blocks giao diện, lúc đó nghĩ ra mà ko sửa được bài, tại vừa viết vừa buồn ngủ :3 

     
  • anhyeuviolet

    anhyeuviolet Kenny Nguyen

    Ừa, tại vì bạn để tiêu đề là block hệ thống nên mình nghĩ tới block theme.

    Chưa kể đoạn trên là lấy cấu trúc của block theme.

    Mình nghĩ bài này ổn, nhưng nếu được thì tách bạch hai loại block ra, vì cách thức gọi data của tụi nó khác nhau, và cấu trúc sắp xếp file cũng khác nhau :D

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Hì vâng, thanks a. Đây em chỉ hướng dẫn chung chủ yếu về cấu trúc của 1 block. Mấy nữa e sẽ cố gắng làm cụ thể hơn :D 

     
  • aptx4869

    aptx4869 Trần Phương

    đọc hiểu sơ sơ dc 50-60% mà vẫn chưa hiểu dc mấy cái tham số trong func hay trong hàm.

    Bạn có thể giải thích rõ hơn ko

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Bạn không hiểu cái nào chỉ rõ mình sẽ giải thích. 

     
  • aptx4869

    aptx4869 Trần Phương

    ví dụ

    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;
        }

    cái biến $module đâu ra và để làm gì vậy bạn v.v.

     
  • huongpro_love

    huongpro_love Nguyễn Văn Hưởng

    Xin lỗi bạn, do sơ xuất nên mình viết cái này vào, chứ thực chất ở block hướng dẫn này không có biến $module.
    Ở đây là 1 function, và cấu trúc của 1 function như sau
     

    function ten_ham(biến truyền vào hàm)
    {
    //code
    return gia_tri_tra_ve
    }
    

    Function là chuỗi các câu lệnh.

    ten_ham: tên của function đó
    Biến truyền vào hàm ở ví dụ trên là $module và $lang_block, nhưng thực chất trong ví dụ này ko lấy những biến đó nên ko cần.

    Từ khóa global để lấy biến từ bên ngoài function vào/ 

    return giá trị được trả về của hàm, ở đây là biến $return.

     
    anhyeuviolet thích điều này.
  • aptx4869

    aptx4869 Trần Phương

    èo làm mình ngồi nghĩ rồi lăn lên lăn xuống cả buổi vẫn ko hiểu gì hehe

     
  • xuanthuy235

    xuanthuy235 Lê Xuân Thủy

    hưởng ơi hướng dẫn dùng hàm vardump nhé

     
  • xuanthuy235

    xuanthuy235 Lê Xuân Thủy

    $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 ????? $db_config hay prefix

     

     
  • dangdinhtu

    dangdinhtu Đặng Đình Tứ

    Điều hành viên Quản trị diễn đàn

    Khi anh var_dump biến này sẽ thấy

    var_dump($db_config);die();
    
    array(10) {
      ["dbhost"]=>
      string(9) "127.0.0.1"
      ["dbport"]=>
      string(0) ""
      ["dbname"]=>
      string(9) "ten csdl"
      ["dbsystem"]=>
      string(9) "ten csdl"
      ["dbuname"]=>
      string(4) "user"
      ["dbtype"]=>
      string(5) "mysql"
      ["collation"]=>
      string(18) "utf8mb4_unicode_ci"
      ["charset"]=>
      string(7) "utf8mb4"
      ["persistent"]=>
      bool(false)
      ["prefix"]=>
      string(3) "nv4"
    }

    Đây là biến trả về thông số kết nối tới CSDL. sau khi cài đặt anh nhé

     
    xuanthuy235 thích điều này.

Chia sẻ trang này

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây