Viết Mod trong VBB

Việc sử dụng VBB làm forum thì khá nhiều người viết. Tuy nhiên để để nâng dần tính năng của forum với nhiều chức năng thì phần lớn phải đi tìm các mod và cài thêm. Tuy nhiên có 2 vấn đề ở đây

1. Trong các mod có cài thêm những shell ngoài ý muốn <-- khá nguy hiểm. Tôi đã bị rồi nên cảm giác không còn tin các mod nữa

2. Có nhiều tính năng người ta chưa viết hoặc viết rồi nhưng dấu diếm.

trước khi đọc bài này các bạn hãy đọc bài viết của nick chiplove http://thuthuat.chiplove.biz/post/huong-dan-viet-mod-plugin-cho-vbb-chi-tiet-de-hieu.777/

Bài này tôi muốn viết một tut để hướng dẫn các bạn hiểu 1 mod, viết một mod như thế nào. Có thể là chưa hoàn thiện nhưng xem như bước đầu cho các bạn có khải niệm tí tí về viết mod. Qua bài này tôi muốn các bạn có khả năng đọc các mod người ta viết để nâng dần khả năng viết mod của mình. Tôi cũng làm như vậy để viết ra những mod mới. hiện tại tôi có khoảng 5 mod do tự tay mình viết hoặc chỉnh sửa cho mục đích riêng của mình. THôi không dong dài nữa

Mod ở đây cũng là mod khá được nhiều yêu cầu nhưng không phải ai cũng có được đó là chèn thêm trường giá vào bài viết cho những ai làm về rao vặt.... Các bạn thử tra thử thì thấy có nhiều người muốn lắm . Mod này làm mod này vì muốn add vào trong trang mua bán xe otoaz.com của tôi.

Tham khảo mod extra field thread thì nó làm tổng quát quá nên khá rườm rà nên thôi tự viết lại vậy…

Đầu tiên thì cũng nên nhắc lại một tí bố cục của một mod

Một mod thông thường sẽ có  nhiều plugin tương ứng với từng thao tác vào hook của hệ thống VBB mà cần can thiệp

Mỗi plugin có thể viết bằng PHP, mySQL rất bình thường .

Ngoài ra mỗi mod sẽ phải can thiệp tới template của hệ thống vì thế viết mod thì cũng phải biết vọc template nhé các ban. Thôi không nói nữa các bạn theo dõi bài viết sau vậy:

Đầu tiên để viết được nên chèn  dòng sau trong file config, dòng này dung để kiểm tra debug, viết form cho mod cua mình

$config[Misc][debug] = true;

 Vào plugin&products àmanage productàadd/import products

 

Tại đây nhập những thông số của mod để dễ dàng quản lý sau này sau đó lưu lại 

Bây giờ chuẩn bị CSDL để thao tác. Do cần them 1 trường cho từng thread nên cần tạo 1 cột price_field để chứa giá . Ở đây qui định giá là tiền Việt nam đồng. Còn sẽ tính việc chuyển đổi sau

Để tạo có 2 cách : 1 vào trong phpmyadmin rồi tạo, 2 là viết script SQL (giúp tự động import sau này khi xuất XML)… Mẹo là nếu đơn giản thì vào trong phpmyadmin tạo xong rồi chép code ra cho đơn giản

 

Tôi có giao diện cho việc thêm trường và xóa trường nếu sau này không dung mod này nữa

Bây giờ đến viết tạo form cho thông số của mod.

 

Vào trong vBulletin Options sẽ thấy xuất hiện một giao diện mới mà nếu không bật debug thì không thể có (chú ý phia bên trái). Lúc này để tạo một option cho mod của mình thì vào add new setting group

ting group

Click vào sẽ có

 

Bây giờ điền các thông tin sau:

varname : biến lưu form option (sau này sẽ truy xuất khi viết)

tiêu đề: khỏi nói viết gì đấy viết

product: phải chọn mod mà mình đã tạo trước . Ok các cái khác cứ để mặc định . Lưu lại nhé.

 

Bây giờ ta có một bảng thông số của mod nhưng chưa có gì hết. Cần them những mục vào . Ở đây tôi chỉ hướng dẫn các bạn một trường các bạn them những cái khác vào nhé. Chọn add setting ở cuối phần tên của form.

Hình trên tôi đã tạo được 2 thông số rồi tiếp tục tạo thông số thứ 3 là tỉ giá chuyển đổi giữa USD và VND

Chú ý: varname: rất quan trọng sau này sẽ truy xuất khi viết trong plugin.

ở đây chí ý trường option code: là kiểu đối tượng trên form mặt định : là text, yesno:radio……

 

datatype:kiểu dữ liệu của thông số này  sẽ chọn là numberic

Lần lượt các tham số khác thì cũng làm tương tự nhé.

Bây giờ bắt tay vào làm cái giao diện đầu tiên cái

Muốn tạo một cột giá với đơn vị tiền tệ sẽ tạo đoạn code như sau

<div class="blockrow">

<label for="subject" class="full">Giá </label>

<input type="text" class="primary full textbox" name="txtprice" onblur="javascript: fill_tag(this.value,8);" id="subject" value="" maxlength="200" tabindex="1">

<select name="currencytype" class="full" tabindex="1">

<option value="USD" class="">USD</option>

<option value="VND" class="">VND</option>

</select>

&nbsp;<img id="display_posticon" src="clear.gif" alt="">

                                                </div>

 

Bay giờ ta tạo một template với nội dung như trên

Chú ý ta chọn MASTER STYLE (chỉ xuất hiện khi chọn mod debug ở đầu tiên)để sẽ ảnh hưởng tất cả các giao diện sau này . chọn add new template đặt tên là anpf_input_form và nhớ chọn product là mod của mình

Xong lưu lại .

Bay giờ phải cho phần giao diện này hiện lên form gửi post new thread

 

Ta vào trong plug in viết plugin đầu tiên

cách tạo plugin thì vào trong phần plugin & product chọn mục add new plugin

Product: chọn tên mod của mình là them giá vào bài viết

Hook location: đây là phần quan trọng. vì VBB quản lý can thiệp thông qua các hook (hiểu nôm na là các điểm móc vào hệ thống) Nên muốn cho plugin tác dụng vào phần nào điểm nào thì phải chọn hook đó. Ở đây tôi sẽ chọn newthread_start  (lúc tạo một thread mới) cho việc chen ngang 2 trường vào

Tiêu đề: tiêu đề của plugin

Rồi đến nội dung của việc can thiệp.

 

if ($vbulletin->options['var_anfp_onoff'] == '1'){

                $templater=vB_Template::create('anpf_input_form');

                $anpf_input_form_template.= $templater->render();

$vbulletin->templatecache['newthread'] = str_replace('\' . $messagearea . \'', $anpf_input_form_template . '\' . $messagearea . \'', $vbulletin->templatecache['newthread']);

}

Giải thích code:

if ($vbulletin->options['var_anfp_onoff'] == '1') Đây là gọi ttham so trên option của mod mục đích biến này kiểm tra xem người sử dụng có bật mod này không. Nếu bật lên thì mới thực hiện.

                $templater=vB_Template::create('anpf_input_form');

                $anpf_input_form_template.= $templater->render();

Để truy xuất template của hệ thộng đã tạo thì ta sẽ tạo một đối tượng  vB::template và render nó ở dòng 2 vào một biến $anpf_input_form_template. NHư vậy lúc này biến này đang giữ phần giao diện cần chèn vào

Dòng cuối cùng cho thấy là ta sẽ can thiệp vào template newthread và tìm nội dung cần chèn và ở đây sẽ chèn trước textarea của phần nội dung thread

Rồi lưu lại.

Bây giờ vào option bật lên mở và thử tạo  bài mới thử xem. Kết quả như thế nào nhé.

Tiếp theo chúng ta sẽ tạo một plugin để khi bấm lưu thread thì nó sẽ lưu luôn trường giá này .

Ta tạo một plugin can thiệp vào hook newpost_process can thiệp vào quá trình giữa của việc lưu. Trong plugin này mục đích sẽ kiểm tra thông tin từ form và chuyển vào phương thức lưu xuống trước khi mọi việc hoàn thành với nội dung như sau

if ($vbulletin->options['var_anfp_onoff'] == '1'){

$tigia= $vbulletin->options['var_anfp_exchangerate'];

$gia=$_POST['txtprice'];

if ($_POST['currencytype']=="USD") $gia= $gia*$tigia/1000/1000;

 

$dataman->validfields['price_field'] = array(TYPE_NUM, REQ_NO);

$dataman->set(price_field, $gia);           

}

Ở đây tôi sẽ làm động thái nếu ai mà gõ bằng tiền việt thì lưu vào còn nếu gõ bằng USD thì sẽ chuyển thành tiền việt. Chú ý là tiền việt lưu đến triệu đồng vì tôi định làm cho rao vặt xe hơi  nếu các bạn viết cho nhưng rao vặt khác thì sửa lại nếu cần.

ở đây can thiệp vào $dataman (data manager) là đối tượng dung để can thiệp vào các đối tượng của VBB. Tất cả có sẳn khi VBB chạy nên chỉ việc xài.

Thử nghiệm xem nhé… đương nhiên là chưa chặc chẽ. Tuy nhiên bước đầu là vậy đi. Kỹ càng hơn tính sau nhé

Tiếp theo bây giờ cho trường này hiện ra ở bài viết nhé…. Từ từ rồi đến forumhome….   

 

Đầu tiên tôi sẽ tạo một template để chứa giá với mục đích là sau này còn chỉnh CSS cho việc hiện giá. Tôi đặt tên là anpf_postbit_show_price (chú ý tạo trong master style nhé) với nội dung như sau

< <div style="float:right;margin-top:-10px">

Giá là : <b>$pricefield </b> triệu đồng

</div>

Ở đây biến $pricefield chúng ta sẽ truyền từ plugin vào.  Template này sẽ chèn vào sau tiêu đề của postbit

Rồi tiếp theo viết plugin

Tạo một plugin mới có tên là Anpf > display field->postbit

 

Với nội dung như sau

if ($this->registry->options['var_anfp_onoff']=='1' AND THIS_SCRIPT != 'usernote'){ 
 if (
$post[postcount] >= 1){  
        
$pricefield=$thread['price_field'];//lay thong tin tu CSDL len        
$templater 
vB_Template::create('anpf_postbit_show_price'); 
            
$templater->register('pricefield'$pricefield); 
            
$pricefield_template .= $templater->render(); 

 if(!empty($pricefield)){  
        
$this->registry->templatecache[$this->templatename] = str_replace('\' . $post[\'title\'] . \'''\' . $post[\'title\'] . \'  \' . $pricefield_template . \' '$this->registry->templatecache[$this->templatename]);  
    } 

vB_Template::preRegister($this->templatename,array('pricefield_template' =>$pricefield_template ));  
} 
 

giải thích: để lấy trường giá từ CSDL thì sẽ lấy trong mảng (hay đối tượng) $thead mặc định của VBB

Ta truyền qua template vừa mới tạo  bằng các dòng từ 4-9 . Rồi bây giờ nhiệm vụ phải truyền vào postbit là template hiện tại mình đang truy xuất. hiện tại thì đang truy xuất template này rồi ví thế nhiệm vụ là cần tìm vị trí của title  (thật ra là biến title)  chèn nội dung của template vào sau vị trí này

        $this->registry->templatecache[$this->templatename] = str_replace('\' . $post[\'title\'] . \'''\' . $post[\'title\'] . \'  \' . $pricefield_template . \' '$this->registry->templatecache[$this->templatename]);  

Rồi preregister nó lại .

 

Thôi ra thử nghiệm xem thế nào . OK. Chỉ cần chỉnh CSS của template là anpf_postbit_show_price thế là xong nhé

cơ bản tới đây là có thể thêm giá vào và hiện ra ở trang thể hiện rồi... tiếp theo sẽ là các phần khác nữa. Đây là link đến doạn này  và hướng dẫn này

http://www.mediafire.com/download/9ghxmt4vphbbdmk/product-add_new_price_...

Bạn nào muốn nhận bản hoàn chỉnh mình demo trong trang otoaz.com thì click dùm mình vào google adsense trên site hoaiphan.com của mình  rồi để lại email ở đây. Mình gửi file cho vì đang trong quá trình hoàn thiện dần dần.

Ghi rõ nguồn từ hoaiphan.com nếu muốn trích dẫn