您在這裡

form_set_value 的正確用法

hom's 的頭像
hom 在 2008-08-08 (週五) 12:00 發表

這幾天在 form_set_value 函式的使用上遇到一些問題
pro drupal development 書內的範例 會出現無法運作的狀況

原本 pro drupal development 書內的範例是類似下面這樣:

<?php
function example_form(){
$form['wibble'] = array(
'#type' => 'value',
'#value' => array()
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'submit'
);
return $form;
}

function example_form_validte($form_id, $form_values){
form_set_value($form['wibble'], 'my value') ;
}

function example_form_submit($form_id, $form_values){
drupal_set_message($form_values['wibble']);
}
?>

不過執行的時候會出現 array_shift 的錯誤
後來在 http://drupal.org/node/160160#comment-820709 發現相關的說明

主要的錯誤在於
1. hook_validate 內沒有 $form 可以使用
2. $form['wibble'] 是錯誤的用法 所以 form_set_value 無法運作

正確的用法是使用 #parents 屬性來描述要加入的資料 是放在 $form_values 結構中的哪個地方
上面的例子應該改為


<?php
function example_form_validte($form_id, $form_values){
$structure['#parents'] = array('wibble') ;
form_set_value($structure, 'my value') ;
}
?>

如果表單具有巢狀結構 則應該如下描述階層

<?php
function example_form_validte($form_id, $form_values){
$structure['#parents']['level0']['level1']['level2'] = array('wibble') ;
form_set_value($structure, 'my value') ;
}
?>

(level0 ~ 2 應該使用實際表單的元素名稱來替代)
(設定 #parents 屬性的陣列名稱是完全無關的 可以隨意取名)

修改過後 form_set_value 就可以正常運作了

回應最後還有提到
As a final note, you don't need to have created the field in '$form' at the top at all if you didn't want to -- the form_set_value() still works, but it's good practice to do it.
看起來是說不需要在建立表單時 設定儲存變數的預留欄位 也可以正常運作
這部分我還沒有測試
所以還無法確定是否真的可行