Tìm kiếm nhanh

Hướng dẫn viết Block module dành cho Module nukeviet 4

Thảo luận trong 'Coding' đăng bởi nhimthulinh, 26/06/2016 06:28.

  • nhimthulinh

    nhimthulinh

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

    Để viết một Block module dành cho Module bạn cần xác định đường dẫn chứa file block của nó như sau:
    Root/modules/ten_module/blocks/ten_block.php
    Root/themes/ten_module/blocks/ten_block.ini
    Root/themes/ten_module/language/block.module.ten_block_lang.php
    Root/themes/ten_module/blocks/ten_block.tpl

     Trong đó Root là đường dẫn tới file index.php của bộ mã nguồn Nukeviet
    ten_module: Là tên modules mà bạn muốn tạo block để sử dụng
    ten_block: là block bạn sẽ tạo ra để sử dụng

    Bước một: Cấu trúc ten_block như sau
    module.tenbandat.php


    Nếu block bạn muốn sử dụng có chức năng cấu hình bạn cần thêm một file tương tự với tên đuôi file là .ini
    module.tenbandat.ini

    Như vậy cấu trúc của bạn sẽ gồm 4 file

    module.tenbandat.php
    module.tenbandat.ini
    block.module.ten_block_lang.php
    tenbandat.tpl

    Bước hai: Tạo nội dung cho các file ở đây mình sẽ ví dụ với module news nhé :D

    a. file module.tenbandat.php

    Dựa vào cách gọi hàm cấu hình và sử dụng thư viện Xtemplate của phần một mình sẽ không thực hiện lại cách lấy mà sẽ áp dụng luôn vào block nhé.
    Ở đây mình chỉ tập trung vào cách truy vấn CSDL và cache dữ liệu cho các block kiểu này thôi.

    <?php
    /**
     * @Project NUKEVIET 4.x
     * @Author DANGDINHTU (dlinhvan@gmail.com)
     * @Copyright (C) 2014 Webdep24.com
     * @License GNU/GPL version 2 or any later version
     * @Createdate 16:58 11/11/2014
     */
    if( ! defined( 'NV_MAINFILE' ) ) die( 'Stop!!!' );
    if( ! nv_function_exists( 'nv_news_block_tenbandat' ) )
    {
       function nv_check_theme( $mod_file ) 
       {
          global $global_config; 
          // kiểm tra theme chứa block nếu theme đang dùng không có sẽ gọi tới block trong theme mặc định (default) của hệ thống
          if( file_exists( NV_ROOTDIR . '/themes/' . $global_config['site_theme'] . '/modules/' . $mod_file . '/block_tenbandat.tpl' ) )
          {
             $block_theme = $global_config['site_theme'];
          }
          else
          {
             $block_theme = 'default';
          }
          return $block_theme;
       }
       function nv_block_config_news_tenbandat( $module, $data_block, $lang_block )
       {
          global $site_mods;
          $block_theme = nv_check_theme( $site_mods[$module]['module_file'] ) ;
          // gọi thư viện XTemplate
          $xtpl = new XTemplate( 'block_tenbandat.tpl', NV_ROOTDIR . '/themes/' . $block_theme . '/modules/' . $site_mods[$module]['module_file'] );
          $xtpl->assign( 'LANG', $lang_block );
          $xtpl->assign( 'TEMPLATE', $block_theme );
          $xtpl->assign( 'NV_BASE_SITEURL', NV_BASE_SITEURL );
          $xtpl->assign( 'DATA', $data_block );
          $xtpl->parse( 'config' );
          return $xtpl->text( 'config' );
       }
       function nv_block_config_news_tenbandat_submit( $module, $lang_block )
       {
          global $nv_Request;
          $return = array();
          $return['error'] = array();
          $return['config'] = array();
          $return['config']['numrow'] = $nv_Request->get_int( 'config_numrow', 'post', 0 );
          return $return;
       }
       function nv_news_block_tenbandat( $block_config )
       {
          // gọi các biến sử dụng trong block 
          global $site_mods, $global_array_cat, $global_config, $lang_module, $db, $module_config, $module_info;
          // xây dựng biến dành cho module từ $site_mods bạn có thể var_dump( $site_mods ) để biết thêm chi tiết
          $module = $block_config['module'];
          $mod_data = $site_mods[$module]['module_data'];
          $mod_file = $site_mods[$module]['module_file'];
          $block_theme = nv_check_theme( $site_mods[$module]['module_file'] ) ;
          // gọi thư viện XTemplate
          $xtpl = new XTemplate( 'block_tenbandat.tpl', NV_ROOTDIR . '/themes/' . $block_theme . '/modules/' . $mod_file );
          // xuất dữ liệu php ra file tpl
          $xtpl->assign( 'LANG', $lang_module );
          $xtpl->assign( 'TEMPLATE', $block_theme );
          $xtpl->assign( 'NV_BASE_SITEURL', NV_BASE_SITEURL );
          /* Truy vấn CSLD module news để làm được việc này bạn cần hiểu cấu trúc của csdl module news. Bạn có thể đăng nhập 
             vào phpmyadmin để xem cấu trúc ở đây mình sẽ truy vấn vào bảng nv4_vi_news_rows
          */
          $sql='SELECT id, catid, title, alias FROM ' . NV_PREFIXLANG . '_' . $mod_data . '_rows WHERE status= 1 ORDER BY publtime DESC LIMIT 0, ' . $block_config['numrow'];
          $result = $db->query( $sql );
          while( $loop = $result->fetch() )
          {
             // tạo đường dẫn tới chi tiết bài viết
             $loop['link'] = NV_BASE_SITEURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&amp;' . NV_NAME_VARIABLE . '=' . $module . '&amp;' . NV_OP_VARIABLE . '=' . $global_array_cat[$loop['catid']]['alias'] . '/' . $loop['alias'] . '-' . $loop['id'] . $global_config['rewrite_exturl'];
             $xtpl->assign( 'LOOP', $loop );
             $xtpl->parse( 'main.loop' );
          }
          $xtpl->parse( 'main' );
          return $xtpl->text( 'main' );
       }
    }
    if( defined( 'NV_SYSTEM' ) )
    {
       $module = $block_config['module'];
       $content = nv_news_block_tenbandat(  $block_config );
    }

    b. file module.tenbandat.ini

    <?xml version="1.0" encoding="utf-8"?>
    <block>
        <info>
            <name>Block news</name>
            <author>DANG DINH TU</author>
            <website>http://webdep24.com</website>
            <description>Block news</description>
        </info>
        <config>
            <numrow>5</numrow>
        </config>
       <datafunction>nv_block_config_news_tenbandat</datafunction>
        <submitfunction>nv_block_config_news_tenbandat_submit</submitfunction>
    </block>

    c. file block_tenbandat.tpl

    <!-- BEGIN: config -->
    <tr>
        <td>{LANG.numrow}</td>
        <td>
            <input type="text" name="config_numrow" value="{DATA.numrow}" class="w500 form-control">
        </td>
    </tr>
    <!-- END: config -->
    <!-- BEGIN: main -->
    <style type="text/css">
    .tenbandat ul li {
       display: block;
       margin: 0;
       padding: 5px 0;
       border-bottom: 1px #ccc solid;
    }
    </style>
    <div class="tenbandat">
       <ul>
          <!-- BEGIN: loop -->
          <li><a href="{LOOP.link}" title="{LOOP.title}">{LOOP.title}</a></li>
          <!-- END: loop -->
       </ul>
    </div>
    <!-- END: main -->

    d. file block.module.tenbandat_vi.php
     

    <?php
    /**
     * @Project NUKEVIET 4.x
     * @Author VINADES.,JSC (contact@vinades.vn)
     * @Copyright (C) 2014 VINADES.,JSC. All rights reserved
     * @Language Tiếng Việt
     * @License CC BY-SA (http://creativecommons.org/licenses/by-sa/4.0/)
     * @Createdate Jun 22, 2010, 08:22:00 AM
     */
    if( ! defined( 'NV_ADMIN' ) or ! defined( 'NV_MAINFILE' ) ) die( 'Stop!!!' );
    $lang_translator['author'] = 'VINADES.,JSC (contact@vinades.vn)';
    $lang_translator['createdate'] = '22/06/2010, 09:22';
    $lang_translator['copyright'] = '@Copyright (C) 2012 VINADES.,JSC. All rights reserved';
    $lang_translator['info'] = '';
    $lang_translator['langtype'] = 'lang_block';
    $lang_block['numrow'] = 'Số bài hiển thị';

    Nếu bạn sử dụng thêm các ngôn ngữ khác như tiếng anh bạn chỉ việc tạo thêm file block.module.tenbandat_en.php
    các ngôn ngữ khách bạn chỉ cần đổi cái đuôi lang là OK
    Đây là block gần như gọi là chung nhất cho tất cả các block khác khi bạn muốn tạo block khác chỉ cần nhân bản nó lên và đổi tên khác đi
    sau đó thực hiện các truy vấn tới CSDL để có được các block mình mong muốn trường hợp bạn muốn cache truy vấn thì bạn có thể làm như sau
    phần này chỉ chú tâm vào sửa lại block trên thôi nhé.
    bạn tìm đến phần truy vấn CSDL của block
    thay thế đoạn này

    $result = $db->query( $sql );   
    while( $loop = $result->fetch() )
    {
       $loop['link'] = NV_BASE_SITEURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&amp;' . NV_NAME_VARIABLE . '=' . $module . '&amp;' . NV_OP_VARIABLE . '=' . $global_array_cat[$loop['catid']]['alias'] . '/' . $loop['alias'] . '-' . $loop['id'] . $global_config['rewrite_exturl'];
       $xtpl->assign( 'LOOP', $loop );
       $xtpl->parse( 'main.loop' );
    }

    bằng đoạn
     

    $list = nv_db_cache( $sql, 'id', $module );
    if( !empty( $list ) )
    {
       foreach( $list as $loop )
       {
          $loop['link'] = NV_BASE_SITEURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&amp;' . NV_NAME_VARIABLE . '=' . $module . '&amp;' . NV_OP_VARIABLE . '=' . $global_array_cat[$loop['catid']]['alias'] . '/' . $loop['alias'] . '-' . $loop['id'] . $global_config['rewrite_exturl'];
          $xtpl->assign( 'LOOP', $loop );
          $xtpl->parse( 'main.loop' );
       }
    }

    Như vậy là mình đã hướng dẫn xong phần này hãy ấn like và share để có thêm những bài viết hay và chất lượng hơn nhé  

     
    khicon038 hoanglongvnpt dangdinhtu 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