Как я могу передать длинную строку javascript в PHP hook_menu в Drupal?

На mysite/build-order у меня есть длинный код заказа, который я собираю с помощью Javacsript и отправляю через _GET в URL на страницу 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>

Я реализовал настройку hook_menu в своем пользовательском модуле под названием «create_order_menu», и он отлично работает.

function mymodule_create_order_menu($ordercode){

    // do stuff with $ordercode

}

Все работает нормально. Единственная проблема заключается в том, что строка кода заказа, передаваемая через URL-адрес, иногда может быть в два раза длиннее и вызывает ошибку 404 на странице mysite/create-order. Когда я сокращаю код, он работает. Когда я снова удлиняю его, он ломается.

Есть ли лучший способ отправить такую ​​длинную переменную в настройку моей страницы 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>

Я реализовал настройку hook_menu в своем пользовательском модуле под названием «create_order_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?


person sakeferret    schedule 12.02.2015    source источник
comment
Проведите небольшое исследование AJAX.   -  person Charlotte Dunois    schedule 12.02.2015


Ответы (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 и ожидает ответа «получено», прежде чем продолжить выполнение остальной части скрипта.

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 успешно отправлены, функция «успех» ajax будет вызвана после завершения сценария PHP (даже если сценарий PHP выдает ошибку, которую можно просмотреть в переменной данных для отладки).

В этом случае наше условие if внутри функции успеха будет оценено как истинное, и мы увидим предупреждение. Добавьте оператор else и измените orderCode, после чего вы увидите другой результат.

Если скрипт PHP не найден или по какой-либо причине данные POST не отправляются, будет вызвана функция «ошибка». Вы можете проверить это, переименовав файл PHP и снова нажав кнопку, а затем посмотрите в консоли на наличие ошибки.

Обратите внимание, что во втором фрагменте PHP я теперь повторяю «получено», а не возвращаю его, и я вызываю определенную нами функцию.

person Simian    schedule 12.02.2015
comment
спасибо, это полезно. Я реализовал то, что вы предлагаете выше. однако объявление _POST в вашем php-коде выше не срабатывает, потому что оно находится вне функции create_order_menu. Это функция create_order_menu, которая определяет URL-адрес создания заказа. Если это не сработает первым, вызов _POST никогда не будет вызван. Если я помещу вызов _POST внутри функции, страница URL-адреса /create-order, похоже, не увидит переменную 'ordercode'. Какие-либо предложения? - person sakeferret; 13.02.2015
comment
Я внес изменения в свой ответ, чтобы привести рабочий пример. Запрос ajax просто указывает на файл PHP, который будет выполнен, а не непосредственно на функцию. Вы можете отправить столько данных, сколько хотите, в этот файл и перехватить их с помощью переменных PHP POST для использования в своих функциях. Надеюсь это поможет - person Simian; 13.02.2015