如何在 Drupal 中将长 javascript 字符串传递给 PHP hook_menu?
How can I pass a long javascript string to PHP hook_menu in Drupal?
在 mysite/build-order 我有一个很长的订单代码,我正在使用 Javacsript 组装并通过 URL 中的 _GET 发送到 hook_menu 页面进行处理。
它可以和这个一样长(或更长),并且我将它发送到创建订单页面,如下所示:
<script type="text/javascript">
//...building code
var orderCode = "sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:Some description,sku:ES>qty:10>prc:3>nfo:BlahBlah,sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:BlahBlah-visiondelimiter-Phasellus laoreet lorem vel dolor tempus vehicula. Curabitur blandit tempus ardua ridiculus sed magna. Quisque placerat facilisis egestas cillum dolore.-visiondelimiter-eventName";
var url = '/create-order/' + orderCode;
window.location.replace(url);
</script>
我在名为 "create_order_menu" 的自定义模块中实施了 hook_menu 设置,并且工作正常。
function mymodule_create_order_menu($ordercode){
// do stuff with $ordercode
}
一切正常。唯一的问题是通过 URL 传递的订单代码字符串有时可能是两倍长,并且它会在 mysite/create-order 页面中触发 404 错误。当我缩短代码时,它起作用了。当我再次加长它时,它就断了。
是否有更好的方法将如此冗长的变量发送到我的 hook_menu 页面设置?
编辑(基于以下评论)
在 mysite/build-order 我有一个很长的订单代码,我正在使用 Javacsript 组装并使用 AJAX 通过 POST 发送到 hook_menu 页面进行处理。
它可以和这个一样长(或更长),并且我将它发送到创建订单页面,如下所示:
<script type="text/javascript">
//...building code
var orderCode = "sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:Some description,sku:ES>qty:10>prc:3>nfo:BlahBlah,sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:BlahBlah-visiondelimiter-Phasellus laoreet lorem vel dolor tempus vehicula. Curabitur blandit tempus ardua ridiculus sed magna. Quisque placerat facilisis egestas cillum dolore.-visiondelimiter-eventName";
$.ajax({
type: "post",
url: "/create-order/index.php",
data: {
'orderCode': orderCode,
}
})
.done(function( msg ) {
var newpage = '/create-order/index.php';
window.location.replace(newpage);
})
</script>
我在名为 "create_order_menu" 的自定义模块中实施了 hook_menu 设置,并且工作正常。这将创建页面 mysite/create-order。这个页面中有一堆php 必须将orderCode 字符串解析成单独的任务。但是,我无法让 hook_menu 函数接收 _POST 变量。这不起作用:
function mymodule_create_order_menu(){
$orderCode = $_POST['orderCode']; //doesn't work
// do tasks with $orderCode
}
这也不行,因为 _POST 声明在函数之外,所以在加载 mysite/create-order:
时它实际上不会被调用
$orderCode = $_POST['orderCode']; //doesn't work
function mymodule_create_order_menu($orderCode){
// do tasks with $orderCode
}
我是否必须向我的模块 hook_menu 添加任何参数才能传递到 create_order 页面?
function mymodule_menu(){
/**
* Implements hook_menu()
*/
$items['create-order'] = array(
// page title
'title' => 'Create Order',
// function that is called when visiting the new path
'page callback' => 'mymodule_create_order',
'type' => MENU_CALLBACK,
'access callback' => 'user_is_logged_in',
);
return $items;
}
将 _POST 变量传递到我的 hook_menu 页面的最佳方法是什么?
是的,您可以调用 PHP 文件,并使用 jQuery.ajax()
向其发送数据
要做到这一点,您需要从您的脚本 运行.
中引用 jQuery 库
然后像下面这样写..
var code = '#12345';
$.ajax({
url: 'create_order_menu.php',
type: 'post',
data: {'ordercode': code},
success: function(data) {
if(data == "received") {
//order code received by PHP script
}
},
error: function(xhr, desc, err) {
console.log(xhr);
console.log("Details: " + desc + "\nError:" + err);
}
});
此 ajax 调用将 JSON 数据发送到 create_order_menu.php,并在继续执行脚本的其余部分之前等待 'received' 的响应。
create_order_menu.php 可以像
一样简单
<?php
$orderCode = $_POST['ordercode'];
function createOrderMenu($orderCode){
// do something with $orderCode
return 'received';
}
这里的代码还没有经过测试。但这里的要点是,有另一种方法可以将数据发送到 PHP 文件,这比将整个订单代码放在 URL 中更好。
编辑 - 工作示例
<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
</head>
<body>
<input type="button" class="callajax" value="Press">
</body>
<script type="text/javascript">
var orderCode = '#12345';
$(document).ready(function(){
$('.callajax').on('click', function() { callAjax(orderCode); });
});
function callAjax(orderCode){
$.ajax({
url: 'create_order_menu.php',
type: 'post',
data: {'ordercode': orderCode},
success: function(data) {
if(data == "received") {
alert('Order code received.');
}
},
error: function(xhr, desc, err) {
console.log(xhr);
console.log("Details: " + desc + "\nError:" + err);
}
});
}
</script>
</html>
create_order_menu.php 文件
<?php
if($_POST['ordercode']){
createOrderMenu($_POST['ordercode']);
}
function createOrderMenu($ordercode){
if($ordercode == '#12345'){
echo "received";
}
}
按下按钮时,将调用 ajax 请求,POST 将我们的 orderCode 数据发送到 create_order_menu.php。如果检测到 PHP 文件并且 POST 数据发送成功 ajax 'success' 函数将在 PHP 脚本完成时调用(即使 PHP 脚本抛出错误——实际上可以在数据变量中查看以进行调试。
在这种情况下,成功函数中的 if 条件将计算为真,我们将看到警报。添加else语句并更改orderCode,然后您将看到另一个结果。
如果未找到 PHP 脚本或由于某种原因未发送 POST 数据,将调用 'error' 函数。您可以通过重命名 PHP 文件并再次按下按钮来测试它,然后在控制台中查看错误。
请注意,在第二个 PHP 片段中,我现在回显 'received' 而不是返回它,并且我正在调用我们定义的函数。
在 mysite/build-order 我有一个很长的订单代码,我正在使用 Javacsript 组装并通过 URL 中的 _GET 发送到 hook_menu 页面进行处理。
它可以和这个一样长(或更长),并且我将它发送到创建订单页面,如下所示:
<script type="text/javascript">
//...building code
var orderCode = "sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:Some description,sku:ES>qty:10>prc:3>nfo:BlahBlah,sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:BlahBlah-visiondelimiter-Phasellus laoreet lorem vel dolor tempus vehicula. Curabitur blandit tempus ardua ridiculus sed magna. Quisque placerat facilisis egestas cillum dolore.-visiondelimiter-eventName";
var url = '/create-order/' + orderCode;
window.location.replace(url);
</script>
我在名为 "create_order_menu" 的自定义模块中实施了 hook_menu 设置,并且工作正常。
function mymodule_create_order_menu($ordercode){
// do stuff with $ordercode
}
一切正常。唯一的问题是通过 URL 传递的订单代码字符串有时可能是两倍长,并且它会在 mysite/create-order 页面中触发 404 错误。当我缩短代码时,它起作用了。当我再次加长它时,它就断了。
是否有更好的方法将如此冗长的变量发送到我的 hook_menu 页面设置?
编辑(基于以下评论)
在 mysite/build-order 我有一个很长的订单代码,我正在使用 Javacsript 组装并使用 AJAX 通过 POST 发送到 hook_menu 页面进行处理。
它可以和这个一样长(或更长),并且我将它发送到创建订单页面,如下所示:
<script type="text/javascript">
//...building code
var orderCode = "sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:Some description,sku:ES>qty:10>prc:3>nfo:BlahBlah,sku:OR-4x4>qty:2>prc:55.00>nfo:OR-4x4,sku:CVR>qty:1>prc:50>nfo:OR-4x4,sku:PF>qty:15>prc:2>nfo:OR-4x4 (sdfsdfg),sku:EM>qty:2>prc:12.95>nfo:OR-4x4 (sdfsdfg),sku:SC>prc:25>qty:4>nfo:Some description,sku:DB>qty:10>prc:4>nfo:BlahBlah-visiondelimiter-Phasellus laoreet lorem vel dolor tempus vehicula. Curabitur blandit tempus ardua ridiculus sed magna. Quisque placerat facilisis egestas cillum dolore.-visiondelimiter-eventName";
$.ajax({
type: "post",
url: "/create-order/index.php",
data: {
'orderCode': orderCode,
}
})
.done(function( msg ) {
var newpage = '/create-order/index.php';
window.location.replace(newpage);
})
</script>
我在名为 "create_order_menu" 的自定义模块中实施了 hook_menu 设置,并且工作正常。这将创建页面 mysite/create-order。这个页面中有一堆php 必须将orderCode 字符串解析成单独的任务。但是,我无法让 hook_menu 函数接收 _POST 变量。这不起作用:
function mymodule_create_order_menu(){
$orderCode = $_POST['orderCode']; //doesn't work
// do tasks with $orderCode
}
这也不行,因为 _POST 声明在函数之外,所以在加载 mysite/create-order:
时它实际上不会被调用$orderCode = $_POST['orderCode']; //doesn't work
function mymodule_create_order_menu($orderCode){
// do tasks with $orderCode
}
我是否必须向我的模块 hook_menu 添加任何参数才能传递到 create_order 页面?
function mymodule_menu(){
/**
* Implements hook_menu()
*/
$items['create-order'] = array(
// page title
'title' => 'Create Order',
// function that is called when visiting the new path
'page callback' => 'mymodule_create_order',
'type' => MENU_CALLBACK,
'access callback' => 'user_is_logged_in',
);
return $items;
}
将 _POST 变量传递到我的 hook_menu 页面的最佳方法是什么?
是的,您可以调用 PHP 文件,并使用 jQuery.ajax()
向其发送数据要做到这一点,您需要从您的脚本 运行.
中引用 jQuery 库然后像下面这样写..
var code = '#12345';
$.ajax({
url: 'create_order_menu.php',
type: 'post',
data: {'ordercode': code},
success: function(data) {
if(data == "received") {
//order code received by PHP script
}
},
error: function(xhr, desc, err) {
console.log(xhr);
console.log("Details: " + desc + "\nError:" + err);
}
});
此 ajax 调用将 JSON 数据发送到 create_order_menu.php,并在继续执行脚本的其余部分之前等待 'received' 的响应。
create_order_menu.php 可以像
一样简单<?php
$orderCode = $_POST['ordercode'];
function createOrderMenu($orderCode){
// do something with $orderCode
return 'received';
}
这里的代码还没有经过测试。但这里的要点是,有另一种方法可以将数据发送到 PHP 文件,这比将整个订单代码放在 URL 中更好。
编辑 - 工作示例
<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
</head>
<body>
<input type="button" class="callajax" value="Press">
</body>
<script type="text/javascript">
var orderCode = '#12345';
$(document).ready(function(){
$('.callajax').on('click', function() { callAjax(orderCode); });
});
function callAjax(orderCode){
$.ajax({
url: 'create_order_menu.php',
type: 'post',
data: {'ordercode': orderCode},
success: function(data) {
if(data == "received") {
alert('Order code received.');
}
},
error: function(xhr, desc, err) {
console.log(xhr);
console.log("Details: " + desc + "\nError:" + err);
}
});
}
</script>
</html>
create_order_menu.php 文件
<?php
if($_POST['ordercode']){
createOrderMenu($_POST['ordercode']);
}
function createOrderMenu($ordercode){
if($ordercode == '#12345'){
echo "received";
}
}
按下按钮时,将调用 ajax 请求,POST 将我们的 orderCode 数据发送到 create_order_menu.php。如果检测到 PHP 文件并且 POST 数据发送成功 ajax 'success' 函数将在 PHP 脚本完成时调用(即使 PHP 脚本抛出错误——实际上可以在数据变量中查看以进行调试。
在这种情况下,成功函数中的 if 条件将计算为真,我们将看到警报。添加else语句并更改orderCode,然后您将看到另一个结果。
如果未找到 PHP 脚本或由于某种原因未发送 POST 数据,将调用 'error' 函数。您可以通过重命名 PHP 文件并再次按下按钮来测试它,然后在控制台中查看错误。
请注意,在第二个 PHP 片段中,我现在回显 'received' 而不是返回它,并且我正在调用我们定义的函数。