suggested search

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
McHubi
Beiträge: 1080
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

suggested search

Beitrag von McHubi » Do 19. Mai 2016, 17:14

Hallo zusammen,

brauche mal eure Hilfe, stehe auf dem Schlauch. Für sich allein genommen funktioniert das alles hier:

index.html, livesearch.php und links.xml in ein Verzeichnis und dann die index.html aufrufen.

Die Inhalte:
index.html

Code: Alles auswählen

<html>
<head>
<script>
function showResult(str) {
  if (str.length==0) {
    document.getElementById("livesearch").innerHTML="";
    document.getElementById("livesearch").style.border="0px";
    return;
  }
  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=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
      document.getElementById("livesearch").innerHTML=xmlhttp.responseText;
      document.getElementById("livesearch").style.border="1px solid #A5ACB2";
    }
  }
  xmlhttp.open("GET","livesearch.php?q="+str,true);
  xmlhttp.send();
}
</script>
</head>
<body>

<form>
<input type="text" size="30" onkeyup="showResult(this.value)">
<div id="livesearch"></div>
</form>

</body>
</html>
livesearch.php

Code: Alles auswählen

<?php
$xmlDoc=new DOMDocument();
$xmlDoc->load("links.xml");

$x=$xmlDoc->getElementsByTagName('link');

//get the q parameter from URL
$q=htmlspecialchars(strip_tags($_GET["q"]));

//lookup all links from the xml file if length of q>0
if (strlen($q)>0) {
  $hint="";
  for($i=0; $i<($x->length); $i++) {
    $y=$x->item($i)->getElementsByTagName('title');
    $z=$x->item($i)->getElementsByTagName('url');
    if ($y->item(0)->nodeType==1) {
      //find a link matching the search text
      if (stristr($y->item(0)->childNodes->item(0)->nodeValue,$q)) {
        if ($hint=="") {
          $hint="<a href='" .
          $z->item(0)->childNodes->item(0)->nodeValue .
          "' target='_blank'>" .
          $y->item(0)->childNodes->item(0)->nodeValue . "</a>";
        } else {
          $hint=$hint . "<br /><a href='" .
          $z->item(0)->childNodes->item(0)->nodeValue .
          "' target='_blank'>" .
          $y->item(0)->childNodes->item(0)->nodeValue . "</a>";
        }
      }
    }
  }
}

// Set output to "no suggestion" if no hint was found
// or to the correct values
if ($hint=="") {
  $response="no suggestion";
} else {
  $response=$hint;
}

//output the response
echo $response;
?>
links.xml

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
<pages>
  <link>
    <title>HTML a tag</title>
    <url>http://www.w3schools.com/tags/tag_a.asp</url>
  </link>
  <link>
    <title>HTML br tag</title>
    <url>http://www.w3schools.com/tags/tag_br.asp</url>
  </link>
  <link>
    <title>CSS background Property</title>
    <url>http://www.w3schools.com/cssref/css3_pr_background.asp</url>
  </link>
  <link>
    <title>CSS border Property</title>
    <url>http://www.w3schools.com/cssref/pr_border.asp</url>
  </link>
  <link>
    <title>JavaScript Date Object</title>
    <url>http://www.w3schools.com/jsref/jsref_obj_date.asp</url>
  </link>
  <link>
    <title>JavaScript Array Object</title>
    <url>http://www.w3schools.com/jsref/jsref_obj_array.asp</url>
  </link>
</pages>
Der Code stammt von http://www.w3schools.com/php/php_ajax_livesearch.asp

Ich bekomme es aber um's Verrecken nicht hin, das Ganze in ein Modul zu packen. Das Ganze sieht so aus:
output

Code: Alles auswählen

<form>
<input type="text" size="30" onkeyup="showResult(this.value)">
<div id="livesearch"></div>
</form>
modul.js

Code: Alles auswählen

function showResult(str) {
  if (str.length==0) {
    document.getElementById("livesearch").innerHTML="";
    document.getElementById("livesearch").style.border="0px";
    return;
  }
  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=function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
      document.getElementById("livesearch").innerHTML=xmlhttp.responseText;
      document.getElementById("livesearch").style.border="1px solid #A5ACB2";
    }
  }
  xmlhttp.open("GET","livesearch.php?q="+str,true);
  xmlhttp.send();
}
Soweit, so gut. Nur, wo lege ich die Dateien links.xml und livesearch.php ab und wie integriere ich die dann? per cInclude('module','livesearch.php')? Ich komm net weiter, mir fehlt da der Ansatz, wie diese beiden Dateien entweder direkt im Modul integriert werden können oder wie sie entsprechend innerhalb von Contenido genutzt werden können... :?

Danke für eure Hilfe! :D
Zuletzt geändert von McHubi am Fr 20. Mai 2016, 07:51, insgesamt 1-mal geändert.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

(NEU!) Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

homtata
Beiträge: 1018
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: suggested search

Beitrag von homtata » Do 19. Mai 2016, 18:05

Heyho,
wenn ich das richtig interpretiere, dann musst du livesearch.php überhaupt nicht inludieren - das JS ruft das selbständig auf und verarbeitet es.
Ich vermute mal, dass ohne weitere Pfadangaben die beiden Dateien einfach nach /cms müssen.
Bei aktiviertem AMR könnte es noch daran hängen, dass die beiden Dateien explizit in der htaccess vom Umschreiben ausgenommen werden müssen.
Soweit mal erste Denkansätze, vielleicht hilfts ja weiter...

Faar
Beiträge: 1461
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: suggested search

Beitrag von Faar » Do 19. Mai 2016, 18:21

Hi, der Pfad im Javascript steht hier:

Code: Alles auswählen

xmlhttp.open("GET","livesearch.php?q="+str,true);
Ohne alles wird livesearch.php aufgerufen, also muss es hier neben dem Script liegen.
Scripte im Modul liegen aber meistens in /js
Da musst du schauen, welcher Pfad für die Ausführung des Codes gerade gültig ist und wo du dann hin musst.
Manchmal hilft ein ../
Oder du baust mit PHP den Contenido-Modul-Pfad ins Script ein.

Hier in etwa das Gleiche:

Code: Alles auswählen

$xmlDoc->load("links.xml");
Wo steht das xml und wie kommst du vom ausführenden Prozess dahin?
Bei Contenido ist es meistens im Mandantenverzeichnis, aber manchmal steht da auch so ein /cms dazwischen.
Mit ./ oder ../ kommt man oft weiter, wenn sowas wie /data/modules/modulname/js/ nicht ausreicht.

Die Pfadfuchserei kann manchmal ganz schön nerven, wenn man nicht genau weiß, in welcher Ebene das Script läuft und wie man an die Quelle kommt.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1461
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: suggested search

Beitrag von Faar » Do 19. Mai 2016, 18:27

homtata hat geschrieben:Heyho,
wenn ich das richtig interpretiere, dann musst du livesearch.php überhaupt nicht inludieren - das JS ruft das selbständig auf und verarbeitet es.
Ich vermute mal, dass ohne weitere Pfadangaben die beiden Dateien einfach nach /cms müssen.
Das JS vermutet den Pfad im gleichen Verzeichnis, aber das ist bei Contenido anders, denn der Modulcode wird im Verzeichnis von front_content.php ausgeführt.
Und falls es ein 4.9 Modul ist, liegt das von da aus gesehen tief im Modulpfad drin.
Bei aktiviertem AMR könnte es noch daran hängen, dass die beiden Dateien explizit in der htaccess vom Umschreiben ausgenommen werden müssen.
Eigentlich nicht, denn das AMR-htaccess blcokiert nur Anfragen von außen, aber wenn man den Serverpfad beziehungsweise den relativen Pfad nimmt, juckt das nicht.
Nur den jeweils richtigen Pfad zu finden ist manchmal nicht ganz ohne, besonders wenn ein /cms vom .htaccess weg retuschiert wird.
Aber da muss man dann probieren.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

McHubi
Beiträge: 1080
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: suggested search

Beitrag von McHubi » Do 19. Mai 2016, 20:24

Hi Leuts!

Danke euch!
Ich vermute mal, dass ohne weitere Pfadangaben die beiden Dateien einfach nach /cms müssen.
Das JS vermutet den Pfad im gleichen Verzeichnis, aber das ist bei Contenido anders, denn der Modulcode wird im Verzeichnis von front_content.php ausgeführt.
Genau das ist mir auf dem Heimweg auf der Treppe zur Tiefgarage dann auch aus den Synapsen gefallen. Eben schnell getestet: Es läuft, wenn die link.xml und livesearch.php in /cms liegen. Morgen probiere ich dann die beiden sauberer im Modulverzeichnis selbst unterzubringen.
Die Pfadfuchserei kann manchmal ganz schön nerven, wenn man nicht genau weiß, in welcher Ebene das Script läuft und wie man an die Quelle kommt.
Ja, die Theorie und die oft nicht ganz passenden Resultate... :mrgreen:
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

(NEU!) Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

McHubi
Beiträge: 1080
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: suggested search

Beitrag von McHubi » Fr 20. Mai 2016, 07:51

Guten Morgen!

Die Pfade... Das Ganze klappt, solange die beiden Dateien links.xml und livesearch.php im Verzeichnis cms liegen. Dass ich mich genau in diesem Ordner befinde, wird mir per getcwd(); in der Modulausgabe bestätigt. In der besagten Theorie sollte es also möglich sein, die in den Unterordner des Moduls verschobenen Dateien bei Anpassung des Pfads, ausgehend vom Ordner cms nach wie vor aufzurufen. Sprich,
1) verschieben der Dateien in root/cms/data/modules/meinmodul
2) Anpassen des Pfads in der livesearch.php auf

Code: Alles auswählen

$xmlDoc->load("data/modules/meinmodul/links.xml");
3) Anpassen des Pfads im Javascript auf

Code: Alles auswählen

xmlhttp.open("GET","data/modules/meinmodul/livesearch.php?q="+str,true);
Funktioniert aber nicht. Es passiert "nichts".

Probleme also mit den Verzeichnisberechtigungen? Ich würde sagen nein:
cms: 755
data: 755
modules: 775
meinmodul: 775

Habe mir dann mal die Dateien einzeln vorgenommen und nur die links.xml in root/cms/data/modules/meinmodul geschoben. Die livesearch.php blieb im Ordner cms. Passende Pfade also:
livesearch.php:

Code: Alles auswählen

$xmlDoc->load("data/modules/meinmodul/links.xml");
Javascript:

Code: Alles auswählen

xmlhttp.open("GET","livesearch.php?q="+str,true);
:arrow: funktioniert!

Es hapert also lediglich am Speicherort der livesearch.php. Die will nicht geöffnet werden, sobald sie sich in einem Unterordner von cms befindet. :roll:
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

(NEU!) Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Faar
Beiträge: 1461
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: suggested search

Beitrag von Faar » Fr 20. Mai 2016, 08:01

Probier mal auch ./ und ../ aus.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

McHubi
Beiträge: 1080
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: suggested search

Beitrag von McHubi » Fr 20. Mai 2016, 08:36

Das hab ich auch schon in diversen Kombinationen durch. Sinn machen letztlich ja nur, als Pfad von cms ausgehend, diese Varianten:

Code: Alles auswählen

xmlhttp.open("GET","data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","/data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","./data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","localhost/cms/data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","http://localhost/cms/data/modules/meinmodul/livesearch.php?q="+str,true);
Bringt alles nichts. Habe selbst die / mal spaßeshalber durch \ ersetzt... :?

Und wenn man bedenkt, dass das JS im Ordner js liegt, könnte man noch

Code: Alles auswählen

xmlhttp.open("GET","../livesearch.php?q="+str,true);
nehmen. Was aber Unsinn ist, denn laut getcwd(); sind wir ja im Ordner cms und nicht js.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

(NEU!) Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Faar
Beiträge: 1461
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: suggested search

Beitrag von Faar » Fr 20. Mai 2016, 09:22

Das solltest du mal probieren, das hattest du noch nicht:

Code: Alles auswählen

xmlhttp.open("GET","../data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","../cms/data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","/cms/data/modules/meinmodul/livesearch.php?q="+str,true);
xmlhttp.open("GET","cms/data/modules/meinmodul/livesearch.php?q="+str,true);
Es ist manchmal wie verhext.

Edit:
Mir wurde gerade von einem freundlichen älteren Herrn :P mitgeteilt, dass es sich hier ja auch um eine Ajax Abfrage handeln würde und diese würde dann ja doch von .htaccess geblockt werden.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Antworten