Frage

i bin neu Drupal und drupal6 mit .. Ich habe ein Modul, das eine Reihe von Mitarbeiterdaten aus der Datenbank holt auf Basis einen Eingang fields.The Submit-Button ruft eine JavaScript-Funktion in einem emp.js Datei, die einen ajax-Aufruf erzeugt

 xmlHttpReq.open('GET', "/empfinder.json&dept=" + dept + "&gender=" + gen+ "&age=" + age, true);

, während ich versuche, Pager zu verwenden, um es direkt wie unten und zeigt in einer neuen Seite machen nennen.

http://156.23.12.14/empfinder.json?page=1&dept=ACC&gender=Male&age=34

Ich brauche die Ergebnisse in derselben Seite angezeigt werden soll. Wie soll Pageranruf ändern, dies zu tun?

War es hilfreich?

Lösung

Sie sollten Ihr Leben einfacher, indem Sie die jquery Utility-Funktionen, wenn Anfragen AJAX tun, anstatt sie zu tun ‚selbst‘. Die Bibliothek wird in jquery Drupal Kern (zumindest für Drupal 6) enthalten. Wie für die Dokumentation, die Sie diesen Beitrag auf Ajax in Drupal mit jQuery beginnen könnte.

Andere Tipps

habe ich einen Blog zu diesem Thema JS mit AJAX und PHP und hat es unten eingefügt.

JS mit AJAX und PHP

Drupal hat umfangreiche Unterstützung für JS und AJAX als Teil seiner Standardformulare und es gibt Tutorials, die erklären, wie das funktioniert. Allerdings konnte ich nicht ein gutes Tutorial zu erklären finden, wie Javascript mit einem Drupal-Modul in einer Ad-hoc-Mode kommunizieren kann. Zum Beispiel wollte ich jede beliebige HTML zu ändern, um die Lage sein, auf Basis von Statusinformationen in der PHP. Diese Technik ist im folgenden dargestellt.

Sie werden am Anfang der Seite zu sehen sind Registerkarten, die in diesem Thema standardmäßig sind eher schlicht. Ich wollte sie, so dass die aktuell ausgewählte Registerkarte ändern würde mehr abheben. Natürlich ist dies nur mit CSS getan werden könnte, aber ich wollte diese Technik für die Fälle entwickeln, wo CSS allein nicht ausreichen würde.

Im Folgenden finden Sie die JS, die direkt auf die JS-Datei zuvor beschriebenen hinzugefügt werden können. Es gibt eine jQuery-Funktion, die ‚Hauptmenü-Links‘ mit der ID auf dem Element arbeitet jedes Mal, wenn die Seite geladen ist und bereit ist. Ich erhalte die innerHTML- und verwenden encodeURIComponent es in eine sichere Zeichenfolge zu konvertieren, der als URL-Parameter übergeben werden kann. Ich hatte dies zu tun, weil eine der Registerkarten eine URL verweist, die einen Parameter übergibt.

  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);
  });

Die jQuery Funktion endet loadXMLDoc Aufruf, die ist, wo das Post AJAX Ort Angabe der URL erfolgt, die durch die hook_menu im Drupal Modul erfasst wird. Es verwendet auch eine Callback-Funktion, die in dem Parameter cfunc geben wird. Nach der Rückkehr wird die JSON-Antwort analysiert es in HTML zu konvertieren und diese direkt wieder auf den ursprünglichen innerHTML- gespeichert. So was auch immer das PHP-Modul in dem HTML-tat ersetzt den ursprünglichen HTML.

Auf der PHP-Seite befindet sich das erste Feldelement des hook_menu:

  $items['flashum_status/get_menu_tabs'] = array(
    'page callback'     => 'get_menu_tabs',
    'access arguments' => array('access flashum status'),
    'type' => MENU_CALLBACK,
  );

Die Callback-Funktion wird dann weiter unten. Er zieht zunächst die Blockparameter aus und lädt sie in ein DOM-Objekt, so dass es analysiert werden kann. Die simple_html_dom Aufgabe wird durch das simplehtmldom Modul geliefert, das Sie installieren und aktivieren müssen. Vergessen Sie nicht, auch die dazugehörige Bibliothek zu installieren. Dies sollte in /all/libraries/simplehtmldom/simple_html_dom.php enden.

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));
   }
}

Schließlich Schleifen es durch die li Artikel Hinzufügen eines Inline-CSS-Stil, ob die Registerkarte aktiv ist oder nicht ändert. Dann schafft es nur eine Zeichenfolge aus dem DOM-Objekt und gibt es über drupal_json_output, die es zu JSON-Format umwandelt. Dies ist natürlich in der JS-Callback-Funktion empfangen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top