Drupal6.x 自定form template

AttachmentSize
Image icon 96-1.png10.04 KB

重寫版: http://www.joetsuihk.com/node/119

這一篇可真是費盡了心神, 開發時間估計有十小時以上...
請多多支持.....

一切事, 源於要修改 node/add 的form
因為太多摺了的選項, 想摺成一個"advanced options" 之內
(圖為最後成果)

這個Drupal5.x 之中已經可以實現的一個中等難度的修改
萬估不到需要這麼多的時間, 究其原因,
主要是Drupal6.x 的手冊, 工具(devel)等等都不是很成熟
太過倚賴的話反而可能會招致反效果
但隨著時間的推進, 情況應該會慢慢的改善

註: 以下內容假設你已經可以熟練地使用 *.tpl.php

好, 一堆廢話後正式開始,
第一個挫折出現在story-node-form.tpl.php
devel 說 node/add/story 可以使用 story-node-form.tpl.php
但我一直都不可以順利地使用, 找狂了一陣子,
追到node.module, node.pages.inc, theme.inc......等等
都發現不到問題.....
但node-form.tpl.php 可以正常使用....
但 [node-type]-node-form.tpl.php 一直使用不能
最後一怒之下試試自己提供template 檔名,
根據http://drupal.org/node/223440 (Working with template suggestions)的代碼
在template.php 中: phptemplate_preprocess_node_form()
使用 $vars['template_suggestions'][] = arg(2)."-node-form";
但都沒有反應, 使用回node-form.tpl.php.....
可真是火大了......node-form.tpl.php 的使用次序要比自定義的template 檔高.....
.....
....
...
..
.

還好, 後來幾乎反轉全個 Drupal6.x 的 theming guide 之後,
又回到http://drupal.org/node/223440 (Working with template suggestions)
看到使用 $vars['template_files'][] = arg(2)."-node-form";
一試之下.....成功了....

所以我懷疑template_suggestions 是錯的, 也留了言, 也很快地,
handbook 團隊己經修改了錯誤,留言都刪了... (可以在revision 中看到罪證!!)
但devel 中提示不需要修改, 新增代碼就可以使用story-node-form.tpl.php 的問題還沒有解決..
結論就是.....要當第一便要比別人多花很多苦工.......><

正當以為工作己經完成, 又發覺 node/1/edit 的form 竟然沒有使用[node-type]-node-form.tpl.php
又用回node-form.tpl.php.......
又要改template.php,: phptemplate_preprocess_edit_node_form()
但這個hook 一樣是被遺棄(不明原因)
完全是萬念俱灰.....
最後,修改phptemplate_preprocess_node_form():

<?php
//template.php
function phptemplate_preprocess_node_form(&$vars) {
 
//處理 node/add/[node-type]
 
if( arg(1)== "add"){
   
$vars['template_files'][] = arg(2)."-node-form";
  }elseif(
arg(2) == "edit" ){
   
//處理 node/[nid]/edit
   
$vars['template_files'][] = $vars['form']['#node']->type . "-node-form";
  }

 
$vars['form']['advanced']['revision_information'] = $vars['form']['revision_information'];
  unset(
$vars['form']['revision_information']);
 
$vars['form']['advanced']['comment_settings'] = $vars['form']['comment_settings'];
  unset(
$vars['form']['comment_settings']);
}
?>

//[node-type]-node-form.tpl.php

<?php

  $output
= "\n<div class="node-form">\n";

 
// Admin form fields and submit buttons must be rendered first, because
  // they need to go to the bottom of the form, and so should not be part of
  // the catch-all call to drupal_render().
 
$admin = '';
  if (isset(
$form['author'])) {
   
$admin .= "    <div class="authored">\n";
   
$admin .= drupal_render($form['author']);
   
$admin .= "    </div>\n";
  }
  if (isset(
$form['options'])) {
   
$admin .= "    <div class="options">\n";
   
$admin .= drupal_render($form['options']);
   
$admin .= "    </div>\n";
  }
 
$buttons = drupal_render($form['buttons']);

  if (isset(
$form['advanced'])) {
   
$advanced .= "    <div class="advanced">\n";
   
$advanced .= drupal_render($form['advanced']);
   
$advanced .= "    </div>\n";
  }

 
// Everything else gets rendered here, and is displayed before the admin form
  // field and the submit buttons.
 
$output .= "  <div class="standard">\n";
 
$output .= drupal_render($form);
 
$output .= "  </div>\n";

  if (!empty(
$advanced)) {
   
$output .= advanced;
  }

  if (!empty(
$admin)) {
   
$output .= "  <div class="admin">\n";
   
$output .= $admin;
   
$output .= "  </div>\n";
  }
 
$output .= $buttons;
 
$output .= "</div>\n";

  print
$output;

?>

終於完成了......

當然, 除了comment settings 和 revision information,
其他的都可以放到自定的advanced options 之內.

最後最後,
還有一個奇怪的地方,
就是, _preprocess_[hook] 的變數只可以在 *.tpl.php 中使用
template.php 內的函數就不可以.......

註: Drupal5.x 的版本: http://www.joetsuihk.com/form_templates

Google