2012-05-07 35 views
3

我在验证Drupal 6表单时遇到了问题。Drupal表单验证:检测到一个非法选项

我有2个下拉菜单。第二个下拉列表(项目)的选项取决于第一个下拉列表(客户端)的选定选项。 更改客户端时,我从该客户端获得所有项目。

现在,当表单被验证时,将选择其他客户端作为default_value,这些项目的选项与表单构建中的选项不同。这意味着,项目的选定选项不在为表单构建的选项数组中。

是否有任何方式可以更改选项数组的表单验证? 验证中项目的选项数组取决于客户端的选择吗?

回答

2

这里要实现的主要目标是您的表单构建函数不仅在初始表单构建中被调用一次,而且还在表单提交时在之前进行验证。因此,您可以调整表单构建函数,以根据所选客户端(如果选择)为项目选择字段构建不同的$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 
} 
+0

谢谢你的回答。那么,它只有在验证函数中设置$ form_state ['rebuild'] = TRUE时才有效。它实际上从项目下拉列表中选择了正确的值。但即使它看起来工作,我仍然会得到同样的错误。我不知道为什么。 而我的另一个问题是,如果我设置$ form_state ['rebuild'] = TRUE,表单不提交。 – cyrodiil

+1

好的,我明白了。在我使用hook_form_alter之前(我使用了现有的风暴模块)。但是现在我用drupal_get_form创建了自己的表单,它可以工作。 – cyrodiil

0

你可以做到这一点无需任何编码。有一个叫做Conditional fields的模块。该模块将允许您为表单设置规则。根据某些字段的某些值隐藏某些元素。

相关问题