我想传递
var x = 10;
到drupal / php变量$ x,没有页面刷新。
有人可以建议吗?
非常感谢您的回复。 实际上我正在为电子商务网站(Drupal 6)开发自定义模块。 在产品页面上,我有4个属性作为文本字段(宽度英寸,宽度英尺,高度英寸,高度英尺)通过做一些计算,我得到了该产品的新价格。我在j查询中做了那个计算。 现在我改变“uc_add_to_cart_form”并添加1个隐藏字段,并使用$ _SESSION将jquery新价格带入该隐藏字段。到目前为止,一切正常。
我想将这个新价格保存到产品节点。我无法将此新价格设置为$ node->价格。 我使用uc_ajax_cart作为“添加到购物车”按钮。
有人可以建议我怎么办?
答案 0 :(得分:35)
将可变数据从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 只是一个数组,可以任意命名。如果我的网站的网址是 www.alexanderallen.name ,那么 http://www.alexanderallen.name/my_custom_callback
将是我从我的JavaScript应用程序调用的资源。
在数组的键中,单词 my_custom_callback 之后的百分比符号是占位符。这是您将数据从JS传递到PHP的地方。因此,如果变量x的值为10,则来自JQuery的调用将如下所示:
http://www.alexanderallen.name/my_custom_callback/10
当你加载那个URL时,Drupal会找到你的菜单钩子,它会调用你在'page callback'数组键中定义的函数。在这种情况下,将是:
<?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,你可以考虑在将其传递给PHP之前在JavaScript中对它们进行JSON化。请记住,如果有效负载非常大,您应该考虑使用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' => array(0),
,那么PHP函数的参数将是字符串 my_custom_callback 。
2)使用JQuery从JS代码调用菜单钩子。 JQuery提供了各种AJAX方法。您使用哪一个取决于您处理的数据格式及其大小等等。
您很可能会使用两种JQuery方法之一。 .post()或.get(),请记住,发布请求将允许比get请求更大的数据有效负载。因此,如果变量x = 10的大小,您可能希望坚持使用.get()。 .post()和.get()方法都是.ajax()方法的扩展或依赖于http://www.alexanderallen.name/my_custom_callback/alexander/10/20方法。 .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请求将如下所示:
,响应如下:
Hi Alexander, X + Z = 30
将数据从Drupal传递到JavaScript
为此你会使用行为,因为我认为这不是你的问题所以我没有详细说明,但你可以去Drupal 6行为的官方文档{{3}}。
答案 1 :(得分: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.jquery.com/category/ajax/
基本上,您需要创建一个委托给回调的菜单项(注意您的权限),然后使用$ .ajax()调用它。如果您需要对响应执行某些操作,请参阅json_encode功能。
您可能需要查看一些菜单示例:
http://drupal.org/project/examples
我认为jQuery ajax API有一个Drupal接口。也许有人可以评论,如果他们知道更好的方式。