Begrenzen der Suche auf bestimmte Seiten

Bei mehrsprachigen Seiten kann es sinnvoll sein bei der Suche nur Ergebnisse aus der einen oder anderen Sprache anzeigen zu lassen. Um dies zu erreichen kann ab WB 2.7 die Suche auf bestimmte Seiten eingegrenzt werden. Diese Eingrenzung erfolgt anhand des Links einer Seite (genauer gesagt anhand der Datenbankspalte 'link' in der Tabelle 'pages').
Beachten Sie dabei den besonderen Aufbau dieses Wertes:

Seite link
http://www.example.org/pages/intro.php /intro
http://www.example.org/pages/en/intro.php /en/intro
http://www.example.org/pages/de/hilfe/anleitung.php /de/hilfe/anleitung
http://www.example.org/pages/maschinen/vario-pop-2000.php /maschinen/vario-pop-2000

Voraussetzungen

Voraussetzung für dieses Verfahren ist, daß eindeutige, unterschiedliche Link-Abschnitte vorhanden sind, z.B. /en/, /de/.

/de/into
   /inhalt
   /seite1
/en/intro
   /content
   /page1

Wenn stattdessen z.B. die Sprache über die Option Seitensprache gesteuert wird, ist das hier beschriebene Verfahren nicht anwendbar. Siehe aber Begrenzen der Suche auf bestimmte Sprache.

Umsetzung

Die Umsetzung ist sehr einfach. Alles was Sie tun müssen, ist Ihrem Such-Formular ein weiteres Feld hinzuzufügen.

Such-Formular

Dem Such-Formular (gemeint ist hier das Formular im Template oder ein auf einer Seite selbst hinzugefügtes Formular) muß zuerst ein Feld mit Namen search_path hinzugefügt werden. Dazu gibt es mehrere Möglichkeiten, je nachdem, was Sie genau erreichen wollen.

Vorgabe: /de/ oder /en/

Wenn Sie die Suchmöglichkeiten mit einem Dropdown- oder Radio-Button vorgeben wollen (entweder /de/ oder /en/, oder auch entweder /maschinen/ oder /anlagen/) bauen Sie das Such-Formular so auf:

Form

<form name="search_sidebar" action="<?php echo WB_URL.'/search/index'.PAGE_EXTENSION; ?>" method="post">
  <h2><?php echo $TEXT['SEARCH']; ?></h2>
  <select name="search_path">
    <option value="/en/">English</option>
    <option value="/de/">Deutsch</option>
  </select>
  <input type="text" name="string" /><br /><br />
  <input type="submit" name="submit"
         value="<?php if(isset($TEXT['SUBMIT'])) { echo $TEXT['SEARCH']; } else { echo 'Search'; } ?>" />
</form>

Vorgabe: von aktueller Seite

Um den Wert für search_path von der aktuellen Seite zu ermitteln, benötigen Sie etwas PHP im Template:

Determine value for search_path

<?php
if(SHOW_SEARCH) {
  $search_path = FALSE;
  global $wb;
  if($link = $wb->page['link']) {
    // --start---- make your changes here -----
    if(strpos($link, '/de/')!==FALSE)) {
      $search_path = '/de/';
    } elseif(strpos($link, '/en/')!==FALSE)) {
      $search_path = '/en/';
    }
    // --end----- ---- ---- ------- ---- -----
  }
  if(!$search_path) {
    if(isset($_REQUEST['search_path'])) {
      $search_path = htmlspecialchars($wb->strip_slashes($_REQUEST['search_path']), ENT_QUOTES);
    } else {
      $search_path = '/en/'; // default if nothing match
    }
  }
?>
  /*
   *   The form goes here
   */
<?php
}
?>

Im Formular müssen Sie nun wiederum lediglich das Feld search_path, diesmal aber als hidden-field, einfügen:

Form

<form name="search_sidebar" action="<?php echo WB_URL.'/search/index'.PAGE_EXTENSION; ?>" method="post">
  <h2><?php echo $TEXT['SEARCH']; ?></h2>
  <input type="hidden" name="search_path" value="<?php echo $search_path ?>">
  <input type="text" name="string" /><br /><br />
  <input type="submit" name="submit"
         value="<?php if(isset($TEXT['SUBMIT'])) { echo $TEXT['SEARCH']; } else { echo 'Search'; } ?>" />
</form>

search_path

Sie haben oben gesehen, daß search_path einen Teil der Spalte 'link' in der Tabelle 'pages' widerspiegeln muß. Aber was passiert da genau?

Der Wert von search_path wird innerhalb einer SQL-Abfrage mit der Spalte 'link' verglichen.

since website baker 2.8

... AND `link` LIKE 'search_path%'

Das '%'-Zeichen ist ein Wildcard-Zeichen, und bedeutet, daß an dieser Stelle noch beliebiger Text folgen kann. Der Vergleich beginnt also immer am Anfang von 'link'.

search_path Treffer kein Treffer
/en/ /en/info /people/en/mario
/en /endotherm ←Achtung
en /end oder /en/attention oder …Achtung
/en/info /en/information/contact /de/information/contact
/info/ /info/contact /info ←fehlendes '/'
/maschinen/verkauf /maschinen/verkaufen-oder-leasen /de/maschinen/verkauf/info

Damit auch Treffer in der Mitte (oder am Ende) von 'link' möglich werden, kann man search_path ein % voranstellen,

$search_path = '%/en/';

was zu einer SQL-Abfrage führt, wie sie unter Website Baker 2.7 benutzt wurde.

... AND `link` LIKE '%search_path%'
search_path Treffer kein Treffer
/en/ /info/en/contact /info/en

Beachten Sie, daß bei Website Baker 2.7 standardmäßig die Abfrage so ausgeführt wird. Eine Eingrenzung auf den Anfang ist bei WB 2.7 daher nicht möglich.

Weitere Möglichkeiten

Suche in Maschinen und Anlagen

Wollen Sie die Suche nicht nur auf einen Bereich beschränken ('/en/') sondern auf Mehrere (z.B. '/maschinen/' und '/anlagen/'), können Sie mehrere Einträge mit Komma getrennt benutzen:

$search_path = '/maschinen/,/anlagen/';

Suche überall nur nicht in Maschinen oder Anlagen

Ebenso können Sie einen oder mehrere Bereiche ausschließen durch voranstellen eines Minus-Zeichens '-'. Das folgende Beispiel sucht überall, nur nicht in /maschinen/ oder /anlagen/:

$search_path = '-/maschinen/,/anlagen/';
Man beachte, daß hier nur ein Minus-Zeichen benutzt wird. Ein Mischen der Suchformen, also sowas wie:
Suche in '/en/' aber nicht in '/en/info':
$searchpath = '/en/,-/en/info'
ist nicht möglich!

Begrenzen der Suche auf bestimmte Seiten 0 Comments
 
projects/new_search/search_path_de.txt · Last modified: 2010-08-23 20:04 by Thomas "thorn" Hornik
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki