合併多個block顯示

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 .= "<div id=\"blocks-$module-$delta\">".$block['content].'</div>';
}
// print output
print $output;
?>

yelban 的照片

Re:

又出現一個很好用密技, 趕緊收下~~^^
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);
  }
}

DrakeGuan 的照片

Re:

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

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

jimmy 的照片

Re:

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

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

--
from open mind to open source~

DrakeGuan 的照片

Re: 合併多個block顯示

cool!!!
感謝分享 :)

tky 的照片

Re: 合併多個block顯示

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

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

tky

jimmy 的照片

Re: 合併多個block顯示

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

--
from open mind to open source~