您在這裡

一個開發模組的個人經過

joetsuihk's 的頭像
joetsuihk 在 2007-04-09 (週一) 01:59 發表

這原本是寫到我自己的blog 中
但想大家給些意見
故轉到這

這一次的模?是一個recent comment 和 recent blog post 的二合一模?
用了jquery library 和 tabs plugin
成就一個tab 和ajax 模?
當然沿用drupal 內建使用ajax 的方式
但講起來容易
官網都不多這類的drupal 5.1+ ajax 的描述
唯有向已經內建ajax 的現有module 偷師
open source 吧...
明白了當中的機制之後
有寫過ajax 的朋友應該會立即上手
如果還沒有寫過, 到jquery 的官網先參考一下ajax 的用法會容易點
反正都有中文說明

以下假設你已經會做一個模?
所以只提重點部份

先講tabs 的組成
tabs 有一個指定的格式

  • tab title1
  • tab title2
tab content1
tab content2


換成recent comment, recent blog post:(非php code, 只為一個算法結構)
hook_block()內:

  • t('Recent comments')
  • t('Recent blog posts')
theme('comment_block')
joe_recent_blog()

//self defined function


其中, theme('comment block')為comment module 內建的function 輸出recent comment
joe_recent_blog() 為一個模?內定義的function, prototype類似:

<?php
if (user_access('access content')) {
$result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title, n.created FROM {node} n WHERE n.type = 'blog' AND n.status = 1 ORDER BY n.created DESC"), 0, 10);
if (db_num_rows($result)) {
$block['content'] .= "

".node_title_list($result);
$block['content'] .= '

';
}
}
?>

先完成非ajax block 的部份, 可降解ajax, 可降解block

此時已經可以在drupal 內enable block, 測試一下
為插入ajax 做準備

因為ajax 的javascript code 為數十多二十行,
分開一個.js file 處理
joe.js:

$(document).ready( function(){dojo_ajax_auto_attach();} )

function dojo_ajax_auto_attach(){
//init tabs
$("#joe_container").tabs();

///////////////////////////////略

留意, drupal 5.1 內建的drupal/misc/jquery.js
並不可以使用tabs plugin...(應該為版本問題)
故要使用tabs plugin 包內的jquery.js 或官網的jquery.js, 覆蓋
接著又可以試一下tabs 的效果

戲玉...終於到了...ajax 的部分
ajax request 有一個url 的para 注(i)
用作找出php handler 的php file
但drupal 內卻用一個module file作handler
故要告訴(register) 到drupal core, 某一path 會用作handler
傳相關parameter 到module file
要在hook_menu() 內:

<?php
$items = array();
$items[] = array(
'path' => 'dojo/menu', //注(i)
'title' => t('dojo'),
'access' => user_access('access content'),
'type' => MENU_CALLBACK,
'callback' => 'dojo_js' //真正的php handler function
);

$items = array_merge($items, module_invoke_all('dojo_menu', $may_cache));
return $items;
?>

到此, ajax 的php 部份其實只有一個register function hook_menu()
和dojo_js(), 一個真正的handler

javascript 卻反而可以細分為兩個部份
caller 和handler
caller 為一個buttom, 按了就發出一個要求到注(i) 的path

$(".dojo-ajax").click(function(){
$.ajax({
type: "POST",
url: "/drupal/dojo/menu",
data: "path=" + "dojo/menu",

/////////////////////略, 待續
handler 為php 返回的json object parser
通常為插入返回的json object 的javascript code
////續

success: function (data) {
data = Drupal.parseJson(data);
$("#block-dojo-0 .content").html( data.content );

細心看source code 就可以了

歡迎回應~

附加檔案大小
Package icon dojo.zip16.46 KB

真好的一個應用,還有紀錄!
剛好最近也寫了個AJAX,不過還不知道drupal_to_js()的用法
繞了好一大圈,看了你的code才知道drupal_to_js的用法啊 :P

另外
// Need to load includes here because we need access to menu item definitions.
// The call below (after the else) is too late.
// jstools_modules_includes('activemenu');
這段註解的意思是?
我猜是要在activemenu之前,讓這個menu的item被dojo_menu建立?
如果是這樣的話,可以加一個dojo.install
在裡頭update system這個table,在安裝時就將dojo module的優先順序調到前面或後面

順帶一提,你的網站為什麼老是上不去?太熱門了嗎?

--
from open mind to open source~

絕對不是太熱門.......
服務器問題.....煩惱中......

關於那段注解,
因為這code 是改自jstools 的 activemenu 的
故有那些code
而只有activemenu , 因為需要menu 有這module pre-load
所以要include 自己(activemenu module)
而我這個例子的ajax 應用不用pre-load
所以注解掉了

Joetsui's blog

一個feature request
有沒有興趣把這個改成可以合併多個block進來的block?
也就是說,一個dojo block,可以是block1分頁+block2分頁
這樣就可以自由從views產生block
然後若有介面可以選擇,這個dojo block要顯現哪些block的合併
就更好了 :P

這是從panels得到的想法
有關load block可以參考panels裡頭的方式
有關介面,也可以參考panels裡頭
現有你的基礎的code應該很不錯用了 :P

若完成的話,到drupal應該會是個熱門的module :D

--
from open mind to open source~