
今天要講的,就是如何來編排 CCK 表單的顯示方式,這個的做法可是衆說紛紜,阿舍也是研究了幾篇之後才有心得的,本來,阿舍是想說,反正,每一個 CCK 欄位都會有一個唯一個 ID 可以用,只要配合 CSS 的運用,應該就可以排出不錯的效果,但是,實際一試才知,單靠操作 CSS 是不夠的......=___=!!。
如果想要把自定的 CCK 欄位整個翻過來排,單靠 CSS 真的是不行,尤其是想要來玩個大風吹時,那就更是可以感覺到什麼叫做捉襟見肘哩 !! 所以,想要讓這些 CCK 欄位可以弄到任君排佈的地步,那可就得想辦法讓這些自定的 CCK 欄位可以被放到 tpl.php 檔裡才行。
所以,第一件事就是要讓 Drupal 知道,當要開啟各位大德自定的 CCK 表單時,要去參考指定的 tpl.php 檔來產生網頁,要達到這個目的,就要再來改各位大德使用的版型裡的 template.php 檔,在這裡要加入一個新的函數,用來跟 Drupal 說要去使用那一個 tpl.php 檔,程式碼如下:
function phptemplate_xxxxx_node_form($form) {
global $user;
$vars = array('user' => $user, 'form' => $form);
$vars['title'] = drupal_render($form['title']);
$vars['body'] = drupal_render($form['body_filter']);
return _phptemplate_callback('xxxxx_form', $vars);
}
這個時候,又要拿出那個阿舍的第一百零二個 CCK 表單,叫做 "bookreview" 的自定內容類型,它只有自定二個欄位,分別是「isbn」及「published_date」,CCK 的欄位命名是 「field_isbn」及「field_published_date」,後面的這個 「field_published_date」 欄位放在一個叫「group_try_field_group」的欄位群組 (Field Group) 裡。
以阿舍的 bookreview 內容類型為例,上面的程式碼就會變成下面這個樣子。
function phptemplate_bookreview_node_form($form) { // << 把 xxxxx 換成內容類型的名稱
global $user;
$vars = array('user' => $user, 'form' => $form);
$vars['title'] = drupal_render($form['title']);
$vars['body'] = drupal_render($form['body_filter']);
return _phptemplate_callback('bookreview_form', $vars); //<< 把 xxxxx 換成對應的 tpl.php 名稱
}
關於 tpl.php 檔的命名,沒有一定的規則,有些大德喜歡用 "內容名稱_edit.tpl.php",有些則是喜歡用 "內容名稱_form.tpl.php",隨各位大德喜歡就好,但是最好是要能有識別功能的,看檔名就可以瞭這個檔的用途,還有,直接叫 "內容名稱.tpl.php" 就不好了,因為配合 contemplate 模組的使用,就會用 "內容名稱.tpl.php" 的檔案來編排內容類型的顯示方式 ( 不是編輯時 )。
阿舍的 tpl.php 叫做 "bookreview_form.tpl.php",要讓 Drupal 知道要用那一個 tpl.php 檔, 就要在第二個 xxxxx 的地方,把 tpl.php 檔案名稱,除了 .tpl.php 以外的部分放到這裡來,阿舍的就會是 "bookreview_form"。
上面的這個 Function 可以放在 template 檔裡的任何地方,只要注意 Function 的名稱裡,是不是和要設定的內容類型名稱相同,否則, Druapal 就會對不到的。
再來就是開始編輯這個 bookreview_form.tpl.php 檔,用文字編輯器打開這個檔,裡面當然是一片空白,各位大德可以試著放入下列字串到 bookreview_form.tpl.php,存檔後,再來新增這個內容類型看看。
<?php
print ("Hello ! World.");
print $title;
?>
以阿舍的 bookreview 為例,用 /node/add/bookreview 來新增這個內容類型時,網頁的所有欄位會都不見了,只剩下「Hello ! World.」 和一個正常的「標題」 欄位可以打資料,是啊 ! 現在這個內容類型的內容就靠 bookreview.tpl.php 來安排了,剛剛只放了 $title 這個變數,所以就只會有「標題」這個欄位會出現,但是,這個 $title 的變數是那裡定裡的呢 ?
來 ! 讓我們一起回到那個 template.php 檔裡的 phptemplate_bookreview_node_form($form) 函數,來看看第 4 行的這個 $vars['title'] = drupal_render($form['title']); 程式碼,這個就是用來將表單裡的欄位對應到變數的定義,等號右邊的 $vars[] 裡放的是可以被用在 bookreview_form.tpl.php 的變數名稱 ( 這裡不用加 $ 符號),右邊則是在取出由 Drupal 產生的 title 欄位 HTML 碼。
接著看下面的第 5 行,就是用來定「內容」這個欄位的變數,所以,阿舍只要在 bookreview_form.tpl.php 這個檔裡再加上 print $body,那麼就在新增或編輯 bookreviwe 的節點時,除了「標題」欄位以外,還會多出現「內容」這個欄位。
所以,所有阿舍要用在 bookreview_form.tpl.php 的欄位變數,都要在 template.php 檔的這個函數裡給它先定義好才行,以阿舍的 bookreview 的那二個欄位來說,就要在第 5 行下面加入這二行程式碼:
$vars['isbn'] = drupal_render($form['field_isbn']); $vars['published_date'] = drupal_render($form['group_try_field_group']['field_published_date']);
在上面的第二行中,各位大德有沒有發現,$from 的後面多了一個 ['group_try_field_group'],這個是因為阿舍把 「field_published_date」 這欄位放在 「group_try_field_group」欄位群組裡,所以要多加一層在前面,否則只要用 $form['欄位名稱'] 就可以了,加完之後的程式碼如下。
function phptemplate_bookreview_node_form($form) {
global $user;
$vars = array('user' => $user, 'form' => $form);
$vars['title'] = drupal_render($form['title']);
$vars['body'] = drupal_render($form['body_filter']);
$vars['isbn'] = drupal_render($form['field_isbn']);
$vars['published_date'] = drupal_render($form['field_published_date']);
return _phptemplate_callback('bookreview_form', $vars);
}
等阿舍完成上面的程式碼之後,就可以在 bookreview_form.php 裡,用 $isbn 及 $published_date 來編排這個 bookreview 的新增和編輯畫面了...呵呵。
接下來,就是編排 bookreview_form.php 檔了,不過,要待續了.......
HowTo: Theme a CCK input form
http://drupal.org/node/101092
Theming CCK Input Form
http://drupal.org/node/187239
- 增加新的回應
- 瀏覽次數: 6386
請問版主,drupal 6 無法用您這個方法修改,
可有解決之道?
Hello,
國外有個教學影片好像有談到,阿舍現在的頻寛不夠,還沒能看,就先提供參考囉 !! ^^=。
Lesson 42: Fine-tuning the UI by Theming Forms In Drupal 6.0
http://blip.tv/file/1139210
阿舍...
阿舍的 Drupal 架站經驗談
http://drupal.soa.tw
請問大大有幾個問題想請教你
1.關於Hierarchical Select模組的欄位在cck input form裡面我該怎麼去找他的css id呢??
程式碼片段:
管轄單位:
.....
其中我原本以為id後面那個就是id="hierarchical-select-48-wrapper-wrapper"但沒想到在select後面那個數字是動態的,也就是說如果我在增設一個欄位叫縣市,它會變成id="hierarchical-select-49-wrapper-wrapper",而且每次開新的表單後面的數字就會不斷的新增下去,這樣它的css id根本就是無法讓我去選擇來控制,請問該如何是好?
2.gmap模組安裝後我該如何去找對應的欄位?
按照網頁呈現的id=gmap-auto1map-gmap0,id=gmap-auto1map-locpick_latitude0-wrapper(緯度),id=gmap-auto1map-locpick_longitude0-wrapper(經度),輸入後在node-xxx-edit.tpl.php理根本讀不到?
3.在每個欄位設定裡面如果我將整體設定裡的Number of values:改成無限制好像也無法在node-xxx-edit.tpl.php理讀到...有什麼方法可以設定呢?

不好意思阿舍大大
我照大大的方式做
但是在自己 內容型態_form.tpl.php
裡面只print的出像是("Hello ! World.")
或是$title、$body等而已ㄝ
可是我的表單很大
我的表單欄位型態有
Check boxes
Text Field
Autocomplete Text Field
Select list
Single on/off checkbox:
也有群組
是不是欄位型態不一樣就不能用print??
請大大幫幫忙嚕
快爆炸的新手