CSS Volltextsuche 4.4.x

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

CSS Volltextsuche 4.4.x

Beitrag von cyaneo » Mo 24. Jan 2005, 20:14

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
Zuletzt geändert von cyaneo am Di 25. Jan 2005, 09:02, insgesamt 6-mal geändert.
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************

i-fekt
Beiträge: 1520
Registriert: Mo 3. Jan 2005, 02:15
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von i-fekt » Mo 24. Jan 2005, 21:15

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.

;)

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

Beitrag von cyaneo » Di 25. Jan 2005, 00:59

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"?
Zuletzt geändert von cyaneo am Di 25. Jan 2005, 07:53, insgesamt 1-mal geändert.
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

Beitrag von cyaneo » Di 25. Jan 2005, 01:37

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...
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************

i-fekt
Beiträge: 1520
Registriert: Mo 3. Jan 2005, 02:15
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von i-fekt » Di 25. Jan 2005, 01:46

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:

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

Beitrag von cyaneo » Di 25. Jan 2005, 07:47

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.
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************

i-fekt
Beiträge: 1520
Registriert: Mo 3. Jan 2005, 02:15
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von i-fekt » Di 25. Jan 2005, 09:25

Jetzt ist es ja geändert. :)

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

Beitrag von cyaneo » Di 25. Jan 2005, 13:36

Dann hat sich das überschnitten - dachte schon, ich hätte 'nen Denkfehler.

Danke für die Info.
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************

victor
Beiträge: 70
Registriert: Mo 27. Jan 2003, 08:54
Wohnort: Kassel
Kontaktdaten:

Bei der Suche fehlt noch die Treffervariante

Beitrag von victor » Mo 31. Jan 2005, 13:48

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 ?.
"Niemand weiss mehr als alle zusammen"

i-fekt
Beiträge: 1520
Registriert: Mo 3. Jan 2005, 02:15
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von i-fekt » Mo 31. Jan 2005, 13:54

Gibt es leider noch nicht, habe auch schon danach gesucht und gefragt. :(

Halchteranerin
Beiträge: 5478
Registriert: Di 2. Mär 2004, 21:11
Wohnort: Halchter, wo sonst? ;-)
Kontaktdaten:

Beitrag von Halchteranerin » Mo 31. Jan 2005, 17:58

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.

hubert
Beiträge: 25
Registriert: Fr 14. Nov 2003, 18:59
Wohnort: Innsbruck
Kontaktdaten:

Rücksprung auf Such-Ausgabe klappt nicht!

Beitrag von hubert » Fr 4. Feb 2005, 17:46

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

cyaneo
Beiträge: 76
Registriert: Mi 5. Jan 2005, 19:42
Wohnort: Das findet ihr sowieso nicht, weils so klein ist...
Kontaktdaten:

Beitrag von cyaneo » Fr 4. Feb 2005, 19:28

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:
**************************************************
Gruss
cyaneo
Zen Cart - The Art of e-Commerce
--------------------------------------------------------------------------------
Wenn jeder dem anderen helfen wollte, wäre allen geholfen.
--------------------------------------------------------------------------------
Ein Problem ist halb gelöst, wenn es klar formuliert ist.
**************************************************

Haue
Beiträge: 43
Registriert: Mi 27. Okt 2004, 20:25
Wohnort: Emsland
Kontaktdaten:

Beitrag von Haue » Sa 19. Feb 2005, 15:36

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!?!

filippo
Beiträge: 17
Registriert: Do 20. Jan 2005, 16:22
Wohnort: Bern (CH)
Kontaktdaten:

Verbesserung

Beitrag von filippo » Mi 23. Feb 2005, 14:10

@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
Zuletzt geändert von filippo am Mi 23. Feb 2005, 15:39, insgesamt 2-mal geändert.

Gesperrt