Как сделать AJAX-вызов с Drupal-пейджера - PullRequest
1 голос
/ 03 декабря 2009

Я новичок в 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

Мне нужно отобразить результаты на той же странице. Как модифицировать вызов пейджера для этого?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2009

Вы должны упростить свою жизнь, используя вспомогательные функции jquery при выполнении запросов AJAX, а не «сами». Библиотека jquery включена в ядро ​​Drupal (по крайней мере, для Drupal 6). Что касается документации, вы можете начать с этого поста на Ajax в Drupal, используя jQuery .

0 голосов
/ 03 апреля 2014

Я сделал блог на эту тему JS с AJAX и PHP и вставил его ниже.

JS с AJAX и PHP

Drupal имеет обширную поддержку JS и AJAX как часть его стандартных форм, и есть учебники, которые объясняют, как это работает. Тем не менее, я не смог найти хороший учебник, чтобы объяснить, как Javascript может взаимодействовать с модулем Drupal специальным образом. Например, я хотел иметь возможность изменять любой произвольный HTML на основе информации о состоянии, доступной в PHP. Эта техника представлена ​​ниже.

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

Ниже приведен JS, который можно добавить непосредственно в файл JS, описанный ранее. Существует функция jQuery, которая работает с элементом с id 'main-menu-links' каждый раз, когда страница загружена и готова. Я получаю 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 с указанием 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,
  );

Функция обратного вызова показана ниже. Сначала он извлекает параметр блока и загружает его в объект 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.

...