0

在 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 页面的最佳方式是什么?

4

1 回答 1

1

是的,您可以调用 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 请求,将我们的 orderCode 数据发布到 create_order_menu.php。如果检测到 PHP 文件并成功发送 POST 数据,则在 PHP 脚本完成时将调用 ajax 'success' 函数(即使 PHP 脚本抛出错误 - 实际上可以在数据变量中查看以进行调试)。

在这种情况下,success 函数中的 if 条件将评估为 true,我们将看到警报。添加一个 else 语句并更改 orderCode,然后您将看到另一个结果。

如果未找到 PHP 脚本或由于某种原因未发送 POST 数据,则将调用“错误”函数。您可以通过重命名 PHP 文件并再次按下按钮来测试这一点,然后在控制台中查看错误。

请注意,在第二个 PHP 片段中,我现在正在回显“已收到”而不是返回它,并且我正在调用我们定义的函数。

于 2015-02-12T21:14:16.270 回答