我在驗證Drupal 6表單時遇到了問題。Drupal表單驗證:檢測到一個非法選項
我有2個下拉菜單。第二個下拉列表(項目)的選項取決於第一個下拉列表(客戶端)的選定選項。 更改客戶端時,我從該客戶端獲得所有項目。
現在,當表單被驗證時,將選擇其他客戶端作爲default_value,這些項目的選項與表單構建中的選項不同。這意味着,項目的選定選項不在爲表單構建的選項數組中。
是否有任何方式可以更改選項數組的表單驗證? 驗證中項目的選項數組取決於客戶端的選擇嗎?
我在驗證Drupal 6表單時遇到了問題。Drupal表單驗證:檢測到一個非法選項
我有2個下拉菜單。第二個下拉列表(項目)的選項取決於第一個下拉列表(客戶端)的選定選項。 更改客戶端時,我從該客戶端獲得所有項目。
現在,當表單被驗證時,將選擇其他客戶端作爲default_value,這些項目的選項與表單構建中的選項不同。這意味着,項目的選定選項不在爲表單構建的選項數組中。
是否有任何方式可以更改選項數組的表單驗證? 驗證中項目的選項數組取決於客戶端的選擇嗎?
這裏要實現的主要目標是您的表單構建函數不僅在初始表單構建中被調用一次,而且還在表單提交時在之前進行驗證。因此,您可以調整表單構建函數,以根據所選客戶端(如果選擇)爲項目選擇字段構建不同的$options
陣列。
你會通過檢查$form_state['values']
做到這一點,有點像這樣:
function your_form(&$form_state) {
// ... other form building stuff
// Start with initial default options for project select
$project_options = array('- Please select client first -');
// Adjust, if client already selected
if (isset($form_state['values']) && $form_state['values']['your_client_select']) {
$selected_client = $form_state['values']['your_client_select'];
$project_options = your_function_to_build_project_options_by_client($selected_client);
}
// ... build project select using those options
// ... other form building stuff
}
你可以做到這一點無需任何編碼。有一個叫做Conditional fields的模塊。該模塊將允許您爲表單設置規則。根據某些字段的某些值隱藏某些元素。
謝謝你的回答。那麼,它只有在驗證函數中設置$ form_state ['rebuild'] = TRUE時纔有效。它實際上從項目下拉列表中選擇了正確的值。但即使它看起來工作,我仍然會得到同樣的錯誤。我不知道爲什麼。 而我的另一個問題是,如果我設置$ form_state ['rebuild'] = TRUE,表單不提交。 – cyrodiil
好的,我明白了。在我使用hook_form_alter之前(我使用了現有的風暴模塊)。但是現在我用drupal_get_form創建了自己的表單,它可以工作。 – cyrodiil