【问题标题】:How to pass jquery variable to drupal (ajax)如何将jquery变量传递给drupal(ajax)
【发布时间】:2011-01-28 23:49:50
【问题描述】:

我想通过

var x = 10; 到 drupal/php 变量 $x 而不刷新页面。

有人可以推荐吗?


非常感谢您的回复。 实际上我正在为电子商务网站(Drupal 6)开发自定义模块。 在产品页面上,我有 4 个属性作为文本字段(宽度英寸、宽度英尺、高度英寸、高度英尺)通过进行一些计算,我得到了该产品的新价格。我在 j 查询中进行了计算。 现在我更改“uc_add_to_cart_form”并添加 1 个隐藏字段并使用 $_SESSION 将 jquery 新价格添加到该隐藏字段中。到目前为止一切正常。

我想将此新价格保存到产品节点。我无法将此新价格设置为 $node->price。 我将 uc_ajax_cart 用于“添加到购物车”按钮。

谁能建议我如何进行?

【问题讨论】:

  • 这个问题没有多大意义。请扩展问题并解释您要做什么。简而言之,给 $var 赋值是没有意义的,除非你对 $var 做一些事情。请求完成后,变量和其他所有内容都将消失。

标签: php drupal


【解决方案1】:

将可变数据从 JavaScript 传递到 Drupal/PHP 是一回事。将信息从 Drupal/PHP 传递到 JavaScript 是另一回事。我认为你的意思是你的问题中的第一个。所以我会继续回答这个问题。

将变量从 JavaScript 传递到 Drupal/PHP

1) 实现menu hook。您可以在现有的贡献或新的自定义模块上执行此操作,这取决于您在做什么。它非常简单直接,在 Drupal 网站上也有很好的记录。

  $items = array();

  $items['my_custom_callback/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'my_custom_php_function', 
    'page arguments' => array(1),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );

让我们分解上面的例子。

$items['my_custom_callback/%']

$items 只是一个数组,可以任意命名。如果我的网站的 URL 是 www.alexanderallen.name,那么 @987654322@ 将是我将从我的 JavaScript 应用程序调用的资源。

在数组的键中,单词my_custom_callback后面的百分比符号是一个占位符。这是您将数据从 JS 传递到 PHP 的地方。因此,如果变量 x 的值为 10,则来自 JQuery 的调用将如下所示:

@987654323@

当您加载该 URL 时,Drupal 将找到您的菜单挂钩,并调用您在“页面回调”数组键中定义的函数。在这种情况下,这将是:

<?php
/**
* Function that gets called from JQuery asynchronously. 
*/
function my_custom_php_function($argument) {
  // Do something with $argument...
  echo $argument;
}
?>

你可以对变量 x 的值做任何你想做的事情,比如将它存储在数据库中。

如果您将菜单挂钩放在自定义模块上,并且您的模块名称为 example_module,则菜单挂钩和自定义 PHP 回调将如下所示:

<?php
/**
* @file example_module.module Handles fancy AJAX functionality.
* 
*/

/**
* Implementation of hook_menu
*
* @see http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_menu/6
*/
function example_module_menu() {
  $items = array();

  $items['my_custom_callback/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'my_custom_php_function', 
    'page arguments' => array(1),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
* Function that gets called from JQuery asynchronously. 
*/
function my_custom_php_function($argument) {
  // Do something with $argument...
  echo $argument;
}

?>

如果您想将多个变量从 JQuery 传递到 Drupal/PHP,您可以考虑在 JavaScript 中对它们进行 JSON 化,然后再将其传递给 PHP。请记住,如果有效负载非常大,您应该考虑使用 JQuery .post() 而不是 .get()。用于解码 JSON 的 PHP 函数是here on php.net

不要忘记在 example_module_menu() 函数的末尾返回 $items。如果您想将两个或更多参数从 JavaScript 传递给 PHP,那么菜单项将类似于以下内容:

function example_module_menu() {
  $items = array();

  $items['my_custom_callback/%/%/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'my_custom_php_function', 
    'page arguments' => array(1, 2, 3),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function my_custom_php_function($arg1, $arg2, $arg3) {
  // Do something ...
  $sum = $arg2 + $arg3;

  echo "Hi". $arg1 .", X + Z = ". $sum;
}

?>

在这种情况下,我将三个参数传递给 PHP。 'page arguments' 指定了你想要传递给 PHP 的 URL 部分。如果您要编写'page arguments' =&gt; array(0),,那么您的 PHP 函数的参数将是字符串 my_custom_callback


2) 使用 JQuery 从您的 JS 代码中调用菜单挂钩。 JQuery 提供了各种 AJAX 方法。您使用哪一种将取决于您处理的数据格式及其大小等。

您很可能会使用两种 JQuery 方法之一。 .post().get(),请记住,post 请求将允许比 get 请求更大的数据负载。因此,如果变量 x = 10 的大小,您可能需要坚持使用 .get()。 .post() 和 .get() 方法都是 .ajax() 方法的扩展,或者依赖于 .ajax() 方法。 .ajax() 方法更灵活,因为它为您提供了更多选项,例如指定数据格式(JSON 或纯文本)、随请求发送用户名/密码、选择同步或异步请求,以及浏览器是否应该缓存请求。

这是 JQuery .get() 方法的方法签名:

jQuery.get( url, [ data ], [ callback(data, textStatus, XMLHttpRequest) ], [ dataType ] )

如果您打算使用 GET 将数据发送到 Drupal/PHP,使用上面的示例,您可以执行以下操作:

    <script type='text/javascript'>
    var name = 'alexander';  
    var x = 10;
    var z = 20;

    $.get( 
      // Callback URL.
      "http://www.alexanderallen.name/my_custom_callback/"+ name +"/"+ x +"/"+ z
    );

    </script>

请注意,.get() 方法中 data 参数的使用是可选的,在我的示例中我省略了它,但通过将要传递给 Drupal/PHP 的数据与 URL 的其余部分连接起来达到了相同的效果.

如果我运行它,HTTP GET 请求将如下所示:

@987654328@

响应如下:

Hi Alexander, X + Z = 30

将数据从 Drupal 传递到 JavaScript

为此,您将使用行为,我没有详细说明,因为我认为这不是您的问题,但是您可以转到 Drupal 6 行为here 的官方文档。

【讨论】:

    【解决方案2】:

    你需要知道:

    菜单 API:
    http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7
    一些 Drupal JSON 函数(可能)
    http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_json_encode/7
    variable_set ()
    http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/variable_set/7
    还有 jQuery ajax API:
    http://api.jquery.com/category/ajax/

    基本上,您需要创建一个委托给回调的菜单项(注意您的权限),然后使用 $.ajax() 调用它。如果您需要对响应执行某些操作,请参阅 json_encode 功能。

    您可能想在这里查看一些菜单示例:
    http://drupal.org/project/examples

    我认为 jQuery ajax API 有一个 Drupal 接口。如果有人知道更好的方法,也许可以发表评论。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2012-02-21
      • 2016-10-13
      相关资源
      最近更新 更多