您在這裡

自訂表單Hierarchical Select的用法

hanamizuki's 的頭像
hanamizuki 在 2008-10-28 (二) 23:06 發表

hi!我遇到一個比較進階的問題,
就是在custom form的時候,
要用drupal_render($form['taxonomy']['3']);

taxonamy的vid是3,但我有裝Hierarchical Select。
在預設的表單是正常的,可以選主分類,會自動變出次分類,
像是這樣

點下去之後是這樣,會有次分類出來可以選

但是我自定Form之後,這是我的原始碼:

在template.php

<?php
/**
* 編排 CCK 表單的顯示方式
*
*
*/
function phptemplate_lifestyle_node_form($form) {
global $user;
$vars = array('user' => $user, 'form' => $form);
$vars['title'] = drupal_render($form['title']);
$vars['body'] = drupal_render($form['body_filter']);

//以下是有Hierarchical Select功能的taxonamy,vid是3
$vars['location'] = drupal_render($form['taxonomy']['3']);

return _phptemplate_callback('lifestyle_form', $vars);
}

?>

這是lifestyle_form.tpl.php

<?php
drupal_set_message('

' . print_r($form, true) . '

');
?>
<?php print $title; ?>

<?php print $location; ?>

是有出現下拉選單,可是第二層出不來,像這樣。

變這樣之後重新整理,會有這樣的錯誤訊息:

warning: Missing argument 1 for drupal_retrieve_form() in /Applications/MAMP/htdocs/projects/alpha.facepet.com.tw/includes/form.inc on line 179.

warning: call_user_func_array() [function.call-user-func-array]: First argumented is expected to be a valid callback, '' was given in /Applications/MAMP/htdocs/projects/alpha.facepet.com.tw/includes/form.inc on line 218.

warning: uasort() [function.uasort]: The argument should be an array in /Applications/MAMP/htdocs/projects/alpha.facepet.com.tw/includes/common.inc on line 2145.

真難過耶!不知道是什麼問題。

試試加上
drupal_render($form['id']);
drupal_render($form['token']);

然後 drupal_render 集中到 lifestyle_form.tpl.php 裡會比較好

hi, 感謝!
我試過了, 還是一樣耶!
drupal_render集中到lifestyle_form.tpl.php嗎?
好~

請問,
print_r($form)之後的
[#submit] => Array
(
[node_form_submit] => Array
(
)

[_hierarchical_select_submit] => Array
(
[0] =>
)

)

這邊的井號#是什麼意思呢?

目前原始碼改成

<?php
//drupal_set_message('

' . print_r($form, true) . '

');
drupal_set_title('提供資料');
?>

<?php print drupal_render($form['title']); ?>
<?php print drupal_render($form['taxonomy']['3']); //location ?>
<?php print drupal_render($form['taxonomy']['4']); //type ?>

<?php print drupal_render($form['body_filter']); ?>

<?php print drupal_render($form['id']); ?>
<?php print drupal_render($form['token']); ?>

<?php print drupal_render($form['submit']); ?>

還是會有一樣問題, 第二層下拉選單不會自己出來 >"<

可以了!!謝謝hom的提示!!(真的太感謝, 這邊真棒)

總之, 應該是有些hidden的input沒弄出來, 所以沒用, 現在可以了, 我搞成這樣:
(1)drupal_render都放在tpl.php檔
(2)把hidden的input找出(用print_r)

template.php
<?php
function phptemplate_lifestyle_node_form($form) {
global $user;
$vars = array('user' => $user, 'form' => $form);
return _phptemplate_callback('lifestyle_form', $vars);
}
?>

lifestyle_form.tpl.php
<?php
//drupal_set_message('

' . print_r($form, true) . '

');
drupal_set_title('提供資料');
?>

<?php print drupal_render($form['title']); ?>
<?php print drupal_render($form['taxonomy']['3']); //location ?>
<?php print drupal_render($form['taxonomy']['4']); //type ?>

<?php print drupal_render($form['hs_form_build_id']); ?>

<?php print drupal_render($form['form_token']); ?>
<?php print drupal_render($form['form_id']); ?>

<?php print drupal_render($form['body_filter']['body']); ?>

<?php print drupal_render($form['log']); ?>

<?php print drupal_render($form['options']['status']); ?>
<?php print drupal_render($form['options']['promote']); ?>
<?php print drupal_render($form['options']['sticky']); ?>
<?php print drupal_render($form['options']['revision']); ?>
<?php print drupal_render($form['mid']); ?>
<?php print drupal_render($form['type']); ?>

<?php print drupal_render($form['preview']); ?>
<?php print drupal_render($form['submit']); ?>

原來如此!感謝!
不過因為有些東西不想顯示,似乎可以用像這邊教的方式隱藏,可是感覺有點麻煩,而且要把function寫在tpl.php,讓我覺得好可怕!

所以我還是手動一個一個找出hidden的input了。

但我之後想更詳細調整input的項目的話,似乎就真的要在tpl.php裡面寫function,
這部分我還要再研究看看!目前真的很不熟悉。

不想顯示 的就先用 drupal_render 跑過
但不要 print 出來

<?php drupal_render($form['xxx']); //不輸出到畫面 ?>
<?php print drupal_render($form); //不包含 $form['xxx'] ?>

或是

<?php $hide = drupal_render($form['xxx']); //不輸出到畫面 隨便丟入一個代表不需要的變數 之後需要修改的時候找起來比較方便 ?>
<?php print drupal_render($form); //不包含 $form['xxx'] ?>

要採用哪一種作法
就要看需要 顯示/隱藏 的表單元素的比例

又上了一課

<?php //把種類拉到最上面 ?>
<?php print drupal_render($form['taxonomy']['4']); //type ?>
<?php print drupal_render($form['taxonomy']['3']); //location ?>

<?php //不要這些 ?>
<?php drupal_render($form['taxonomy']); //分類的外框,很醜 ?>
<?php drupal_render($form['body_filter']['format']); //內文說明,不要 ?>

<?php //剩下的表單依照權重排列 ?>
<?php print drupal_render($form); ?>