這原本是寫到我自己的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
換成recent comment, recent blog post:(非php code, 只為一個算法結構)
hook_block()內:
- t('Recent comments')
- t('Recent blog posts')
//self defined function
'; 先完成非ajax block 的部份, 可降解ajax, 可降解block 此時已經可以在drupal 內enable block, 測試一下 因為ajax 的javascript code 為數十多二十行, function dojo_ajax_auto_attach(){ 留意, drupal 5.1 內建的drupal/misc/jquery.js 戲玉...終於到了...ajax 的部分 $items = array_merge($items, module_invoke_all('dojo_menu', $may_cache)); javascript 卻反而可以細分為兩個部份 歡迎回應~
其中, 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'] .= "
$block['content'] .= '
}
}
?>
為插入ajax 做準備
分開一個.js file 處理
joe.js:
$(document).ready( function(){dojo_ajax_auto_attach();} )
//init tabs
$("#joe_container").tabs();
///////////////////////////////略
並不可以使用tabs plugin...(應該為版本問題)
故要使用tabs plugin 包內的jquery.js 或官網的jquery.js, 覆蓋
接著又可以試一下tabs 的效果
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
);
return $items;
?>
到此, ajax 的php 部份其實只有一個register function hook_menu()
和dojo_js(), 一個真正的handler
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 就可以了
附加檔案 | 大小 |
---|---|
dojo.zip | 16.46 KB |
Re: 一個開發模組的個人經過
真好的一個應用,還有紀錄!
剛好最近也寫了個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的優先順序調到前面或後面
順帶一提,你的網站為什麼老是上不去?太熱門了嗎?
Re:
絕對不是太熱門.......
服務器問題.....煩惱中......
關於那段注解,
因為這code 是改自jstools 的 activemenu 的
故有那些code
而只有activemenu , 因為需要menu 有這module pre-load
所以要include 自己(activemenu module)
而我這個例子的ajax 應用不用pre-load
所以注解掉了
Joetsui's blog
Re: 一個開發模組的個人經過
一個feature request
有沒有興趣把這個改成可以合併多個block進來的block?
也就是說,一個dojo block,可以是block1分頁+block2分頁
這樣就可以自由從views產生block
然後若有介面可以選擇,這個dojo block要顯現哪些block的合併
就更好了 :P
這是從panels得到的想法
有關load block可以參考panels裡頭的方式
有關介面,也可以參考panels裡頭
現有你的基礎的code應該很不錯用了 :P
若完成的話,到drupal應該會是個熱門的module :D
Re: 一個開發模組的個人經過
原本想做
但一直沒想到要如何得知block 的list 要如何跑出來
jimmy 說到panels....的確可以參考一下
謝
Joetsui's blog