Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top