1

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

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

  <?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 插入)。Dblog 收到此错误,因为它尝试将数据发布到旧表单 ID(预重建)。

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

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

4

1 回答 1

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;
}

我看到这个问题是在一年前提出的,但希望这可以帮助其他人寻找答案。

于 2013-04-28T04:54:26.843 回答