Drupal 7 - "非法选择" ajaxed选择字段的错误(不使用Drupal FAPI #ajax)

时间:2012-01-20 20:02:22

标签: ajax drupal-7 modal-dialog drupal-ctools

在使用非FAPI ajax方法替换选择列表时,尝试弄清楚如何解决“检测到非法选择”错误。

示例 在节点创建表单上,选择列表下方有一个链接,用于在ctools模式窗口中打开自定义表单以添加新值,并且在模式中成功提交表单时,节点表单select将替换为新值。

  <?php
  if (!empty($form_state['executed'])) {
    // Replace node form select if form submit was successful.
    module_load_include('inc', 'node', 'node.pages');
    $node_form = node_add('photo');
    $new_field = drupal_render($node_form[$field]);
    $output = array();
    $output[] = ajax_command_replace($selector, $new_field);
    $output[] = ctools_modal_command_dismiss();
  }
  print ajax_render($output);

我可以让它工作,直到我提交原始节点表单,我得到“非法选择”错误,可能是因为节点表单使用缓存的表单值进行验证。 设置$ form_state ['rebuild'] = TRUE;修复了非法选择错误,但是节点表单中的图像字段无法正常工作。图像文件上传并保存到节点,但缩略图,alt和标题标签不会被ajaxed in)。 Dblog会收到此错误,因为它会尝试将数据发布到旧表单ID(预重建)。

location: file/ajax/field_image/und/0/form-DSbMdFlKNDaAJSFY4fVIHkcg2eMCDqYZHUfitCnR0VA
message: Invalid form POST data.

有没有更好的方法来替换选择列表以避免“非法选择”错误,或者我应该检查$ form_state ['rebuild']是否存在文件模块错误?我找不到任何关于如何从另一种形式触发$ form #ajax事件的文档,作为一种可能的替代方案。不确定这是否可行。 任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:1)

在节点表单选择字段中,添加'#validated' => TRUE。您必须在自定义模块中更改节点表单:

mymodule_form_photo_node_form_alter (& $form, & $state)
{
  // Replace 'field_name' with whatever the name of the select field is
  $form['field_name']['#validated'] = TRUE;
}

我看到这个问题是在一年前被问到的,但希望这有助于其他人寻找答案。