试图弄清楚在使用非 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 事件的文档。不确定这是否可能。任何指导将不胜感激。