AJAX Live Search

Hallo ich hab mir ne kleine AJAX Live Search zusammengebaut, was soweit auch funktioniert, nur leider nicht wenn man sich in Kategorien oder auf Content Seiten befindet.

Hier mal der Code: ( die Datei liegt in out/template/src/ )

function searchFor(suchbegriff) {
	var xmlHttp = null;
	// Mozilla, Opera, Safari sowie Internet Explorer 7
	if (typeof XMLHttpRequest != 'undefined') {
		xmlHttp = new XMLHttpRequest();
	}
	if (!xmlHttp) {
		// Internet Explorer 6 und älter
		try {
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {
				xmlHttp = null;
			}
		}
	}
	// Wenn das Objekt erfolgreich erzeugt wurde
	if (xmlHttp) {
		var url = "ajaxlivesearch.php";
		var params = "suchbegriff=" + suchbegriff;

		xmlHttp.open("POST", url, true);

		// Headerinformationen für den POST Request
		xmlHttp.setRequestHeader("Content-type",
				"application/x-www-form-urlencoded");
		xmlHttp.setRequestHeader("Content-length", params.length);
		xmlHttp.setRequestHeader("Connection", "close");

		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 4) {
				// Zurückgeliefertes Ergebnis wird in den DIV "ergebnis"
				// geschrieben
				if (xmlHttp.responseText.length > 2) {
					document.getElementById("ergebnis").style.visibility = "visible";
					document.getElementById("ergebnis").innerHTML = xmlHttp.responseText;
				} else {
					document.getElementById("ergebnis").style.visibility = "hidden";
				}
			}
		};
		xmlHttp.send(params);
	}
}

Ich habe da ja var = ajaxlivesearch.php
das klappt auch wenn ich auf der Startseite bin aber wenn ich zum Beispiel in einer Kategorie bin kommt folgendes:

Die angeforderte Seite ‘DVD-oxid/ajaxlivesearch.php/’ konnte nicht gefunden werden.

Wie umgeh ich diesen Fehler??
Danke schon mal für Hilfe…

Gruß Gruß

du musst den fixen urlpfad angeben. also “http://meinshop.de/ajaxlivesearch.php”. sollte aber auch “/ajaxlivesearch.php” gehen. Und übrigens: Bei oxid ist Jquery dabei, da ist der ajax request vllt ein 5zeiler :wink:

Alles klar, danke!

Nächstes Problem :

Nun habe ich ja noch eine PHP Datei dazu für den Datenbank Zugriff…klappt auch soweit, nur wie komm ich an die URL der Produkte ? kann ja mit der datei nicht auf die oxarticle Klasse zugreifen und mir die ausspucken lassen…

	// Server Verbindung herstellen
	mysql_connect($db['server'], $db['user'], $db['pass']) or
	die ("Keine Verbindung moeglich");

	// Datenbank Verbidung
	mysql_select_db($db['name']) or
	die ("Die Datenbank existiert nicht");

	$tabelle = "oxarticles";
	$searchString = explode(" ", $_POST['suchbegriff']);
	$sWhere = "";
	foreach($searchString as $s) {
		if($sWhere != "") {
			$sWhere .= " AND ";
		}
		$sWhere .= " OXTITLE LIKE ('%".mysql_real_escape_string(utf8_decode($s))."%') ";
	}
	$sql = "SELECT * FROM ".$tabelle." WHERE ".$sWhere." LIMIT 0,5";
	$result = mysql_query($sql);
	echo "<strong>Sie suchten nach: ".$_POST["suchbegriff"]."</strong><br/><br/>";
	while($row = mysql_fetch_object($result)){
		echo utf8_encode($row->OXTITLE);
		echo "<br/>";
	}

Ist bisher nur so zum testen…

mach doch nen eigenen view dafür. nennste highknee_ajaxlivesearch.php und nutzt dann folgende url:

/index.php?cl=highknee_ajaxlivesearch.

die klasse hat nix ausser ne render methode und gibt direkt einfach das xml aus. was übrigens für eine livesuche die viele daten zurückliefern kann einen enormen overhead produziert, was die suche unnötig langsam machen wird.

[QUOTE=csimon;29172]Und übrigens: Bei oxid ist Jquery dabei, da ist der ajax request vllt ein 5zeiler ;)[/QUOTE]
Ist mir auch schon aufgefallen…

Konnte aber bisher noch keine Stelle im Shop finden, wo das auch verwendet wird…

Habe ich da was übersehen?

Aber die integrierte Version jQuery 1.2.6 ist eh’ schon so überaltert, dass sie stinkt…

Die aktuelle jQuery-Version 1.4.1 hat einige funktionelle Verbesserungen und (teilweise dramatische) Geschwindigkeitsverbesserungen zu bieten, man sollte also auf jeden Fall die aktuellen Versionen verwenden.

Machst du einen eintrag “tweak” im bugtracker oder soll ich? Seh ich nämlich auch so.

Ich sag erstmal, vielen Dank…Habs noch nicht ausprobiert, aber hört sich gut an!

[QUOTE=csimon;29184]mach doch nen eigenen view dafür. nennste highknee_ajaxlivesearch.php und nutzt dann folgende url:

/index.php?cl=highknee_ajaxlivesearch.

die klasse hat nix ausser ne render methode und gibt direkt einfach das xml aus. was übrigens für eine livesuche die viele daten zurückliefern kann einen enormen overhead produziert, was die suche unnötig langsam machen wird.[/QUOTE]

Warum soll er seine php durch die index.php und alles dranhängende pipen? Besser ist es, die eine php direkt anzusprechen, ohne den Umweg über Oxid.

Hmm, das ist irgendwie komisch.
Habs jetzt so mal probiert…

class Ajaxlivesearch extends oxUBase
{
    protected $_sThisTemplate = 'ajaxlivesearch.tpl';

    public function render()
    {
        parent::render();
        return $this->_sThisTemplate;
    }

}

In die ajaxlivesearch.tpl folgendes geschrieben zum testen:

VIEW KLASSEN TEST

Wenn ich jetzt den link

http://localhost/webshop/index.php?cl=ajaxlivesearch
kommt auch genau der Inhalt.

Aber bei meiner Live Search baut er eine komplette Seite quasi in dem Div auf also nicht nur

VIEW KLASSEN TEST

Wodran könnte das liegen ?

[QUOTE=highknee88;29232]Hmm, das ist irgendwie komisch.
Habs jetzt so mal probiert…

class Ajaxlivesearch extends oxUBase
{
    protected $_sThisTemplate = 'ajaxlivesearch.tpl';

    public function render()
    {
        parent::render();
        return $this->_sThisTemplate;
    }

}

In die ajaxlivesearch.tpl folgendes geschrieben zum testen:

VIEW KLASSEN TEST

Wenn ich jetzt den link kommt auch genau der Inhalt.

Aber bei meiner Live Search baut er eine komplette Seite quasi in dem Div auf also nicht nur

Wodran könnte das liegen ?[/QUOTE]
Mit " parent::render();" baust Du die normale Seite auf…

Du musst die Methode “render” überladen…

Warum soll er seine php durch die index.php und alles dranhängende pipen? Besser ist es, die eine php direkt anzusprechen, ohne den Umweg über OXID.

Weil er dann entweder das framework so initialisieren müsste, was denselben effekt hat wies gleich in einem view zu machen oder er alle querys etc selber schreiben müsste und den ganzen kram unabhängig vom shop würde warten müssen. und so kann er die oxid funktionen nutzen, ohne das framework zu initialisieren würd er sich da doppelte arbeit machen.

Übrigens: Ich würde das nicht über ein template machen sondern so:


    public function render() {
          // deine abfrage etc.pp
          header('Content-type: text/xml');
          echo $xml;
          exit;
    }

dann wird smarty wenigstens nicht angeschmissen.

Wenn ich das wegnehme, ändert das aber nicht. Und wenn ich sie per Link normal aufrufe kommt die restliche Seite ja auch irgendwie nicht…

[QUOTE=csimon;29237]Weil er dann entweder das framework so initialisieren müsste, was denselben effekt hat wies gleich in einem view zu machen oder er alle querys etc selber schreiben müsste und den ganzen kram unabhängig vom shop würde warten müssen. [/QUOTE]

Ich hatte es so verstanden, dass es um die Population einer Vorschlagsliste für das Suchfeld geht. Das muß ja auch fix gehen, da ist ein direkter Zugriff auf mySQL einfach schneller, und die ganzen Framework-Komponenten brauchts ja nicht, wenn zB nur nach OXARTNUM, OXTITLE, OXSEARCHKEYS etc. geschaut werden soll.

Gebe zu, daß man sich dann noch um die Umschaltung auf OXTITEL_X usw. kümmern müßte, sofern man in den anderen Sprachen auch andere Daten hierfür hat.

Bis das Oxid-Framework eine Antwort liefert, vergehen für wirkliche Live-Search mMn zuviele Millisekunden.

Gruß,
Achim

PS: Bin aber gespannt, ob es auch mit Eurem Ansatz geht.

Ja nur komm ich dann ja irgendwie nicht auf die OXSEO Url für die Artikel die gefunden werden…was ja schon recht hilfreich ist :wink: Außer ich bau die ganze seo encoder geschichte nach…

Aber bisher funktioniert das leider nicht mit der View :frowning:

Ich hab auch nicht wirklich das gefühl dass er die funktion render() in dem Fall aufruft, weil einfach die Startseite nochmal aufgebaut wird in dem DIV…

[QUOTE=highknee88;29241]Ja nur komm ich dann ja irgendwie nicht auf die OXSEO Url für die Artikel die gefunden werden…was ja schon recht hilfreich ist :wink: Außer ich bau die ganze seo encoder geschichte nach([/QUOTE]

Muß es die SEO-Url sein? Mit

http://deinedomain.de/index.php?cl=details&anid=[hier die OXID ranhängen]

geht auch direkt auf das Produkt.

[QUOTE=highknee88;29232]
Wenn ich jetzt den link kommt auch genau der Inhalt.
Aber bei meiner Live Search baut er eine komplette Seite quasi in dem Div auf also nicht nur
Wodran könnte das liegen ?[/QUOTE]
Das dürfte daran liegen dass per Ajax nicht derselbe Link aufgerufen wird. Im Fehlerfall lädt Oxid immer die Startseite.

Kann es sein, dass man irgendwo einstellen muss, dass er “Nicht-SeoUrls” zulassen darf ?