【问题标题】:Drupal form validation: An illegal choice has been detectedDrupal 表单验证:检测到非法选择
【发布时间】:2012-05-07 09:54:08
【问题描述】:

我在验证 Drupal 6 表单时遇到问题。

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

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

有什么方法可以更改选项数组以进行表单验证? 验证中项目的options数组是根据客户端的选择构建的吗?

【问题讨论】:

    标签: ajax forms drupal drupal-6


    【解决方案1】:

    这里要意识到的主要事情是,您的表单构建函数不仅在初始表单构建时被调用一次,而且在表单提交时再次调用,在验证发生之前。因此,您可以调整表单构建函数,为项目选择字段构建不同的$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
    }
    

    【讨论】:

    • 感谢您的回答。好吧,只有当我在验证函数中设置 $form_state['rebuild'] = TRUE 时它才有效。它实际上从项目下拉列表中选择了正确的值。但我仍然得到同样的错误,即使它似乎工作。我不知道为什么。我的另一个问题是,如果我设置 $form_state['rebuild'] = TRUE,表单不会提交。
    • 好的,我知道了。在我使用 hook_form_alter 之前(我使用了风暴模块的现有形式)。但现在我用 drupal_get_form 制作了自己的表单,它可以工作了。
    【解决方案2】:

    您无需任何编码即可完成此操作。有一个名为Conditional fields 的模块。此模块将允许您为表单设置规则。根据某些字段的某些值隐藏某些元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多