Để 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
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
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 . '&' . NV_NAME_VARIABLE . '=' . $module . '&' . 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 );
}
<?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 . '&' . NV_NAME_VARIABLE . '=' . $module . '&' . 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 . '&' . NV_NAME_VARIABLE . '=' . $module . '&' . 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' );
}
}
0 Comments