【问题标题】:Drupal 7 Forms API - AJAX Forms error: An illegal choice has been detected. Please contact the site administratorDrupal 7 Forms API - AJAX 表单错误:检测到非法选择。请联系网站管理员
【发布时间】:2012-10-01 15:12:39
【问题描述】:

我设置了一个表单,用户可以在其中从下拉列表中选择一个项目。选择该项目后,将填充另一个下拉列表。然后根据从第二个下拉列表中选择的值,可能会或可能不会显示字段集。如果显示了字段集,则有一个字段和一个按钮。通过单击按钮,您可以添加同一字段的另一个副本。一旦有一个以上的删除一个按钮也会出现。我从这里得到了代码的基础: http://api.drupal.org/api/examples/ajax_example%21ajax_example_graceful_degradation.inc/function/ajax_example_add_more/7

问题是当我第一次点击“添加另一个调查问题”时它可以正常工作并添加一个字段。当我第二次单击它或现在有两个单击删除时,我收到此错误:'已检测到非法选择。请联系网站管理员。'

我做错了什么?

这是我的代码:

function touchpoints_addmetric_form($form, &$form_state, $tp_id) {
    $selectedType = isset($form_state['values']['type']) ? $form_state['values']['type'] : FALSE;
    $types = db_query('SELECT * FROM {touchpoints_metric_types}') -> fetchAllKeyed(0, 1);
    $form['#tree'] = TRUE;
    $form['type'] = array(
        '#type' => 'select',
        '#title' => t('Metric Type'),
        '#options' => $types,
        '#required'=>TRUE,
        '#ajax' => array(
            'event' => 'change',
            'wrapper' => 'method-wrapper',
            'callback' => 'touchpoints_method_callback'
        )
    );
    $form['measurementmethod'] = array(
        '#type' => 'select',
        '#title' => t('Measurement Method'),
        '#required'=>TRUE,
        '#prefix' => '<div id="method-wrapper">',
        '#suffix' => '</div>',
        '#options' => _get_methods($selectedType)
    );
    $form['survey'] = array('
        #type' => 'fieldset',
        '#collapsible' => FALSE,
        '#states' => array(
            'visible' => array(
                array(
                    array(':input[name="measurementmethod"]' => array('value' => '5')), 
                    'xor', 
                    array(':input[name="measurementmethod"]' => array('value' => '6')),
                    'xor', 
                    array(':input[name="measurementmethod"]' => array('value' => '7'))
                )
            )
        )
    );
    $form['survey']['contents'] = array(
        '#type' => 'fieldset',
        '#collapsible' => FALSE,
        '#prefix' => '<div id="survey-div">', 
        '#suffix' => '</div>', 
    );
    if (empty($form_state['num_surveys'])) {
        $form_state['num_surveys'] = 1;
    }
    for ($i = 1; $i <= $form_state['num_surveys']; $i++) {
        $form['survey']['contents']['survey_question'][$i] = array(
            '#type' => 'textfield',
            '#title' => t('Survey Question ' . $i),
            '#size' => 70, '#maxlength' => 100, 
        );
    }
    $form['survey']['contents']['addsurvey'] = array(
        '#type' => 'submit',
        '#value' => t('Add Another Survey Question'),
        '#submit' => array('touchpoints_metrics_survey_add_one'),
        '#limit_validation_errors' => array(),
        '#ajax' => array(
            'callback' => 'touchpoints_metrics_survey_callback', 
            'wrapper' => 'survey-div', 
        ), 
    );
    if ($form_state['num_surveys'] > 1) {
        $form['survey']['contents']['removesurvey'] = array(
            '#type' => 'submit',
            '#value' => t('Remove A Survey Question'),
            '#submit' => array('touchpoints_metrics_survey_remove_one'), 
            '#limit_validation_errors' => array(), 
            '#ajax' => array(
                'callback' => 'touchpoints_metrics_survey_callback', 
                'wrapper' => 'survey-div', 
            ), 
        );
    }
    return $form;
}

function _get_methods($selected) {
    if ($selected) {
        $methods = db_query("SELECT * FROM {touchpoints_m_methods} WHERE mt_id=$selected") -> fetchAllKeyed(0, 2);
    } else {
        $methods = array();
    }
    return $methods;
}

function touchpoints_method_callback($form, &$form_state) {
    return $form['measurementmethod'];
}

function touchpoints_metrics_survey_add_one($form, &$form_state) {
    $form_state['num_surveys']++;
    $form_state['rebuild'] = TRUE;
}

function touchpoints_metrics_survey_remove_one($form, &$form_state) {
    if ($form_state['num_surveys'] > 1) {
        $form_state['num_surveys']--;
    }
    $form_state['rebuild'] = TRUE;
}

function touchpoints_metrics_survey_callback($form, &$form_state) {
    return $form['survey']['contents'];
}

【问题讨论】:

  • 当您收到非法选择消息时,您可以转到管理 -> 报告 -> 最近的日志条目并报告那里显示的错误吗?
  • 消息显示“测量方法元素中的非法选择 5”。 5 是我在测试时从该字段中选择的值。
  • 我已经在这里回答了你的问题,因为这是一个重复的问题drupal.stackexchange.com/questions/15989/…

标签: drupal-7 drupal-modules drupal-forms drupal-ajax


【解决方案1】:

我遇到过几次这个错误,这是我发现的:

这是 Drupal 的说法“嘿,您尝试使用原始表单定义中未包含的复选框或单选按钮选项提交此表单!这是不允许的。” - 查看更多信息:http://proofgroup.com/blog/2008/jul/debugging_mysterious_illegal_choice_has_been_detected_please_contact_site_administrato#sthash.vDNmqslL.dpuf

也许你应该考虑模块Conditional Fields而不是自定义代码

或解决方法:'#validate' =&gt; TRUEsource

【讨论】:

  • 如果您确定 ajax 填充的值肯定是有效的,或者您不太关心用户在客户端调整的值 >> '#validate' => TRUE 应该足够了..
【解决方案2】:

实际上,它是 '#validated' => TRUE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2014-05-07
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多