如何将jquery变量传递给drupal(ajax)

Dru*_*bie 7 php drupal

我想通过

var x = 10; 到没有页面刷新的drupal/php变量$ x.

谁有人建议?


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

我想将这个新价格保存到产品节点.我无法将此新价格设置为$ node-> price.我使用uc_ajax_cart"添加到购物车"按钮.

任何人都可以建议我如何进行?

ama*_*sta 35

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

将变量从JavaScript传递到Drupal/PHP

1)实现菜单钩子.您可以在现有的自定义模块或新自定义模块上执行此操作,这取决于您正在执行的操作.它非常简单直接,在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,
  );
Run Code Online (Sandbox Code Playgroud)

让我们分解上面的例子.

$items['my_custom_callback/%']

$ items只是一个数组,它可以命名任何你喜欢的名字.如果我的网站的URL是www.alexanderallen.name,那么我将从我的JavaScript应用程序调用该资源. http://www.alexanderallen.name/my_custom_callback

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

http://www.alexanderallen.name/my_custom_callback/10

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

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

在那里,您可以使用变量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;
}

?>
Run Code Online (Sandbox Code Playgroud)

如果你想将多个变量从JQuery传递给Drupal/PHP,你可以考虑在JavaScript中对它们进行JSON化,然后再将它传递给PHP.请记住,如果有效负载非常大,您应该考虑使用JQuery .post()而不是.get().用于解码JSON的PHP函数在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;
}

?>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将三个参数传递给PHP.'page arguments'指定要传递给PHP的URL部分.如果你要编写'page arguments' => 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>
Run Code Online (Sandbox Code Playgroud)

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

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

http://www.alexanderallen.name/my_custom_callback/alexander/10/20

并且响应看起来像:

Hi Alexander, X + Z = 30

将数据从Drupal传递到JavaScript

为此,你会使用行为,我不会进入细节,因为我认为这不是你的问题,但你可以在这里查看Drupal 6行为的官方文档.


Rim*_*ian 4

你得知道:

菜单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.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 接口。如果有人知道更好的方法,也许可以发表评论。