На 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?
Да, вы можете вызвать файл 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 успешно отправлены, при завершении сценария PHP будет вызвана функция ajax «success» (даже если сценарий PHP выдаст ошибку — которую можно просмотреть в переменной данных для отладки).
В этом случае наше условие if внутри функции успеха будет иметь значение true, и мы увидим предупреждение. Добавьте оператор else и измените код заказа, после чего вы увидите другой результат.
Если скрипт PHP не найден или по какой-то причине данные POST не отправлены, будет вызвана функция error. Вы можете проверить это, переименовав файл PHP и снова нажав кнопку, а затем найдите в консоли ошибку.
Обратите внимание, что во втором фрагменте PHP я теперь получаю «получен», а не возвращаю его, и я вызываю функцию, которую мы определили.
Других решений пока нет …