Theme engine 模版引擎

AttachmentSize
Image icon template engine.png117.44 KB

如果你有改template 經驗的話
你通常都會有一個疑問
為什麼有些變數template 沒有, 但卻存在於源碼裏?
為什麼$primary-links 變數在theme 裏 不會expand, 但在block 裏卻會?
$primary-links 這個變數在那裡跑出來?

以上的答案都在template engine 之內

more..

template 這個字經常出現, 模版(template) 其實是一個例子(sample)
指示網頁的內容應該怎展示, 排版
/drupal/themes/garland/ 內, 副檔名為 .tpl.php 的都是template
而將template 和源碼部分連接的, 就是template engine 了

/drupal/themes/engines 內, 有一個內建的engine, phptemplate
你還可以選用smarty, XTemplate 之類的其他引擎, 但這超出了本篇的範圍
你可以參考:
XTemaple: http://drupal.org/node/6493
smarty: http://drupal.org/node/27536

使用phptemplate 的好處是, 你不用再學一種新的語言來使用template
再加上drupal 內建,
drupal 也傾向將很大部分的顯示控制權交給源碼, 而非模版引擎
所以, 使用phptemplate 是剛剛好足夠

phptemplate 和源碼, templates 的關係:

/drupal/themes/engines/phptemplate/ 內,
最重要是phptemplate.engine 檔
它是一個php 檔, 但使用.engine 命名以表示為引擎
用文字編輯器打開,
會看到很多似曾相識的function calls
phptemplate_node()
phptemplate_comment()
這些就是處理node template, comment template 有什麼可用的變數的 functions 了

你可以將源碼用associaive array 的形式傳到template
也可以新增一些template 專用的變數

例如在phptemplate_page() 內, line 213:

<?php
'primary_links'       => menu_primary_links(),
?>

就是這一句定義template 內的$primary-links 了

翻查menu_primary_links() (在include/menu.inc line 833)
可以看見一個沒有recursive 的call
至於block 內的recursive call, 出自menu.module, line 131
<?php theme('menu_tree', $delta); ?>

改phptemplate.engine (primary-links 的delta=2):

<?php
'primary_links'       => theme('menu_tree',2),
?>

再改相應的page.tpl.php

<?php
 
print $primary-links;
?>

就可以了
當然, css 要相應改變, 因為primary-links 這個class 沒有了

明白了以後, 改其他的template 變數都會簡單得多
對全局的template 也加深一步認識了

Google