有关 ajax 回调和 drupal_process_form 的帮助

2024-03-07

我有一个通过仅在视图模式下显示的 nodeapi 添加的表单。用户可以从选择菜单中选择一个项目,他们的选择将通过发生更改时的 hook_menu 回调自动保存到数据库中。如果用户禁用了 javascript,它将使用表单 api 正常提交。这一切都工作正常,但现在出于安全原因我想通过表单 api 提交 ajax 版本。我的 form_name_submit 很简单:

function mymodule_test_form_submit($form, &$form_state) {
  global $user;
  db_query("INSERT INTO {mymodule} (nid, uid, status, created) VALUES (%d, %d, %d, " . time() . ")", $form['#parameters'][2], $user->uid, $form_state['values']['mymodule_status']);
}

My ajax:

$('.mysubmit').css('display', 'none');
$('.myclass').change(function() {
  $.ajax({
    type: 'POST',
    url: Drupal.settings.basePath + 'mymodule/set/' + $nid + '/' + $('.myclass').val(),
    dataType: 'json',
    data: { 'ajax' : true, 'form_build_id' : $('#mymodule-form input[name=form_build_id]').val() }
  });
});

还有我的回调函数:

function mymodule_set($nid, $status) {
  $form_build_id = $_POST['form_build_id'];
  $form_state = array('storage' => NULL, 'submitted' => FALSE);
  $form = form_get_cache($form_build_id, $form_state);
  $args = $form['#parameters'];
  $form_id = array_shift($args);
  $form['#post'] = $_POST;
  $form['#redirect'] = FALSE;
  $form['#programmed'] = FALSE;
  $form_state['post'] = $_POST;
  drupal_process_form($form_id, $form, $form_state);
}

最初我的回调函数与我的提交函数大致相同,但现在我也尝试将提交函数与ajax一起使用。这是使用 drupal_process_form 的正确方法吗?从缓存中获取表单,如果没有错误,则对其进行验证并提交?我正在使用本教程中的一些代码来应用我的情况:http://drupal.org/node/331941 http://drupal.org/node/331941似乎没有任何我想要做的事情的例子。我还有 $form['#cache'] = TRUE;在我的表单函数中。

drupal_process_form如何将提交的值与原始表单进行比较以检查完整性?我是否应该将我的值添加到 form_state 中,因为使用 ajax 时表单状态将为空。纠结了好几天了,希望有人有这方面的经验。

Thanks.


我过去必须做一些与您类似的事情,并阅读您发布的相同教程,不幸的是,没有太多可用的信息,并且让它工作对我来说很头痛。我不太记得细节,但我查看了我编写的代码,这里有一些可能对您有用的建议:

  • 不要使用您自己的 jQuery 代码提交表单,而是使用表单元素的新“#ahah”属性,该属性可用于在 select 的 onchange 中调用回调http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#ahah http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/6#ahah

如果您在节点表单中执行此操作,则在表单更改中添加 #ahah 属性可能不起作用,我记得曾经看到过一个与此相关的问题,但当时尚未解决。如果是这种情况,请使用此代码附加 ahah 绑定,您不需要“效果”、“方法”或“进度”,因为您只想提交表单,而不是更改任何内容:

function YOURMODULE_form_alter(&$form, $form_state, $form_id) {
  if ('YOURCONTENTTYPE_node_form' == $form_id) {
    //the only way I could make it work for exisiting fields is adding the binding "manually"
    $ahah_binding = array(
      'url'   => url('YOURCALLBACKPATH'), 
      'event' => 'change',
      'wrapper' => 'FIELD-wrapper',
      'selector' => '#FIELD',
      'effect'   => 'fade',
      'method'   => 'replace',
      'progress' => array('type' => 'throbber'),
    );

    drupal_add_js('misc/jquery.form.js');
    drupal_add_js('misc/ahah.js');
    drupal_add_js(array('ahah' => array('FIELDd' => $ahah_binding)), 'setting');

    //force the form to be cached
    $form['#cache'] = TRUE;
  }
}
  • 这是我的回调函数,请注意它对您发布的教程进行了一些修改:

    function YOURMODULE_js() {
    
      // The form is generated in an include file which we need to include manually.
      include_once 'modules/node/node.pages.inc';
      // We're starting in step #3, preparing for #4.
      //I have to add the 'rebuild' element, if not an empty node was created
      $form_state = array('storage' => NULL, 'submitted' => FALSE, 'rebuild' => TRUE);
      $form_build_id = $_POST['form_build_id'];
      // Step #4.
      $form = form_get_cache($form_build_id, $form_state);
    
      // Preparing for #5.
      $args = $form['#parameters'];
      $form_id = array_shift($args);
      $form_state['post'] = $form['#post'] = $_POST;
      $form['#programmed'] = $form['#redirect'] = FALSE;
    
      // if you want to do any modification to the form values, this is the place 
    
      // Step #5.
      drupal_process_form($form_id, $form, $form_state);
      // Step #6 and #7 and #8.
      $form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
    
    
      // Final rendering callback.
      drupal_json(array('status' => TRUE, 'data' => $output));
    }
    

正如我之前所说,有些细节我已经忘记了,但这也许会对您有所帮助。

祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有关 ajax 回调和 drupal_process_form 的帮助 的相关文章

  • Jquery:排除元素

    我有以下代码 document ready function a rel each function this qtip content text img class middle src i icon processing gif alt
  • 一个表单包含两个提交按钮,每个按钮都有不同的操作

    我花了几个小时试图找到问题的解决方案 但似乎找不到正确的解决方案 提前感谢你的帮助 我有一个 html 表单
  • 将数组从 javascript 传递到控制器 MVC 4

    我正在使用剃刀 但很难将数组传递给控制器 该数组包含我制作的对象 我正在尝试执行此操作 ajax type POST url HomePage HandleOperations data JSON stringify operationCo
  • 使用 f:ajax 渲染多个组件

    错误的代码是
  • Django 和自定义表单验证

    我正在尝试创建一个自定义表单字段并对其进行验证 这是 Django 1 0 版本 这是我的表单对象 class UsernameField forms CharField def clean self values print 我是这样称呼
  • php循环中的ajax在按钮单击时执行操作

    所以我有一个 php 循环 我使用 jquery 滑动切换来隐藏 显示带有 sql 结果的表 目前该表仅使用 php 加载 但由于发生了很多事情 导致了一些加载问题 我需要使用滑动切换 btn 来触发 ajax 因此它仅在按下按钮时请求当前
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • 防止隐藏的输入被更改

    这一直让我压力很大 我有一个隐藏的输入
  • 重复的“Access-Control-Allow-Origin: *”标头会破坏 CORS 吗?

    所以我们有一个提供 JSON 服务的 http 资源 它添加了一个 Access Control Allow Origin 旗帜 所以这可以用 CORS 加载 except 所以我被告知 有一些 IE9 怪癖 这意味着这在 IE9 中仍然不
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • 由于继承抽象类而禁用设计器?

    我有一个项目的解决方案 那个项目中有 40 或 50 种形式 我制作了 4 个基本形式 所有其他形式都可以继承 所有 4 个基本表单都继承 System Windows Forms Form 几乎 90 的形式继承了前 2 个基本形式之一
  • 如何轻松地将 Ajax、perl 和 JSON 结合使用?

    我正在尝试使用 Ajax 制作一个网页 Example 我创建了一个 Perl CGU 文件来触发一个简单的帖子 文件 test cgi name 托马斯 回复短信 你的名字是托马斯 我创建了一个可以使用该帖子的 html 文件 但随后页面
  • 如何使用 AJAX/jQuery 显示打印内容?

    所以我试图理解整个 AJAX jQuery 的事情 现在 当我单独运行这个 PHP 脚本时 我必须等待并观察轮子旋转 直到循环完成然后加载 while row mysql fetch array res postcode to storm
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • 如何正确删除动画集中引用的 Raphael SVG 元素?

    我有一组动画 Raphael SVG 元素 我正在通过用户发起的 ajax 调用添加新元素并删除旧元素 我 set push 新元素 但因为我需要删除的元素通常不是集合中的最后一个元素 所以我使用 element remove 而不是 se
  • 使用 AJAX 获取发布数据

    我正在尝试从 Wordpress 帖子 AJAX 中提取内容 我已经在下面列出了迄今为止我的努力 加载的脚本 wp enqueue script my ajax request get stylesheet directory uri js
  • 阻止通过 GET 传递“提交”按钮值?

    我正在尝试通过 GET 传递表单信息 这很重要 这样人们就可以将表单选择中过滤后的数据发送给其他人 问题是 使用下面的代码 它不仅传递过滤器信息 还传递提交表单值 如下所示 index php month filter Feb year f
  • 如何通过 javascript 和 ajax 调用 Scala 中的方法?

    我不知道我的标题是否有点误导 但这是我真正需要帮助的 我正在获取这个网址 get fb login fbEmail function data console log data 这是我的路线 GET fb login email prese
  • json_encode 创建格式错误的 JSON 数据?

    我有一个 codeigniter 应用程序将一些数据从数据库返回到视图 我正在尝试将其作为 json 数据发送回来 问题是返回的数据格式错误 它看起来像这样 2 5 Admin1 2 10 Admin2 当我在 jsonlint com 上
  • Pjax动画

    我终于让 pjax 工作了 但我还有另一个问题 如何添加一些 jquery 动画 如淡出 幻灯片旧内容和淡入 幻灯片新内容 默认情况下 pjax 只是更改内容 没有任何好看的效果 任何帮助将非常感激 此致 基本上 你有一堆事件 https

随机推荐

  • 使用 onbeforeunload 事件,“离开页面”时 url 发生变化

    我有一个要求 当用户付款并到达成功页面并返回时 应该将其重定向到自定义页面 因此 如果我单击浏览器后退按钮 它将显示两个选项 离开页面和留在此页面 当我单击离开页面时 它应该重定向到我的自定义页面 我发现以下链接很有用 但不适用于 离开页面
  • 将枚举值绑定到标签 XAML

    我正在使用枚举字段来跟踪程序的状态 public enum StatiMacchina InAvvio 1 Pronta 2 InLavorazione 3 InMovimento 4 InAttesa 5 InErrore 6 我想绑定跟
  • 中心引导行和跨度

    我正在尝试使用引导程序将行及其内部的跨度居中 您可以在页脚中看到它 http www divisionforty com wall http www divisionforty com wall 我希望社交网络图标位于左侧 版权位于中间 由
  • MVC 6 OpenIdConnect

    目前 我在将 MVC 应用程序从 beta 3 迁移到 4 时遇到了多个问题 其中之一与 OpenIdConnect 到 Windows Azure 进行身份验证有关 当我转到具有授权属性的页面时 该页面会停止处理并位于空白页面 而不会显示
  • 我无法以编程方式检测 angularjs 中的值变化

    我是 angularjs 的新手 我遇到了麻烦 I have html像这样 section class content div div section
  • DTO 道 POCO BO

    事实上 我对这些术语以及它们之间的关系感到非常困惑 我读过有关其中每个人的一些内容 但我不了解工作流程 DTO 数据传输对象 传输值的对象BO 业务对象 域模型中的对象 用于制作业务逻辑的对象POCO 不知道 我在维基上读过定义 但什么也没
  • Vue-i18n - 无法读取未定义的属性“配置”

    首先 我向您展示什么是有效的 在 App js 中 import router from routes js import VueI18n from vue i18n const messages en message hello hell
  • PHP静态成员不保值

    大家好 我正在编写的 WordPress 插件遇到了一个奇怪的问题 但这与 WordPress 本身无关 更多地与 PHP 有关 所以请继续阅读 以便我可以解释 WordPress 插件已连接 以便调用 init 函数 这有效 我可以确认它
  • iOS 模拟器中屏幕内容仅显示在部分屏幕上

    我的 iOS 模拟器仅将内容显示为屏幕的一部分 我该如何修复它 我正在使用 XCode 6 3 1 谢谢 你只需要重新启动它 有时会发生这种情况 强制关闭模拟器并重新启动
  • Django 中的syncdb 时内容类型过时

    当我努力的时候syncdb对于我的 django 项目 我看到以下抱怨 The following content types are stale and need to be deleted myapp Any objects relat
  • 在Java中调用Python?

    我想知道是否可以使用 Jython 从 Java 代码调用 Python 函数 还是只能从 Python 调用 Java 代码 Jython 用于 Java 平台的 Python http www jython org index html
  • Docker 注册表镜像未使用

    当我尝试从本地镜像中提取图像时 它起作用了 docker login u docker p mypassword nexus3 pleiade mycomp fr 5000 docker pull nexus3 pleiade mycomp
  • 数字签名服务器上的私钥存储在哪里?

    我正在开发一个客户端服务器应用程序 需要在发送到客户端之前使用私钥对某些文件进行签名 然后 客户端将使用公钥验证签名 因此 私钥需要始终位于服务器上并且可由服务器应用程序读取 问题是我想知道在哪里存储我的私钥 这样在服务器受到威胁时更安全
  • 为什么 sizeWithFont:constrainedToSize:lineBreakMode: 返回错误的大小?

    我想要在表格单元格的标签中显示的字符串有两种可能的宽度 并且我需要计算高度 以便正确记录表格单元格的高度 然而 无论我对约束尺寸做什么 我都会得到相同的高度 这在我想要的情况下是不正确的 我正在使用的代码 CGFloat width 300
  • 如何使用prepareForReuse方法

    我发现这个方法叫做 void prepareForReuse I 阅读文档 https developer apple com documentation uikit uitableviewcell但我不明白如何使用它 当我滚动表格视图时
  • 如何使用 C# 创建包装 RTD 函数的 Excel 自动化插件?

    我有一个基于 RtdServer 的可用自动化插件 如何使用 RtdServer 在 C 中创建实时 Excel 自动化插件 https stackoverflow com questions 5397607 howto create a
  • Scikit learn 错误消息“精度和 F 分数定义不明确,在标签中设置为 0.0”[重复]

    这个问题在这里已经有答案了 我正在研究二元分类模型 分类器是朴素贝叶斯 我有一个几乎平衡的数据集 但是当我预测时 我收到以下错误消息 UndefinedMetricWarning Precision and F score are ill
  • 睡眠的意义(0)

    我以前见过Sleep 0 在我的代码的某些部分 一些无限 长while循环可用 我被告知这将使时间片可用于其他等待进程 这是真的 有没有什么意义Sleep 0 根据 MSDN 的文档Sleep http msdn microsoft com
  • Rails.logger.info 在初始化程序中不起作用

    Rails logger info在初始化程序中使用时不会写入任何信息到日志中 如何登录初始化程序 Rails logger Logger new STDOUT before MyServer Application initialize
  • 有关 ajax 回调和 drupal_process_form 的帮助

    我有一个通过仅在视图模式下显示的 nodeapi 添加的表单 用户可以从选择菜单中选择一个项目 他们的选择将通过发生更改时的 hook menu 回调自动保存到数据库中 如果用户禁用了 javascript 它将使用表单 api 正常提交