我可以使用ajax从一个输入中定位多个表单元素吗?


8

我正在尝试使用Ajax从一个表单输入模糊更新Drupal表单的两个不同部分。

我的输入中包含标准的ajax内容:

$my_form['my_input']['#ajax'] = array(
  'callback' => 'my_callback',
  'wrapper' => 'my_target_div',
  'event' => 'blur',
);

这工作得很好,在输入更新时换出了我的div ... 但是,由于原始输入的模糊性,我还想用其他代码更新表单中其他位置的另一个表单输入。

这有可能吗?

编辑:为清楚起见,这是我的真实示例:

  • 内容类型“电影”
  • 添加了字段“ primary_title”
  • 当'primary_title'更新时,我的ajax回调检查相似的字符串并返回html。
  • 回调中的html插入到一个空的div中。

    那部分工作很棒!

我还尝试修改标准节点“ title”输入,在完成一些正则表达式以整理字符串后(从开始处删除“ The”或“ A”等),为其输入值“ primary_title”将是两个标题字段,一个具有完整标题“ primary_title”,另一个具有修剪的“ title”,这对于排序和显示记录很有用。


Answers:


13

看来您可以使用ajax命令来定位表单的不同部分,但是您必须选择返回其中一个:

  • HTML或

  • 可渲染数组或

  • AJAX命令数组

在我最初写的情况下,我试图同时返回一个AJAX命令数组一个可渲染数组,这似乎是不可能的。

示例模块中的代码演示了如何使用AJAX命令数组来定位表单的不同部分:

function ajax_example_advanced_commands_html_callback($form, $form_state) {
  $text = $form_state['values']['html_command_example'];

  $commands = array();
  $commands[] = ajax_command_html('#html_div', $text);
  $commands[] = ajax_command_replace("#html_status", "<div id='html_status'>Updated html_command_example with text=$text;  " . date('r') . "</div>");
  return array('#type' => 'ajax', '#commands' => $commands);
}

在此代码示例中,#html_div获取$ text,而#html_status分别获取“具有text = $ text;的更新的html_command_example”。date('r')。”

表单上的两个不同位置具有来自一个ajax回调的两个不同信息!

再次查看我正在做的事情,我意识到我根本不需要返回节点标题字段。它只会是一个实用程序字段,用于对列表中的数据进行排序。

我已经在节点表单上隐藏了该字段,并在触发原始ajax回调时第二次构建表单时填充了该字段。


0

我对Drupal相当陌生,但到目前为止,我发现Ajax框架相当不灵活。只要您按预期使用它,它就可以很好地工作。因此,在您的实例中,如果您知道一些JS,那么最好的定义就是使该脚本成为您自己的脚本,它应该很轻便。

祝好运!


感谢您的建议:)我已经意识到我根本不需要返回节点标题字段,因为它只是用作组织列表的实用程序字段。当由于现有的ajax回调而重建表单时,将填充它。
瑞克

0

来自drupal.org的另一种选择:

如果最简单的话,您可以轻松替换整个表格。只需将#prefix和#suffix添加到整个表单数组,然后将其设置为#ajax ['wrapper']。(这将允许您通过单个ajax调用来更改多个表单元素。)唯一不这样做的原因是,如果传输的信息较少,则处理速度会更快。

您的回调函数可以很简单:

function _callback($form, $form_state) {
  return $form;
}

应该从在(或某种形式的alter hook)中定义#ajax的form元素上的数组(field_whatever对于下面的示例)中调用该数组hook_form_FORM_ID_alter(),您还可以在其中测试$form_state并更改该$form数组,例如:

 if (isset($form_state['values']['field_whatever'])){
     $form['field_something']['#disabled'] = TRUE;
     $form['field_something_else']['#disabled'] = FALSE;
 } else {
     $form['field_something']['#disabled'] = FALSE;
     $form['field_something_else']['#disabled'] = TRUE;
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.