您在這裡

合併多個block顯示

jimmy's 的頭像
jimmy 在 2007-10-09 (二) 10:17 發表

jimmy最近用到了一段程式碼,可以插入在任何地方,將block合併顯示,分享給大家試看看。 :)

<?php
// config
$blocks = array( // module => delta
'views' => 'news_block',
'menu', => '50',
);
// collect block objects
foreach($blocks as $module => $delta){
$block = module_invoke($module, 'block', 'view', $delta);
$output .= "

".$block['content].'

';
}
// print output
print $output;
?>

又出現一個很好用密技, 趕緊收下~~^^
Yelban 對 module_invoke 不是很了 所以google 了something about module_invoke,
順手也 memo一下 module_invoke 的用法

module_invoke 用來運叫其他 modules 的 hook fouction
module_invoke($module, $hook, $arg1, $arg2, ...);
$module: 外叫的模組名稱
$hook: 指定使用模組的 hook
後面( $arg1, $arg2, ... )都是餵給 hook 吃的參數
因為各個 hook 吃的參數不同所以沒有固定的項目

以這裡為例, module_invoke($module, 'block', 'view', $delta);
傳入 'views' => 'news_block',
就變成 module_invoke('views', 'block', 'view', 'news_block');

結果就是外叫了 function views_block() 並且傳入參數 'view', 'news_block'
等於 views_block('view', 'news_block');
(function views_block($op = 'list', $delta = 0))
(function module_invoke() )

有趣的是 function module_invoke() 並沒有指定要用到幾個參數
所以可以吃不固定數目的參數
這是一種很有彈性的函數寫法
在函數裡處理所有實際上傳入的參數 ( func_get_args() )
然後用 array_shift() 一個接著一個把參數取出來
煎煮吵雜一番然後把剩下還沒用掉的參數傳給下一個函數 ( call_user_func_array($function, $args) )
真素有夠彈性的, 酷!

module_invoke API source code

function module_invoke() {
$args = func_get_args();
$module = array_shift($args);
$hook = array_shift($args);
$function = $module .'_'. $hook;
if (module_hook($module, $hook)) {
return call_user_func_array($function, $args);
}
}

我剛剛在想
也許 drupal 就只需要 nodes + taxonomy + comments + blocks + pages 就好了?
然後 cck 是給 node 加分用的
views, panels, ... 是 block 或 page 的產生器
似乎就能完全絕大部分的網站要求了?

然後…Menu 的部分,我們也許只需要 Navigation (導覽)這一個就夠了(或是再加個 Primary 與 Secondary) :o

這是為什麼Drupal有時候可以被視為一個framework的原因
而不是廣義的CMS

另外,menu的用途很多,one db-> multi sites時就很需要了
而menu也是Drupal和眾多CMS的核心(從index.php開始做任何事情)

--
from open mind to open source~

--
from open mind to open source~

哇唔,好.....好深入的樣子ㄟ。
有沒有什麼範例可以看一下呢?顯示出來的效果會怎麼樣?兩個block的內容依序出現這樣嗎?

對了,這些程式碼應該是要插在block的php code裡頭,對吧?

tky

tky

1. block會依序排出來
2. 程式碼可以插在node或block,或任何接受php輸入的地方(views的欄位也可喔!)
3. 範例,試著找一下delta(其實去看看資料庫的block table就可以一目了然),然後把module和delta依序填入,建議可以用用navigation和user login這兩個必出現的block來試試看囉~

--
from open mind to open source~

--
from open mind to open source~

$block = module_invoke($module, 'block', 'view', $delta);
$module --> 呼叫這個 block的module,可能是 user,可能是views.. 若是用views建立的block,就用views
$delta --> 在module裡頭,可能有很多block,每個block都有代號,這裡就填入block的代號: views就填入view_name,而其他的可能是 0, 1, 2.. .等

一般的模組可以從blocks這個table裡找到需要的資訊

--
from open mind to open source~

--
from open mind to open source~

其實在 網站建置 -> 區塊 裡面
每個區塊的設定的連結
就是 admin/build/block/configure/[module]/[delta] 這種格式
像使用者登入的區塊就是 admin/build/block/configure/user/0

另外 預設的版型在輸出區塊的 id 的時候
是用 block-[module]-[delta] 的格式

這是兩個不需要查資料庫或模組的原始碼 就可以知道區塊的 module 和 delta 的方式

如果是用增加區塊產生的區塊
module 是屬於 block
所以會長的像 admin/build/block/configure/block/0
id 會是 block-block-0

想詢問是不是能將php代碼直接貼入區塊之中呢?
因為貼進去後…秀出來的畫面沒反應…
還是說要怎運用jimmy所提供的(一段程式碼,可以插入在任何地方,將block合併顯示)
是指再新增一個block.tpl中貼入代碼就能使用呢?一直很不理解怎使用~~ >w<
謝謝

人人把心中的愛發揮出來,就能凝聚善的福業,形成善的循環。 (靜思語錄)

可以在自己新增的區塊中貼入PHP語法,我剛好也有用到這功能且也成功了,在DRUPAL6
可以簡化成如下,EX:
$block = module_invoke('term_queue', 'block', 'view', 0);
print $block['content'];

term_queue是我的一個MOUDLE,請自行改成自己的MOUDLE名稱,若是自己新增的BLOCK,這裡輸入'block'
而這個MOUDLE的區塊DELTA剛好是0