使用 Drupal 6 的表单 ahah 让一个下拉字段更新第二个下拉字段的值


Using Drupal 6's form ahah to have one dropdown field update the values of a second dropdown field

我正在研究一对表单字段,它们会直接影响彼此。具体来说,我正在处理的问题是,我们有成千上万的用户可以加入我一直在努力的这个网站。我们正在为该网站创建一些管理分析表格。这些表单的一部分是按组筛选。

问题在于,大多数人不知道一个群体的名字,只知道它从什么开始。因此,我们没有使用自动完成功能,而是提出了两个下拉列表。第一个包含选项 A 到 Z,即组名称开头的字母表中的字母。第二个下拉列表包含以所选字母开头的所有组。

这个概念非常简单,我们能够用jQuery非常容易地实现AJAX。但这会导致验证错误。经过一些研究,我发现这与Drupal表单缓存有关。解决方案是使用 ahah 函数。

这样做的问题是,到目前为止,我找到的所有指令都处理指定字段更新自身而不是另一个字段的 ahah 操作。所以我正在尝试弄清楚如何使用 ahah 获取字母列表以更新组列表并将新值注册到表单缓存中。

我发现的一种解决方案是简单地在隐藏的下拉列表中加载页面上的所有值,然后根据需要在可见的下拉列表中加载集合中的值。但这会产生很多问题,因为客户端几乎只使用 IE,并且我们已经看到 IE 在给出这样的庞大列表时会窒息。特别是对于存储在JavaScript中的列表。因此,我们需要一个轻量级的解决方案。

有什么想法吗?想法?

简而言之,

AHAH的工作原理是这样的:

  • 使用空$form_state生成表单
  • 当具有 #ahah 属性的元素发生更改时,将对 #ahah 属性中指定为路径的 url 进行 ajax 调用。
  • 该 url 的回调执行以下操作:
    • 从表单缓存中检索表单
    • 处理表单
    • 使用当前$form_state重建表单,以便它可以基于该添加/更改元素
    • 表单
    • 放在表单缓存中以避免验证错误
    • 表单以 JSON 形式呈现并返回
  • Drupal 用新表单替换包装器div 的内容。

在您的情况下,您需要使表单生成函数知道在 $form_state 中选择的值。它必须:

  • 生成字母下拉列表
  • 查看 $form_state 并查看是否选择了字母。如果是这样,请根据所选值生成第二个下拉列表。

回调函数将实现表单缓存和重建。

这里有很好的回调函数代码解释:

  • http://drupal.org/node/348475
  • http://drupal.org/node/331941

我实际上在另一个StackExchange网站上得到了答案。他建议使用示例模块来提出解决方案,效果很好。

此处找到的解决方案:https://drupal.stackexchange.com/questions/35048/using-drupal-6s-form-ahah-to-have-one-dropdown-field-update-the-values-of-a-sec