Hướng dẫn thêm chức năng bình luận (comment) cho module NukeViet

Thứ sáu - 19/06/2015 20:35
Bình luận (Comment) là chức năng không thể thiếu trong các hệ thống có chức năng thảo luận. NukeVet đã xây dựng module comment để thực hiện điều này.
Từ phiên bản NukeViet 4.0, NukeViet bổ sung module Comment làm module hệ thống, có chức năng quản lý bình luận chung cho các module. Module comment giúp việc quản lý các bình luận từ thành viên một cách tập trung, giúp việc quản lý đơn giản hơn.

1) Xóa comment của module cũ đi nếu có

2) Thêm đoạn sau vào file modules\module_name\funcs\module_op.php

// comment
if( isset( $site_mods['comment'] ) and isset( $module_config[$module_name]['activecomm'] ) )
{
	define( 'NV_COMM_ID', $id ); //ID bài viết
	define( 'NV_COMM_AREA', $module_info['funcs'][$op]['func_id'] ); //để đáp ứng comment ở bất cứ đâu không cứ là bài viết
	$allowed = $module_config[$module_name]['allowed_comm']; //check allow comemnt
	//tuy vào module để lấy cấu hình. Nếu là module news thì có cấu hình theo bài viết
	if( $allowed == '-1' )
	{
		$allowed = $news_contents['allowed_comm'];
	}
	define( 'NV_PER_PAGE_COMMENT', 5 );

	//Số bản ghi hiển thị bình luận
	require_once NV_ROOTDIR . '/modules/comment/comment.php';
	$area = ( defined( 'NV_COMM_AREA' )) ? NV_COMM_AREA : 0;
	$checkss = md5( $module_name . '-' . $area . '-' . NV_COMM_ID . '-' . $allowed . '-' . NV_CACHE_PREFIX );

	//get url comment
	$url_info = parse_url( $client_info['selfurl'] );
	$content_comment = nv_comment_module( $module_name, $checkss, $area, NV_COMM_ID, $allowed, 1 );
}
else
{
	$content_comment = '';
}

Trong đó, bạn cần lưu ý:

1. define( 'NV_COMM_ID', $id ): $id là ID của bài viết, chủ đề,... (ID xác định trang)
2. Nếu module bạn có cấu hình hiển thị comment theo “từng bài viết cụ thể” thì thêm đoạn này (Xem code mẫu bên trên) để xác định cấu hình từ bài viết. Ngược lại, bỏ đoạn này đi, thì module nhận cấu hình từ Cấu hình module comment

if( $allowed == '-1' )
{
	$allowed = $news_contents['allowed_comm'];
}

$news_contents['allowed_comm'] là ID nhóm được phân quyền comment tại bài viết, thay bằng tham số tương ứng với module của bạn.

3) Truyền biến $content_comment sang file xử lý giao diện (theme.php, nếu có)

4) Tại function xử lý giao diện, gọi hiển thị nội dung form bình luận.

if( !empty( $content_comment ) )
{
	$xtpl->assign( 'CONTENT_COMMENT', $content_comment );
	$xtpl->parse( 'main.comment' );
}

5) Tại file giao diện (*.tpl), thêm html hiển thị nội dung bình luận.

<!-- BEGIN: comment -->
{CONTENT_COMMENT}
<!-- END: comment -->

6) Trong file action tạo CSDL (modules/ten-module/action_mysql.php) của module cần thêm đoạn code sau để tạo dữ liệu cài đặt cho module

Tìm

$sql_create_module = $sql_drop_module;
Thêm lên trên
$result = $db->query( "SHOW TABLE STATUS LIKE '" . $db_config['prefix'] . "\_" . $lang . "\_comment'" );
$rows = $result->fetchAll( );
if( sizeof( $rows ) )
{
	$sql_drop_module[] = "DELETE FROM " . $db_config['prefix'] . "_" . $lang . "_comment WHERE module='" . $module_name . "'";
}
Thêm xuống cuối file
// Comments
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'auto_postcomm', '1')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'allowed_comm', '6')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'view_comm', '6')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'setcomm', '4')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'activecomm', '1')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'emailcomm', '0')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'adminscomm', '')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'sortcomm', '0')";
$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . NV_LANG_DATA . "', '" . $module_name . "', 'captcha', '1')";

7) Nếu module bạn họat động trước đó và đã có dữ liệu, thực hiện bước này để nâng cấp CSDL, ngược lại, bỏ qua bước này.

Tạo file update-comment.php với nội dung bên dưới, đặt ngang hàng với file index.php
<?php

/**
 * @Project NUKEVIET 4.x
 * @Author VINADES.,JSC (contact@vinades.vn)
 * @Copyright (C) 2015 VINADES.,JSC. All rights reserved
 * @License GNU/GPL version 2 or any later version
 * @Createdate Wed, 02 Dec 2015 08:26:04 GMT
 */

define( 'NV_SYSTEM', true );

// Xac dinh thu muc goc cua site
define( 'NV_ROOTDIR', pathinfo( str_replace( DIRECTORY_SEPARATOR, '/', __file__ ), PATHINFO_DIRNAME ) );

require NV_ROOTDIR . '/includes/mainfile.php';
require NV_ROOTDIR . '/includes/core/user_functions.php';

if( defined( 'NV_IS_SPADMIN' ) )
{
	// Comments
	$module_name = 'page';
	// Sửa ứng với module
	$sql_create_module = array( );
	// Comments
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'auto_postcomm', '1')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'allowed_comm', '-1')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'view_comm', '6')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'setcomm', '4')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'activecomm', '1')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'emailcomm', '0')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'adminscomm', '')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'sortcomm', '0')";
	$sql_create_module[] = "INSERT INTO " . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'captcha', '1')";

	foreach( $sql_create_module as $_sql )
	{
		$db->query( $_sql );
	}
	die( 'Thuc hien nang cap xong, hay xoa file nay ngay' );
}
else
{
	die( 'Can thuc hien voi quyen admin toi cao' );
}
Trong trường hợp bạn muốn thao tác dữ liệu trên module nhận chức năng comment (Ví dụ: Module news sau khi người dùng bình luân thì cập nhật lại số lượng bình luận ở mỗi bài viết), bạn tạo thêm một file với tên là comment.php đặt vào thư mục modules/ten-module/. Có thể tham khảo nội dung file này ở modules/news/comment.php.
Tham khảo: https://github.com/nukeviet/nukeviet/wiki/

Tổng số điểm của bài viết là: 44 trong 10 đánh giá

Xếp hạng: 4.4 - 10 phiếu bầu
Click để đánh giá bài viết

  Ý kiến bạn đọc

  • Kenny Nguyễn
    Kenny Nguyễn   23/06/2015 02:44

    Cảm ơn bạn ! :D
    Mình nghĩ có lẽ cái này tuỳ theo định hướng của NV mà phát triển cái comment này cho chính xác thôi.
    Ngoài ra thì còn 1 file nữa là func nằm trong modules/tênmodules/admin/view.php

    Cái này sẽ quyết định URL trong phần quản lý comment của modules sẽ trỏ tới link nào. Dựa vào area được truyền vào, với view.php thì người lập trình sẽ có thể chuyển link đến từng func tương ứng khi có comment ( trường hợp áp dụng comment cho từ 2 func trong cùng một modules ).

    Bài viết rất hữu ích, cảm ơn tác giả lần nữa ! :D

    • Administrator   23/06/2015 02:57

      @Kenny Nguyễn cứ bỏ sót file thế này thì chết :v. Cảm ơn nhé.

  • Kenny Nguyễn
    Kenny Nguyễn   21/06/2015 21:44

    Mình phát hiện ra lỗi do đâu rồi. Và trong bài HD này tác giả cũng sót 1 khâu, đó là file comment.php nằm ngay thư mục chứa domain. Nếu file này sai hay lỗi thì cũng ẹ nốt.

    Và từ file này, mình nhận thấy rằng modules comment NV hiện tại chỉ sẵn sàng cho func detail của từng modules chứ chưa thể đem đi các func khác được.
    Comment thì ok, chứ cơ chế đếm comment và link chuyển đến thì no ok :(

    • Administrator   23/06/2015 02:39

      @Kenny Nguyễn đã cập nhật lại bài viết, có nói cách dùng file comment.php ở mỗi module. Còn mấy cái kia có ý kiến gì cứ lên github ^^

Trung tâm ứng dụng NukeViet
Ghi rõ nguồn khi sao chép thông tin từ website này.

Powered by NukeViet - a product of VINADES.,JSC