Attachment | Size |
---|---|
96-1.png | 10.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