Как выполнить ajax-вызов из drupal-пейджера
Вопрос
я новичок в drupal и использую drupal6..у меня есть модуль, который извлекает набор сведений о сотруднике из базы данных на основе полей ввода.Кнопка отправить вызывает Функция JavaScript в emp.js файл, который генерирует ajax-вызов
xmlHttpReq.open('GET', "/empfinder.json&dept=" + dept + "&gender=" + gen+ "&age=" + age, true);
пока я пытаюсь использовать пейджер, он напрямую вызывает вызов, как показано ниже, и отображается на новой странице.
http://156.23.12.14/empfinder.json?page=1&dept=ACC&gender=Male&age=34
мне нужно отобразить результаты на той же странице.Как следует изменить вызов пейджера, чтобы сделать это?
Решение
Вы должны облегчить себе жизнь, используя служебные функции jquery при выполнении AJAX-запросов вместо того, чтобы выполнять их "самостоятельно".Библиотека jquery включена в ядро Drupal (по крайней мере, для Drupal 6).Что касается документации, вы могли бы начать с этот пост посвящен Ajax в Drupal с использованием jQuery.
Другие советы
Я вел блог на эту тему JS с AJAX и PHP и приклеили его ниже.
JS с AJAX и PHP
Drupal имеет обширную поддержку JS и AJAX как части своих стандартных форм, и есть учебные пособия, объясняющие, как это работает.Однако я не смог найти хорошего руководства, объясняющего, как Javascript может взаимодействовать с модулем Drupal специальным образом.Например, я хотел иметь возможность изменять любой произвольный html-код на основе информации о состоянии, доступной в PHP.Этот метод представлен ниже.
Вы увидите в верхней части этой страницы вкладки, которые по умолчанию в этой теме довольно простые.Я хотел изменить их таким образом, чтобы текущая выбранная вкладка выделялась больше.Конечно, это можно было бы сделать с помощью только CSS, но я хотел разработать эту технику для случаев, когда одного CSS было бы недостаточно.
Ниже приведен JS, который можно добавить непосредственно в JS-файл, описанный ранее.Существует функция jQuery, которая работает с элементом с идентификатором "главное меню-ссылки" каждый раз, когда страница загружена и готова.Я получаю innerHTML и использую encodeURIComponent для преобразования его в безопасную строку, которая может быть передана в качестве параметра URL.Мне пришлось сделать это, потому что одна из вкладок ссылается на URL, который передает параметр.
var xmlhttp;
var childnodes;
// Send post to specified url
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=cfunc;
// alert("loadXMLDoc: " + url);
xmlhttp.open("POST",url,true);
xmlhttp.send();
}
// AJAX redirect to camr_custom/getvisits with callback function to replace the href
// with something to disable the link for nodes that have not been visited.
function getMenuTabs(str)
{
loadXMLDoc("?q=flashum_status/get_menu_tabs&block="+str,function()
{
// alert("getMenuTabs status: " + xmlhttp.status + " readyState: " + xmlhttp.readyState);
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// alert("getMenuTabs: " + xmlhttp.responseText);
data= jQuery.parseJSON('['+xmlhttp.responseText+']')
$.each(data,function(){
// alert(this['block']);
document.getElementById("main-menu-links").innerHTML = this['block'];
});
}
});
}
// Locate book navigation block and send innerHTML to PHP module
$('#main-menu-links').ready(function() {
lis = document.getElementById("main-menu-links").innerHTML;
// alert("main-menu-links: " + lis);
// safe encode this block so that it can contain arbitrary urls in the href links
lis = encodeURIComponent(lis);
getMenuTabs(lis);
});
Функция jQuery в конечном итоге вызывает loadXMLDoc, где выполняется AJAX post с указанием URL-адреса, который фиксируется hook_menu в модуле Drupal.Он также использует функцию обратного вызова, которая передается в параметре cfunc .По возвращении ответ JSON анализируется, чтобы преобразовать его в HTML, и он сохраняется непосредственно обратно в исходный innerHTML.Таким образом, что бы модуль PHP ни делал с HTML, он заменяет исходный HTML.
На стороне PHP сначала есть элемент массива hook_menu:
$items['flashum_status/get_menu_tabs'] = array(
'page callback' => 'get_menu_tabs',
'access arguments' => array('access flashum status'),
'type' => MENU_CALLBACK,
);
Затем функция обратного вызова показана ниже.Сначала он извлекает параметр block и загружает его в DOM-объект, чтобы его можно было проанализировать.Объект simple_html_dom предоставляется модулем simplehtmldom, который вам нужно будет установить и включить.Не забудьте также установить соответствующую библиотеку.Это должно закончиться в /all/libraries/simplehtmldom/simple_html_dom.php .
function get_menu_tabs() {
// drupal_set_message(t("get_menu_tabs: @code", array('@code' => print_r(null, TRUE))));
if (array_key_exists ('block', $_GET)) {
$block = $_GET['block'];
// drupal_set_message(t("get_menu_tabs block: @code", array('@code' => print_r($block, TRUE))));
// Create a DOM object.
$html_obj = new simple_html_dom();
// Load HTML from a string.
$html_obj->load($block);
// remove href for nodes not yet visited
$index = 0;
foreach ($html_obj->find('li') as $li ) {
$start = strpos($li->innertext, 'href');
$end = strpos($li->innertext, '>', $start);
$start_html = substr($li->innertext, 0, $end);
$end_html = substr($li->innertext, $end);
if (strpos($li->innertext, 'active')) {
$li->innertext = $start_html.' style="color:red;border: solid red;margin-left:5px;margin-right:5px;"'.$end_html;
// drupal_set_message(t("get_menu_tabs html_obj: @code", array('@code' => print_r($li->innertext, TRUE))));
}
else
$li->innertext = $start_html.' style="color:black;border: solid #777;"'.$end_html;
$index++;
}
$str = $html_obj->save();
// drupal_set_message(t("get_menu_tabs str: @code", array('@code' => print_r($str, TRUE))));
// Release resources to avoid memory leak in some versions.
$html_obj->clear();
unset($html_obj);
return drupal_json_output(array('block'=>$str));
}
}
Наконец, он перебирает элементы li, добавляя встроенный CSS-стиль, который меняется в зависимости от того, активна вкладка или нет.Затем он просто создает строку из объекта DOM и возвращает ее через drupal_json_output, который преобразует ее в формат JSON.Это, конечно, получается в функции обратного вызова JS.