Как передать переменную jquery в drupal (ajax) - PullRequest
7 голосов
/ 29 января 2011

хочу пройти

var x = 10; в переменную drupal / php $ x без обновления страницы.

Кто-нибудь может подсказать?


Большое спасибо за ответ. На самом деле я занимаюсь разработкой пользовательского модуля для сайта электронной коммерции (Drupal 6). На странице товара у меня есть 4 атрибута в виде текстового поля (ширина в дюймах, ширина в футах, высота в дюймах, высота в футах). Проведя некоторые вычисления, я получил новую цену для этого продукта. Я сделал этот расчет в J-запрос. Теперь я изменяю "uc_add_to_cart_form" и добавляю 1 скрытое поле и получаю новую цену jquery в это скрытое поле, используя $ _SESSION. До этого момента все работало нормально.

Я хочу сохранить эту новую цену в узле продукта. Я не могу установить эту новую цену на $ node-> price. Я использую uc_ajax_cart для кнопки «Добавить в корзину».

Может кто-нибудь подсказать, пожалуйста, как мне действовать?

Ответы [ 2 ]

35 голосов
/ 31 января 2011

Передача переменных данных из JavaScript в Drupal / PHP - это одно.Передача информации из Drupal / PHP в JavaScript - это отдельная вещь.Я думаю, что вы имели в виду первое в вашем вопросе.Поэтому я продолжу и отвечу:

Передача переменных из JavaScript в Drupal / PHP

1) Реализация меню .Вы можете сделать это на существующем добавленном или новом пользовательском модуле, это зависит от того, что вы делаете.Это довольно легко и просто, это также хорошо задокументировано на сайте Drupal.

  $items = array();

  $items['my_custom_callback/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'my_custom_php_function', 
    'page arguments' => array(1),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );

Давайте разберем приведенный выше пример.

$items['my_custom_callback/%']

$ items - это просто массив, и его можно назвать как угодно.Если URL моего веб-сайта www.alexanderallen.name , тогда <a href="http://www.alexanderallen.name/my_custom_callback" rel="noreferrer">http://www.alexanderallen.name/my_custom_callback</a> будет ресурсом, который я буду вызывать из моего приложения JavaScript.

В ключе массива символ процентапосле слова my_custom_callback указывается заполнитель.Здесь вы будете передавать свои данные из JS в PHP.Поэтому, если значение переменной x равно 10, вызов из вашего JQuery будет выглядеть следующим образом:

<a href="http://www.alexanderallen.name/my_custom_callback/10" rel="noreferrer">http://www.alexanderallen.name/my_custom_callback/10</a>

Когда вы загрузите этот URL, Drupal найдет ваш хук меню, и онвызовет функцию, которую вы определили в ключе массива page callback.В этом случае это будет:

<?php
/**
* Function that gets called from JQuery asynchronously. 
*/
function my_custom_php_function($argument) {
  // Do something with $argument...
  echo $argument;
}
?>

Там вы можете делать все что угодно со значением переменной x, например, сохранять его в базе данных.

Если вы должны были поместить менюперехватить пользовательский модуль, а имя вашего модуля было example_module, перехват меню и пользовательский обратный вызов PHP будут выглядеть так:

<?php
/**
* @file example_module.module Handles fancy AJAX functionality.
* 
*/

/**
* Implementation of hook_menu
*
* @see http://api.drupal.org/api/drupal/developer--hooks--core.php/function/hook_menu/6
*/
function example_module_menu() {
  $items = array();

  $items['my_custom_callback/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'my_custom_php_function', 
    'page arguments' => array(1),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );

  return $items;
}

/**
* Function that gets called from JQuery asynchronously. 
*/
function my_custom_php_function($argument) {
  // Do something with $argument...
  echo $argument;
}

?>

Если вы хотите передать несколько переменных из JQuery в Drupal / PHP,Вы можете рассмотреть возможность их JSON-преобразования в JavaScript, прежде чем передавать его в PHP.Помните, что если полезная нагрузка очень велика, вы должны рассмотреть JQuery .post () вместо .get ().Функции PHP для декодирования JSON: здесь, на php.net .

Не забудьте вернуть $ items в конце функции example_module_menu ().Если вы хотите передать два или более аргумента из JavaScript в PHP, тогда пункт меню будет выглядеть примерно так:

function example_module_menu() {
  $items = array();

  $items['my_custom_callback/%/%/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'my_custom_php_function', 
    'page arguments' => array(1, 2, 3),
    'access arguments' => array('access content'), 
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function my_custom_php_function($arg1, $arg2, $arg3) {
  // Do something ...
  $sum = $arg2 + $arg3;

  echo "Hi". $arg1 .", X + Z = ". $sum;
}

?>

В этом случае я передаю три аргумента в PHP. 'аргументы страницы' указывает часть URL, которую вы хотите передать в PHP.Если бы вы написали 'page arguments' => array(0),, то аргументом для вашей функции PHP была бы строка my_custom_callback .


2) Вызовите ловушку меню из вашего кода JS с помощью JQuery.JQuery предоставляет различные методы AJAX.Какой из них вы будете использовать, зависит, среди прочего, от формата данных, с которыми вы имеете дело, и их размера.

Скорее всего, вы будете использовать один из двух методов JQuery. .post () или .get () , принимая во внимание, что эти почтовые запросы позволят получить большую полезную нагрузку данных, чем запросы.Поэтому, если размер переменной x = 10, вы можете придерживаться .get ().Оба метода .post () и .get () являются расширением или основаны на методе .ajax () .Метод .ajax () является более гибким, поскольку предоставляет вам больше возможностей, таких как возможность указать формат данных (JSON или обычный текст), отправить имя пользователя / пароль вместе с вашим запросом, выбрать между синхронным или асинхроннымзапросов и должен ли браузер кэшировать запрос или нет.

Это сигнатура метода для метода JQuery .get ():

jQuery.get( url, [ data ], [ callback(data, textStatus, XMLHttpRequest) ], [ dataType ] )

Если высобирались отправить ваши данные с помощью GET в Drupal / PHP, используя приведенный выше пример, вы могли бы сделать что-то вроде этого:

    <script type='text/javascript'>
    var name = 'alexander';  
    var x = 10;
    var z = 20;

    $.get( 
      // Callback URL.
      "http://www.alexanderallen.name/my_custom_callback/"+ name +"/"+ x +"/"+ z
    );

    </script>

Обратите внимание, что использование аргумента данных в методе .get () является необязательным.и в моем примере я пропустил его, но достиг того же эффекта, объединив данные для передачи в Drupal / PHP с остальной частью URL.

Если бы я запустил это, запрос HTTP GET выглядел быкак:

<a href="http://www.alexanderallen.name/my_custom_callback/alexander/10/20" rel="noreferrer">http://www.alexanderallen.name/my_custom_callback/alexander/10/20</a>

и ответ будет выглядеть так:

Hi Alexander, X + Z = 30

Передача данных из Drupal в JavaScript

Для этого вы должны использовать Behaviors, я не буду вдаваться в подробности, так как я думаю, что это не ваш вопрос, но вы можете перейти к официальной документации по поведению Drupal 6 здесь .

4 голосов
/ 29 января 2011

Вам необходимо знать:

API меню:
http://api.drupal.org/api/drupal/includes--menu.inc/group/menu/7
Некоторые функции Drupal JSON (возможно)
http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_json_encode/7
variable_set ()
http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/variable_set/7
и API jQuery ajax:
http://api.jquery.com/category/ajax/

По сути, вам нужносоздать пункт меню, который делегирует к обратному вызову (будьте осторожны с вашими разрешениями), а затем вызовите его с помощью $ .ajax ().Если вам нужно что-то сделать с ответом, обратитесь к функциональности json_encode.

Возможно, вы захотите взглянуть здесь на несколько примеров меню:
http://drupal.org/project/examples

Я думаю, что есть интерфейс Drupal с jQuery ajax API.Возможно, кто-то может прокомментировать, если они знают лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...