如何在 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' 而不是返回它,并且我正在调用我们定义的函数。