Ein paar Notizen zum Thema Suche per Typo3.
Inhaltsverzeichnis
Standard Suche (nur für einsprachige Sites. auch News durchsuchbar)
Vorteile: Ist die wirklich sinnvolle Suche, denn es wird wirlich in der Datenbank gesucht. Man kann alle Tabellen und Felde angeben die man durchsuchen möchte. Funktioniert sofort ohne Probleme, und ist mit etwas Mühe vom Design her auch so anpassbar, dass auf jeder Seite das Suchfeld erscheint, mit einer Grafik für "go". Unten meiner Meinung nach die beste Zusammenstellung. Hierbei lässt man die Suchergebnisse per Forward auf einer bestimmten Seite anzeigen und lässt dabei das Suchefeld auf jener Ergebnisse-Seite per tt_content.search.30 > verschwinden.
Nachteile: Kann man bei mehrsprachigen Seiten in der Pfeife rauchen, denn es wird grundsätzlich der Seitentitel in der Standardsprache (bei uns deutsch) angezeigt. Immerhin wird aber der Content in der richtigen Sprache angezeigt und der L-Parameter wird auch ordentlich angehängt.
Lösungsweg: Man könnte die API erweitern, was von der Theorie nicht schwer wäre: Man liest die eingestellt Sprache L=1 aus der URL oder config.sys_language_uid=1 aus dem Array $GLOBALS["TSFE"] , und verwendet das Ergebnis für die Auswahl des Seitentitels. Für 0 also pages.title - und für 1 stattdessen pages_language_overlay.title . Problem aber: Die entsprechende API tslib_cObj::SEARCHRESULT() bzw. tslib_search:register_tables_and_columns() ist dermaßen kompliziert gehalten, dass eine Erweiterung leider doch NICHT in Frage kommt.
Beitrag von Markus Müller ( <info AT connect-the-web DOT de> )Eine weitere Lösungsmöglichkeit ist die zusätzliche Installation von der Extension "ch_simplesearchlocal". In dieser Extension muss man rein garnichts anpassen; ab sofort sind die Seitentitel in der anderen Sprache angezeigt (je nachdem was die Variable &L übergibt)
Standard Suche - Einstellungen
#-- ab hier CONSTANTS - Die Nr. der Zielseite searchpagePID = 80 # Wraps für nicht gefunden tt_content.search.20.noResultObj.wrap=<table width="100%" border=0 cellspacing=0 cellpadding=2><tr> | </tr></table> tt_content.search.20.noResultObj.10.wrap = <td width="95%"><p> | </p></td> tt_content.search.20.noResultObj.10.fontTag > # Wraps für gefunden - aber nur für Navigation und Titel tt_content.search.20.layout.wrap = <table border=0 width="45%" cellspacing=0 cellpadding=2><tr> | </tr></table> ###RESULT### tt_content.search.20.layout.10.wrap = <td width="100%"><p> | </p></td> tt_content.search.20.layout.10.fontTag = <p class="title"> | </p> tt_content.search.20.layout.20.wrap = <td><p> | </p></td> temp.searchbox < tt_content.search.30 temp.searchbox { type = {$searchpagePID} locationData = 1 no_cache = 1 layout = ###LABEL######FIELD### # Workaround für den FORM tag target = " style="margin-bottom : 0px; image = IMAGE image.file = fileadmin/images/suche-start.gif image.alttext = Volltext-Suche # mouseovereffekt: params.submit = onmouseover="this.src='fileadmin/images/suche-start-show.gif'" onmouseout="this.src='fileadmin/images/suche-start.gif'" params.input = class="eingabe" dataArray { 10.type = sword=input,10 20.type = scols=hidden 20.value = pages.title-subtitle-keywords-description:tt_content.header-bodytext-imagecaption 30.type = stype=hidden 30.value = L0 40.type = submit=submit } } # Am besten links direkt unter der Navigation einbinden. z. B. Nr. 700 page.700 < temp.searchbox
Standard Suche - mögliche core-Änderung für mehrsprachigkeit
mit dieser Änderung ist die mehrsprachige Standard Suche zwar nicht perfekt, aber funktioniert jedenfalls besser. Als erstens muss die ähnliche Anpassung wie bei Indexed Search - core-Änderung gemacht werden. Jedoch VOR $search->execute_query();
Siehe Datei class.tslib_content.php (Zeile 2059):
if(intval($GLOBALS['TSFE']->sys_language_uid)!=0) { $search->queryParts['SELECT']=str_replace("pages.title AS pages_title","pages_language_overlay.title as pages_title",$search->queryParts['SELECT']); $search->queryParts['SELECT']=str_replace("pages.abstract AS pages_abstract","pages_language_overlay.abstract AS pages_abstract",$search->queryParts['SELECT']); $search->queryParts['SELECT']=str_replace("pages.description AS pages_description","pages_language_overlay.description AS pages_description",$search->queryParts['SELECT']); $search->queryParts['WHERE']=$search->queryParts['WHERE']." AND pages_language_overlay.pid=pages.uid AND pages_language_overlay.sys_language_uid = '".$GLOBALS['TSFE']->sys_language_uid."' AND tt_content.sys_language_uid = '" . $GLOBALS['TSFE']->sys_language_uid . "' AND tt_content.pid = pages.uid "; }else { // nur in default suchen $search->queryParts['WHERE']=$search->queryParts['WHERE']." and tt_content.sys_language_uid = '" . $GLOBALS['TSFE']->sys_language_uid . "'"; }
anschliessend lassen wir die Suche in pages_language_overlay zu, wenn nicht default Sprache. Dazu muss die Datei class.tslib_search.php(149-158) geändert werden.
alter Code, Siehe Datei class.tslib_search.php (Zeile 149-158):
$this->fTable=''; foreach ($this->tables as $t => $v) { if ($t!='pages') { if (!$this->fTable) { $this->fTable = $t; } else { unset($this->tables[$t]); } } }
neuer Code
$pagesArray = array('pages'); if ($GLOBALS['TSFE']->sys_language_uid !=0) { $pagesArray[] = 'pages_language_overlay'; } $this->fTable=''; foreach ($this->tables as $t => $v) { if (!in_array($t,$pagesArray)) { if (!$this->fTable) { $this->fTable = $t; } else { unset($this->tables[$t]); } } }
Und zum Schluss müsste noch geprüft werden ob in der TS-Config die Tabelle pages_language_overlay zum suchen zugelassen ist.
allowedCols = .... : pages_language_overlay.title-subtitle : .....
Indexed Search (für Volltextsuche bei mehrsprachigen Sites)
Vorteile: Suchergebnisse werden in moderner Form google-like ausgegeben. Also mit Sprache-Flagge, Relevanz-Angabe, Styles-Einstellung per CSS, und den RICHTIGEN Seitentiteln. Und eigentlich auch leicht anpassbar. Was sofort ins Auge fällt ist die Einstellung im SETUP Feld page.config.index_enable = 1 - Was man leicht vergisst, sind die Marker <!--TYPO3SEARCH_begin--> ...Der Inhalt der HTML-Seite... <!--TYPO3SEARCH_end--> , die in die Seite eingefügt werden müssen. - Die Regeln unterhalb der Seite lassen sich durch plugin.tx_indexedsearch.show.rules = 0 entfernen
Nachteile: Nach jedem Cache-Löschen müssen die Seiten wieder neu besucht werden. Durch die neue Extension "Cache-Seiten neu erstellen" ist das zum Glück etwas praktischer geworden. Man muss lange in den Mailinglisten herumsuchen, bis man diese Infos findet: Ausgangspunkt/ starting point muss sich UNTERHALB der Seite befinden, auf der sich das Suche-Feld befindet. Und es darf keine Extension auf der Seite enthalten sein, die das Caching ausschaltet $GLOBALS["TSFE"]->set_no_cache () - Dies trifft zum Beispiel zu, wenn man auf jeder Seite News per tt_news eingebunden hat. - Wenn man "händisch" Seiten indexieren möchte, dann muss man das in einem EXTRA-Fenster tun. Nicht im Backend.
Indexed Search - core-Änderung für Korrektur der Seiten-Titel
Beitrag von Michal Jakubik ( <michal DOT jakubik AT ae-design DOT sk> ) ist ein einfacher 4-Zeiler. Siehe Datei class.tslib_content.php (Zeile 2059):
Die folgenden Zeilen hinter diese Zeile einfügen $search->execute_query();
in die Datei class.tslib_content.php
if(intval($GLOBALS['TSFE']->sys_language_uid)!=0) { $search->queryParts['SELECT']=str_replace("pages.title AS pages_title","pages_language_overlay.title as pages_title",$search->queryParts['SELECT']); $search->queryParts['FROM']=$search->queryParts['FROM'].", pages_language_overlay"; $search->queryParts['WHERE']=$search->queryParts['WHERE'] ."and pages_language_overlay.pid=pages.uid"; }
Alternative zu dieser "händischen" core-Änderung wäre eine Mini-Extension anzulegen, die per user_xx (=XCLASS Mechanismus) die core-Änderung durchführt.
Indexed Search - Wenn es Probs mit dem Cache gibt
So findet man die Extension, die den Cache ausschaltet: admin_panel aktivieren, dann die Seiten durchgehen. Wenn no_cache = 1 angezeigt wird, enthält diese Seite eine solche Extension.
Indexed Search - Wenn die falsche Flagge angezeigt wird
Die Dänische Flagge wird statt der Englischen angezeigt?: Falls das so ist, liegt es an den Einstellungen zur Default-Sprache. Hier ein Workaround zur Lösung des Problems: http://typo3.org/1422+M5d1b742a8a0.0.html?tx_maillisttofaq_pi1[sword]=flag
Indexed Search - Wenn es Seitentitel mit Überbreite gibt
Manche Seitentitel sind so lang, dass die Breite der Suchergebnisse zu lang ist?: Falls das so ist, dann im Extensioncode (Datei "pi/class.tx_indexedsearch.php") die Zeile 1162 ändern: das "nowrap" herausnehmen. That' s all. Falls der Pfad der Suche zu lang ist und dadurch Fehler auftreten muss in Zeile 1336 das "nowrap" rausnehmen und das funktioniert auch. http://typo3.org/doc.0.html?&tx_extrepmgm_pi1[extUid]=16&tx_extrepmgm_pi1[tocEl]=43&cHash=f356fa37fd
Indexed Search - Einstellungen
#-- ab hier SETUP config.index_enable = 1 plugin.tx_indexedsearchresult_link_target = plugin.tx_indexedsearch { # Styles nicht auf jeder Seite einbinden (-> externe CSS-Datei) _CSS_DEFAULT_STYLE > # default-mäßig ein Teilwort suchen _DEFAULT_PI_VARS.type = 1 # target soll nicht auf page zeigen result_link_target = _self # Kein komplizierten Erklärungen show.rules = 0 # nur die nötigen Einstellungen blind.sections=1 blind.order=1 blind.lang=1 }
Extension "Cache all" (für automatische Index-Erstellung)
Durch diese Extension wird der Index für die indexed_search bzw. die macina_searchbox automatisch erstellt - für alle aktuellen Domains und indizierbaren Seiten. Die Seiten werden entweder mit PHP-Mitteln (per fopen/fgets) gelesen und dadurch gecached - oder per shell-Mitteln (wahlweise wget oder curl). Es wird also nicht "nur" der Cache erstellt.
Der extension-key ist cwt_cacheall.
Die Erweiterung (mehrsprachigkeit) ist hier beschrieben:
http://www.typo3.net/viewtopic.php?p=21686&highlight=cache*+curl#21686 -- Habe den Caching-Algorithmus am 9.12.03 nochmal überarbeitet
Datensatz Suche
Die Extension select_pro ist enorm flexibel - allerdings auch schwierig in der Handhabung. Es können beliebige Datenbank-Tabellen verknüpft werden - inner join - und es kann ausgewählt werden, welche Attribute (title, date, andere) im Ergebnis auftauchen sollen. Besonders praktisch ist das Verwenden eines Templates um das Ergebnis anzeigen zu können.
Beim Verwenden sollte man enable-fields und Sprache anfangs freilassen.