Seite 1 von 2

CSS Volltextsuche 4.4.x

Verfasst: Mo 24. Jan 2005, 20:14
von cyaneo
Ich hab mal das Modul etwas angepasst - die Ausgabe sollte nun CSS/XHTML Konform sein:

Suchformular:

INPUT: leer

OUTPUT:

Code: Alles auswählen

<?php
$linkziel = "front_content.php?idcat=7";
//$linkziel = $auth->url();
?>

<form name="suche" action="<?= $linkziel ?>" method="post">
         <div><input name="suchtext" type="text" size="20" /><input name="submit" type="submit" value="Go" /></div>
</form>
Suchmodul:

INPUT:

Code: Alles auswählen

$linktarget = "CMS_VALUE[1]";
$extratext = "CMS_VALUE[2]";

if($linktarget == "") {
   $linktarget = "_self";
}
if($extratext == "") {
   $extratext = 0;
}
?>
<table>
   <tr>
      <td>Linktarget</td>
      <td>
         <select name="CMS_VAR[1]">
            <option value="_self"<? if(strcmp("_self", $linktarget) == 0) echo " selected"; ?>>gleiches Fenster (_self)</option>
            <option value="_new"<? if(strcmp("_new", $linktarget) == 0) echo " selected"; ?>>neues Fenster (_new)</option>
         </select>
      </td>
   </tr>
   <tr>
      <td>Zusätzlicher Text zum Artikellink</td>
      <td>
         <select name="CMS_VAR[2]">
            <option value="0"<? if($extratext == 0) echo " selected"; ?>>kein zusätzlicher Text</option>
            <option value="1"<? if($extratext == 1) echo " selected"; ?>>Artikelkommentar</option>
            <option value="2"<? if($extratext == 2) echo " selected"; ?>>Anfang des Artikeltextes</option>
         </select>
      </td>
   </tr>
</table>
<?
OUTPUT:

Code: Alles auswählen

<?php
//$linkziel = "front_content.php?idcat=7";
$linkziel = $auth->url();

$ignore_konj = array("und","oder","als","wenn","auch","wo","wie");
$ignore_art = array("der","die","das","ein","eine");
$ignore = array("ich","du","er","sie","es","wir","ihr","sie");

$extratextLength = 200;


$suchtext = $_POST["suchtext"];
?>

<form name="suche" action="<?= $linkziel ?>" method="post">
   <div><span style="font-size: 15px">Erneut suchen:&nbsp;</span>
   <input name="suchtext" type="text" size="20" value="<?= $suchtext ?>" />
   <input name="submit" type="submit" value="Go" /></div><br /><br />
</form>

<?php
$linktarget = "CMS_VALUE[1]";
$extratext = "CMS_VALUE[2]";

/* DB Instances */
$db = new DB_Contenido;
$db2 = new DB_Contenido;

/* Template Instance */
cInclude("classes", "class.template.php");
$tpl = new Template;


if($suchtext != "") {
   while(ereg('  ', $suchtext)) {
      $suchtext = ereg_replace('  ', ' ', $suchtext);
   }
   $suchliste = explode(" ", strtolower($suchtext));
   $suchliste = array_diff($suchliste, $ignore_konj, $ignore_art, $ignore);
   $suchtext = trim(implode(" ", $suchliste));

   if($verknuepfung == "oder") {
      $suchregexp = "(" . str_replace(" ", ")|(", $suchtext) . ")";
      $s = ereg_replace("ü", "%FC", strtolower($suchtext));
      $s = ereg_replace("ä", "%E4", $s);
      $s = ereg_replace("ö", "%F6", $s);
      $suchregexp .= "|$s";
      $sql =   "SELECT " .
               "A.title AS title, " .
               "A.idart AS idart, " .
               "A.summary AS comment, " .
               "B.idcat AS idcat, " .
               "D.value AS content, " .
               "A.idartlang AS sideid " .
            "FROM " .
               $cfg["tab"]["art_lang"] . " AS A, " .
               $cfg["tab"]["cat_art"] . " AS B, " .
               $cfg["tab"]["cat"] . " AS C, " .
               $cfg["tab"]["content"] . " AS D " .
            "WHERE " .
               "A.idart = B.idart " .
               "AND A.idartlang = D.idartlang " .
               "AND B.idcat = C.idcat " .
               "AND C.idclient = '$client' " .
               "AND idlang = '$lang' " .
               "AND online='1' " .
               "AND (D.value REGEXP '" . $suchregexp . "' " .
                  "OR A.title REGEXP '" . $suchregexp . "' " .
                  "OR A.summary REGEXP '" . $suchregexp . "')";
   } // end if($verkuepfung)
   else {
      $sql =   "SELECT " .
               "A.title AS title, " .
               "A.idart AS idart, " .
               "A.summary AS comment, " .
               "B.idcat AS idcat, " .
               "D.value AS content, " .
               "A.idartlang AS sideid " .
            "FROM " .
               $cfg["tab"]["art_lang"] . " AS A, " .
               $cfg["tab"]["cat_art"] . " AS B, " .
               $cfg["tab"]["cat"] . " AS C, " .
               $cfg["tab"]["content"]." AS D " .
            "WHERE " .
               "A.idart = B.idart " .
               "AND A.idartlang = D.idartlang " .
               "AND B.idcat = C.idcat " .
               "AND C.idclient = '$client' " .
               "AND idlang = '$lang' " .
               "AND online = '1'";

      while(list($key, $val) = each($suchliste)) {
         $suchregexp = "(" . str_replace(" ", ")|(", $val) . ")";
         $s = ereg_replace("ü", "%FC", strtolower($val));
         $s = ereg_replace("ä", "%E4", $s);
         $s = ereg_replace("ö", "%F6", $s);
         $suchregexp .= "|$s";
         $sql .=    " AND (D.value REGEXP '" . $suchregexp . "' " .
                     "OR A.title REGEXP '" . $suchregexp . "' " .
                     "OR A.summary REGEXP '" . $suchregexp . "')";
      } // end while
      reset($suchliste);
   } // end else($verknuepfung)

   $db->query($sql);

   if($db->num_rows() != 0){
      while($db->next_record()) {
         if ($auth->auth["uid"] == "nobody"){
            $sql2 =   "SELECT " .
                     "public " .
                  "FROM " .
                     $cfg["tab"]["cat_lang"] . " " .
                  "WHERE " .
                     "idcat = '" . $db->f("idcat") . "'";
            $db2->query($sql2);

            if($db2->next_record()) {
               if($db2->f("public") == 0) {
                  continue;
               } // end if(public)
            } // end if(next_record)
         } // end if(auth nobody)

         $num = 0 + $db->f("sideid");
         $results[$num][link] = "front_content.php?" .
                              "client=" . $client .
                              "&lang=" . $lang .
                              "&idcat=" . $db->f("idcat") .
                              "&idart=" . $db->f("idart");
         $results[$num][title] = $db->f("title");

         //anzuzeigenden Text ermitteln
switch($extratext) {
   case 0:
      $results[$num][text] = "";
      break;
   case 1:
      $results[$num][text] = nl2br($db->f("comment"));
      break;
   case 2:
      $results[$num][text] = capiStrTrimSentence(strip_tags(urldecode($db->f("content")), "<br /><br/><br />"), $extratextLength) . "...";
      $results[$num][text] = nl2br($results[$num][text]);
      break;
} // end switch
// unnötige Zeilenumbrüche entfernen
$results[$num][text] = preg_replace("/(?s)^(\<br(.?)(\/?)\>(\\r\\n)?(\&nbsp;|\040)*)+/", "", $results[$num][text]);
$results[$num][text] = preg_replace("/(?s)(\<br(.?)(\/?)\>(\\r\\n)?(\&nbsp;|\040)*)+/", "<br />", $results[$num][text]);


         while(list($key, $val) = each($suchliste)) {
            $hits[$num] +=   substr_count(strtolower(strip_tags(urldecode($db->f("title")))), $val) +
                        substr_count(strtolower(strip_tags(urldecode($db->f("comment")))), $val) +
                        substr_count(strtolower(strip_tags(urldecode($db->f("content")))), $val);
         } // end while

         reset($suchliste);
      } // end while(next_record)

      if(count($hits) > 0) {
         //anzahl hits speichern
         $anzahlhits = count($hits);

         $hits = array_values($hits);
         $results = array_values($results);
         array_multisort ($results, SORT_DESC, SORT_NUMERIC, $hits, SORT_DESC, SORT_NUMERIC);

      } // end if(count hits)
   } // end if(num_rows)


   //Ausgabe-----------------

   /* Start Output buffer */
   ob_start();

   if(count($hits) > 0) {
      $tpl->reset();
      $tpl->set('s', 'SUCHTEXT', $suchtext);
      $tpl->set('s', 'TREFFER', $anzahlhits);

      for($i = 0; $i < count($hits); $i++) {
         $tpl->set('d', 'ARTIKELNAME', $results[$i][title]);
         $tpl->set('d', 'TARGET', $linktarget);
         $tpl->set('d', 'HREF',  $results[$i][link]);
         $tpl->set('d', 'TEXT',  $results[$i][text]);
         $tpl->next();
      }
      $tpl->generate('templates/search_found.html');
   } // end if(count hits)
   else {
      $tpl->reset();
      $tpl->set('s', 'SUCHTEXT', $suchtext);
      $tpl->generate('templates/search_notfound.html');
   } // end else (count hits)
} // end if(suchtext)

/* Read out buffer */
$html = ob_get_contents();

/* Clean buffer */
ob_end_clean();

/* Output buffer-contents */
echo $html;
?>
search_found.html (kopieren nach "template"):

Code: Alles auswählen

<div>
   Suchergebnisse für "<strong>{SUCHTEXT}</strong>"
   <br />
   Anzahl Treffer: <strong>{TREFFER}</strong>
</div>
<br />
<!-- BEGIN:BLOCK -->
<div>
   <a href="{HREF}" target="{TARGET}"><strong>{ARTIKELNAME}</strong></a><br />
   {TEXT}
</div>
<br />
<!-- END:BLOCK -->
search_notfound.html (auch nach "template" kopieren):

Code: Alles auswählen

<div class="text">
Es wurden keine mit Ihrer Suchanfrage "<strong>{SUCHTEXT}</strong>" übereinstimmenden Dokumente gefunden
</div>
Download: hier

Verfasst: Mo 24. Jan 2005, 21:15
von i-fekt
Ohne zu testen sehe ich dass die niemals XHTML konform ist. z.B. solltest du Input-Felder mit "/>" schliessen und nicht nur ">", genauso <br/>s.

Dem notfound fehlt u.a. ein </p>. Der Code ist ziemlich löcherig.

Desweiteren solltest du statt <b></b> immer <strong></strong> verwenden.

;)

Verfasst: Di 25. Jan 2005, 00:59
von cyaneo
Craxx hat geschrieben:Ohne zu testen sehe ich dass die niemals XHTML konform ist. z.B. solltest du Input-Felder mit "/>" schliessen und nicht nur ">", genauso <br/>s.

Dem notfound fehlt u.a. ein </p>. Der Code ist ziemlich löcherig.

Desweiteren solltest du statt <b></b> immer <strong></strong> verwenden.

;)
Im Input ist's ziemlich egal, das bekommt der Browser im Frontend sowieso nicht zu sehen.

Sorry - ich kann im Output keine <b> etc. finden... (blind?)

Was meinst Du mit "löchrig"?

Verfasst: Di 25. Jan 2005, 01:37
von cyaneo
Ah - jetz weis ich was Du meinst: in den HTML Templates!
(Die hatte ich gar nicht geändert und 1:1 raufgestellt... :oops: )

Sollte nun alles stimmen...

Verfasst: Di 25. Jan 2005, 01:46
von i-fekt
Also ich kann nichts sehen dass du es geändert hast. Ich denke mal 90% machen Copy+Paste im Forum und ziehen sich nicht deine Datei.

Ausserdem sollte man schon richtig coden wenn man schon behauptet es sei XHTML und CSS konform. :roll:

Verfasst: Di 25. Jan 2005, 07:47
von cyaneo
Also ich kann nichts sehen dass du es geändert hast.
:?: :?: :?: Ich kann das nix mehr finden, was nicht w3c Konform wäre (hat auch nix beanstandet).
Ausserdem sollte man schon richtig coden wenn man schon behauptet es sei XHTML und CSS konform
Ist es auch! (und online geprüft) Mosern alleine is zu wenig - könntest Du mir bitte auch anzeigen, was Deiner Meinung nach noch nicht stimmt?
Ich denke mal 90% machen Copy+Paste im Forum und ziehen sich nicht deine Datei.
Gut so - für die restlichen 10% ist der Download.

Verfasst: Di 25. Jan 2005, 09:25
von i-fekt
Jetzt ist es ja geändert. :)

Verfasst: Di 25. Jan 2005, 13:36
von cyaneo
Dann hat sich das überschnitten - dachte schon, ich hätte 'nen Denkfehler.

Danke für die Info.

Bei der Suche fehlt noch die Treffervariante

Verfasst: Mo 31. Jan 2005, 13:48
von victor
Hallo alle zusammen, bei der Suchfunktion fehlt nur noch zur Perfektion, die Trefferausgabe 1- 10 , 11 - 20. Siehe google. hat jemand soetwas schon mal programmiert ?.

Verfasst: Mo 31. Jan 2005, 13:54
von i-fekt
Gibt es leider noch nicht, habe auch schon danach gesucht und gefragt. :(

Verfasst: Mo 31. Jan 2005, 17:58
von Halchteranerin
ich habe nicht das Problem, so viele Treffer zu erhalten. :wink: Aber es gibt andere Module mit Blaettern, Artikelliste oder Bildergalerie z.B., vielleicht koennt ihr damit etwas basteln.

Rücksprung auf Such-Ausgabe klappt nicht!

Verfasst: Fr 4. Feb 2005, 17:46
von hubert
Hallo Leute!
Das Suchmodul von Cynaeo ist super, NUR wo muss ich einhacken, damit beim "Zurück" (im MS-IE60xxx) zwar die idcat der Seite im Adressfeld angezeigt wird, allerdings ohne Inhalt (=weiße Seite!)
"Idrian" hat dasselbe Problem bereits einmal hier gepostet, allerdings keine Antwort erhalten. Siehe:http://contenido.org/forum/viewtopic.ph ... l&start=15

Liegt das an den Einstellungen meines MS-IE ?

Ich habe dasselbe Problem hier in diesem Forum, wenn ich einen Suchbegriff in "Suchen" eingebe und dann nach einem Beitrag mir einen weiteren Treffer anschauen möchte!

Danke für eure Hilfe!!
Ciao, Hubert

Verfasst: Fr 4. Feb 2005, 19:28
von cyaneo
NUR wo muss ich einhacken, damit beim "Zurück" (im MS-IE60xxx) zwar die idcat der Seite im Adressfeld angezeigt wird
Ich finde das nicht mehr - das Problem wurde im Forum schon beschrieben.

Nagle mich bitte nicht fest, aber soweit ich mich erinnere, liegt das am IE...

Edit:
ich hab's soeben geteste: mit Firefox 1.0 funktioniert es, mit IE nicht - also woran könnt' das jetzt liegen... :wink:

Verfasst: Sa 19. Feb 2005, 15:36
von Haue
Hi, ich setze diese Suche ein und sie funktioniert auch wunderbar.
Aber wo oder wie kann ich dem Modul sagen, das ich bei den Ergebnissen nicht den Seitentitel sondern die Headline haben möchte?

Am besten wäre es natürlich, nicht nur die Headline, sondern sogar z.B.
Headline + die ersten 100 Zeichen des Artikels
als Ergebnis auftauchen würde. Ist das möglich?
EDIT: OK, diese Funktion hab ich gefunden.
Aber das Problem mit Seitentitel und Headline besteht noch!?!

Verbesserung

Verfasst: Mi 23. Feb 2005, 14:10
von filippo
@Haue: Weiss nicht was du hast, es wird doch der Seitentitel angezeigt?

Hab das Modul soeben ausprobiert. Mir ist folgender Bug aufgefallen:
Wenn jemand ein Pluszeichen (oder Minus) eingibt, um das Ergebnis zu beinflussen, wird ein Error der Funktion Implode erzeugt (kommt von der SQL Abfrage, die mit diesen Zeichen ungültig wird).

Daher sollten diese Zeichen abgefangen werden (ev. noch mehr, weiss jemand welche genau?). Hab das so gemacht:

Unterhalb dieser while Schleife:
while(ereg(' ', $suchtext)) {
$suchtext = ereg_replace(' ', ' ', $suchtext);
}
diese zwei zeilen einfügen:
$suchtext = str_replace('+', ' ', $suchtext);
$suchtext = str_replace('-', ' ', $suchtext);
EDIT: Halt, habe soeben bemerkt, dass dies leider nichts bringt, da anscheinend die Übergabe dieses Strings schon vorher (ausserhalb des Moduls) den Implode Error erzeugt (zumindest bei Version 4.4.5, früher war das glaub ein bisschen anders, führte aber auch zu einem Fehler, wenn auch ein anderer). Hat jemand eine Idee, wie das Problem zu ugehen ist? Möchte nicht unbedingt per Javascript die Eingabe Clientseitig prüfen müssen.

Mfg
Filippo