Hallo zusammen,
anbei eine kleine Anwendung (man könnte schon fast Modul sagen :-), welche hier entstanden ist.
In der “Grundversion” sieht es wie folgt aus und kann natürlich stetig verbessert werden:
Viel Spaß damit
Hallo zusammen,
anbei eine kleine Anwendung (man könnte schon fast Modul sagen :-), welche hier entstanden ist.
In der “Grundversion” sieht es wie folgt aus und kann natürlich stetig verbessert werden:
Viel Spaß damit
Die Suche sollte noch um die Keywords als auch um die Hersteller erweitert werden. Macht schon sehr viel Sinn.
jop ich find meine version mit dem hersteller macht wirklich sinn
eventuell vom layout her ähnlich: smow.de ?
also vom konzept her find ich das toll
@coarsy: kannst ja den hersteller part von meiner version nehmen
Habs schon fertig nun. Version mit Keywords und Kategorien folgt noch
Suche ist auch schon in meinem Shop zum Testen eingebaut.
<?php
/* AUTOSUGGEST FOR OXID 1.5.2
Released under the GNU General Public License
*/
class autosuggest extends oxubase
{
public function render()
{
$SQL_FROM = 'SELECT * FROM oxarticles WHERE oxparentid = "" AND oxactive = 1 ';
$SQL_WHERE = 'oxtitle';
$SQL_FROM_HERSTELLER = 'oxmanufacturers';
$searchq = strip_tags($_GET['q']);
$articles_pp = 8;
$page = !isset($_GET["page"]) ? 1 : intval($_GET["page"]);
$start = ($page * $articles_pp) - $articles_pp;
$dbx = oxDb::getDb()->qstr(''.$searchq.'');
$getRecord_sql = $SQL_FROM.'AND '.$SQL_WHERE.' LIKE '.oxDb::getDb()->qstr('%'.$searchq.'%').' LIMIT '. $start.' , '. $articles_pp;
mysql_query( "SET NAMES 'utf8'" ); // Umlaute ausgeben
$getRecord = mysql_query($getRecord_sql);
$getRecord_sum = $SQL_FROM.'AND '.$SQL_WHERE.' LIKE '.oxDb::getDb()->qstr('%'.$searchq.'%');
$getRecordsum = mysql_query($getRecord_sum);
if($getRecord) {
$num_rows1 = mysql_num_rows($getRecordsum);
$num_rows_all = mysql_num_rows($getRecord);
$pages_sum = ceil($num_rows1 / $articles_pp);
}
if ($num_rows1 == 0) {
$where_str = "AND ( soundex_match(".$dbx.", oxtitle, ' ') = 1 ) LIMIT ". $start." , ". $articles_pp;
$getRecord_sql = $SQL_FROM.' '.$where_str;
$getRecord = mysql_query($getRecord_sql);
$getRecord_sum = $SQL_FROM."AND ( soundex_match(".$dbx.", oxtitle, ' ') = 1 )";
$getRecordsum = mysql_query($getRecord_sum);
if($getRecord) {
$num_rows2 = mysql_num_rows($getRecordsum);
$pages_sum = ceil($num_rows2 / $articles_pp);
}
}
if ($num_rows1 == 0 && $num_rows2 == 0) {
$where_str = "AND ( koelner_match(".$dbx.", oxtitle, ' ') = 1 ) LIMIT " . $start ." , ". $articles_pp;
$getRecord_sql = 'select * FROM '.$SQL_FROM.' WHERE '. $where_str;
$getRecord = mysql_query($getRecord_sql);
$getRecord_sum = $SQL_FROM . "AND ( koelner_match(".$dbx.", oxtitle, ' ') = 1 )";
$getRecordsum = mysql_query($getRecord_sum);
if($getRecord) {
$num_rows3 = mysql_num_rows($getRecord_sum);
$pages_sum = ceil($num_rows3 / $articles_pp);
}
}
//Hersteller auslesen
$where_str = " AND " . $SQL_WHERE . " LIKE " . oxDb::getDb()->qstr('%'.$searchq.'%');
$getRecord_sql = "SELECT * FROM " . $SQL_FROM_HERSTELLER . " WHERE oxactive = '1'" . $where_str;
$getRecordHersteller = mysql_query($getRecord_sql);
if($getRecordHersteller){
$num_rows_manufactures = mysql_num_rows($getRecordHersteller);
}
if ($num_rows1 == 0 && $num_rows2 == 0 && $num_rows3 == 0 && $num_rows_manufactures == 0) {
exit;
}
if(strlen($searchq)>0){
parent::render();
$oCurr = oxConfig::getInstance()->getActShopCurrencyObject();
$sShopURL = oxConfig::getInstance()->getConfigParam( 'sShopURL' );
echo "<table>";
if ($num_rows1 || $num_rows2 || $num_rows3) {
echo "<tr class=\"first\"><td colspan=\"3\" class=\"title\">Zeige Ergebnisse " . ($start + 1) . " - " . ($num_rows_all + $start) . " von $num_rows1</td></tr>";
}
while ($row = mysql_fetch_array($getRecord)) {
$query = "select oxseourl from oxseo WHERE oxobjectid = '" . $row['OXID'] . "' AND oxlang = 0 AND oxparams IN(select oxid from oxcategories)";
$result = mysql_query($query);
while($zeile1 = mysql_fetch_array($result))
{ $seourl = $zeile1['oxseourl'] ;
}
$picname = str_replace(".jpg", "", trim(utf8_encode($row['OXPIC1'])));
?>
<tr>
<td class="title"><?php echo '<a class="picture" href="/' .$seourl .'">' . $row['OXTITLE']. '</a>'; ?></td>
<td class="price"><?php echo number_format($row['OXPRICE'], 2, ",", "").' '.$oCurr->sign; ?></td>
<td class="image"><?php echo '<a href="' .$seourl .'"><img src="'.$sShopURL.'out/pictures/1/' . $picname . '_ico.jpg" alt="' . $row['OXTITLE'] . '">'; ?></td>
</tr>
<?php }
if($num_rows_manufactures){
//Hersteller auflisten
echo '<tr><td colspan="3">' . $num_rows_manufactures . ' gefundene Hersteller:</tr>';
while($row = mysql_fetch_array($getRecordHersteller))
{
$query = "select oxseourl from oxseo where oxobjectid = '" . $row['OXID'] . "' and oxlang = 0";
$result = mysql_query($query);
while($zeile1 = mysql_fetch_array($result))
{
$seourl = $zeile1['oxseourl'] ;
}
$picname = str_replace(".jpg", "", trim(utf8_encode($row['OXICON'])));
?>
<tr>
<td class="title" colspan="2"><?php echo '<a class="picture" href="/' .$seourl .'">' . $row['OXTITLE']. '</a>'; ?></td>
<td class="image"><?php echo '<a href="/' .$seourl .'"><img src="'.$sShopURL.'out/pictures/icon/' . $picname . '.jpg" alt="' . $row['OXTITLE'] . '">'; ?></td>
</tr>
<?php
}
}
if ($pages_sum > 1) {
echo '<tr><td class="pages" colspan="3"><span>Seiten:</span><ul class="pagination">';
for($i=1; $i<=$pages_sum; $i++)
{
if ($i==$page){
echo '<li class="active"><a href="' . $i . '"><span>' . $i . '</span></a></li>';
}
else {
echo '<li><a href="' . $i . '"><span>' . $i . '</span></a></li>';
}
}
echo '</ul></td></tr>';
}
echo '</table>';
exit; // Header-Fehler vermeiden
} else {
exit;
}
}
}
?>
Blöde Frage, wann sollte denn eigentlich bei $where_str = "AND ( soundex_match( ein Ergebnis kommen? Hier habe ich noch nie ein Resultset erhalten…
prima schau ich mir nachher mal an.
ich finde übrigens immer noch, dass man eine info anzeigen sollte, wenn nichts gefunden wurde! (wie bei meiner version)
[QUOTE=coarsy;62809]Blöde Frage, wann sollte denn eigentlich bei $where_str = "AND ( soundex_match( ein Ergebnis kommen? Hier habe ich noch nie ein Resultset erhalten…[/QUOTE]
Ich habe mal ein echo eingesztt. Wenn ich mich verschreibe, wird z.B. bei WAK (Wakeboard) die erste benutzt, bei WHAK dieses soudnex.
jop ist ne fehlertolerante suche
[QUOTE=cottoneyejoe;62811]Leuts, ich werde wahnsinnig. [B]Könnte ihr bitte auf den neuen umschnwenken.[/B]
Trotzdem noch kruz: Bei Amazon werden aber überhaupt keine Ergebnisse in Form von Artiklen angzeigt. Ich erhalte da nur vorschläge.[/QUOTE]
Ja, das hatte ich ja schon geschrieben. Das finde ich besser als Artikel, weil übersichtlicher. Amazon hat zu “Anker” 25.000 Ergebnisse, den Scrollbalken mag ich mir nicht vorstellen.
@caladan: Ja, ich hatte das auch mal so in einem experimentellen Autosuggest: http://zunderweb.de/oxiddemo2/ . Das ist aber m.E. nicht das Optimum, weil zufällig. Besser wäre es, die Gruppierungen, z.B. nach Kategorien, oben anzuzeigen wenn viele Ergebnisse da sind. Das ist bei Amazon gut gelöst finde ich.
@hebsacker: Finde ich nicht gut den alten Thread zu schließen, ist ja jetzt völlig zusammenhanglos was ich da so schreibe und passt hier überhaupt nicht rein.
werdet Euch einig - ich kann auch wieder aufmachen
_header.tpl Scripteinbindung:
<script src="[{ $oViewConf->getResourceUrl() }]autosuggest.js" type="text/javascript"></script>
Hier die autosuggest.js, welche im Ordner “src” im Template abgelegt wird:
var startSuggest = 1;
$(document).ready(function()
{
initEvents(thisParent);
});
/* Init basic events and effects */
function initEvents(thisParent)
{
initAutoSuggest();
}
function initAutoSuggest()
{
$("#searchparam").bind('keyup', function() { autoSuggest(); } );
$("#searchparam").focus(function() { $('#searchparam').val(""); } );
var n = 0;
$("#results").mouseenter(function() {
n = 0;
}).mouseleave(function() {
n = 1;
});
$("body").click(function(){
if (n == 1) {
$("#results").slideUp();
$("#searchparam").blur(function() { $('#searchparam').val("Suchbegriff eingeben"); } );
}
});
}
Dieses Script wird unter dem Namen autosuggest.php im Ordner Views abgelegt:
<?php
class autosuggest extends oxubase
{
public function render()
{
$SQL_FROM = 'SELECT * FROM oxarticles WHERE oxparentid = "" AND oxactive = 1 ';
$SQL_WHERE = 'oxtitle';
$SQL_FROM_HERSTELLER = 'oxmanufacturers';
$searchq = strip_tags($_GET['q']);
$articles_pp = 8;
$page = !isset($_GET["page"]) ? 1 : intval($_GET["page"]);
$start = ($page * $articles_pp) - $articles_pp;
$dbx = oxDb::getDb()->qstr(''.$searchq.'');
$getRecord_sql = $SQL_FROM.'AND '.$SQL_WHERE.' LIKE '.oxDb::getDb()->qstr('%'.$searchq.'%').' LIMIT '. $start.' , '. $articles_pp;
mysql_query( "SET NAMES 'utf8'" ); // Umlaute ausgeben
$getRecord = mysql_query($getRecord_sql);
$getRecord_sum = $SQL_FROM.'AND '.$SQL_WHERE.' LIKE '.oxDb::getDb()->qstr('%'.$searchq.'%');
$getRecordsum = mysql_query($getRecord_sum);
if($getRecord) {
$num_rows1 = mysql_num_rows($getRecordsum);
$allrows = $num_rows1;
$num_rows_all = mysql_num_rows($getRecord);
$pages_sum = ceil($num_rows1 / $articles_pp);
}
if ($num_rows1 == 0) {
$where_str = "AND ( soundex_match(".$dbx.", oxtitle, ' ') = 1 ) LIMIT ". $start." , ". $articles_pp;
$getRecord_sql = $SQL_FROM.' '.$where_str;
$getRecord = mysql_query($getRecord_sql);
$getRecord_sum = $SQL_FROM."AND ( soundex_match(".$dbx.", oxtitle, ' ') = 1 )";
$getRecordsum = mysql_query($getRecord_sum);
if($getRecord) {
$num_rows2 = mysql_num_rows($getRecordsum);
$allrows = $num_rows2;
$num_rows_all = mysql_num_rows($getRecord);
$pages_sum = ceil($num_rows2 / $articles_pp);
}
}
if ($num_rows1 == 0 && $num_rows2 == 0) {
$where_str = "AND ( koelner_match(".$dbx.", oxtitle, ' ') = 1 ) LIMIT " . $start ." , ". $articles_pp;
$getRecord_sql = 'select * FROM '.$SQL_FROM.' WHERE '. $where_str;
$getRecord = mysql_query($getRecord_sql);
$getRecord_sum = $SQL_FROM . "AND ( koelner_match(".$dbx.", oxtitle, ' ') = 1 )";
$getRecordsum = mysql_query($getRecord_sum);
if($getRecord) {
$num_rows3 = mysql_num_rows($getRecord_sum);
$allrows = $num_rows3;
$num_rows_all = mysql_num_rows($getRecord);
$pages_sum = ceil($num_rows3 / $articles_pp);
}
}
//Hersteller auslesen
$where_str = " AND " . $SQL_WHERE . " LIKE " . oxDb::getDb()->qstr('%'.$searchq.'%');
$getRecord_sql = "SELECT * FROM " . $SQL_FROM_HERSTELLER . " WHERE oxactive = '1'" . $where_str;
$getRecordHersteller = mysql_query($getRecord_sql);
if($getRecordHersteller){
$num_rows_manufactures = mysql_num_rows($getRecordHersteller);
}
if ($num_rows1 == 0 && $num_rows2 == 0 && $num_rows3 == 0 && $num_rows_manufactures == 0) {
echo "<table><tr class=\"first\"><td colspan=\"3\" class=\"title\">Es wurden keine Ergebnisse gefunden.</td></tr></table>";
exit;
}
if(strlen($searchq)>0){
parent::render();
$oCurr = oxConfig::getInstance()->getActShopCurrencyObject();
$sShopURL = oxConfig::getInstance()->getConfigParam( 'sShopURL' );
echo "<table>";
if ($num_rows1 || $num_rows2 || $num_rows3) {
echo "<tr class=\"first\"><td colspan=\"3\" class=\"title\">Zeige Ergebnisse " . ($start + 1) . " - " . ($num_rows_all + $start) . " von $allrows</td></tr>";
}
while ($row = mysql_fetch_array($getRecord)) {
$query = "select oxseourl from oxseo WHERE oxobjectid = '" . $row['OXID'] . "' AND oxlang = 0 AND oxparams IN(select oxid from oxcategories)";
$result = mysql_query($query);
while($zeile1 = mysql_fetch_array($result))
{ $seourl = $zeile1['oxseourl'] ;
}
$picname = str_replace(".jpg", "", trim(utf8_encode($row['OXPIC1'])));
?>
<tr>
<td class="title"><?php echo '<a class="picture" href="/' .$seourl .'">' . $row['OXTITLE']. '</a>'; ?></td>
<td class="price"><?php echo number_format($row['OXPRICE'], 2, ",", "").' '.$oCurr->sign; ?></td>
<td class="image"><?php echo '<a href="/' .$seourl .'"><img src="'.$sShopURL.'out/pictures/generated/product/1/56_42_100/' . $picname . '.jpg" alt="' . $row['OXTITLE'] . '">'; ?></td>
</tr>
<?php }
if($num_rows_manufactures){
//Hersteller auflisten
echo '<tr><td colspan="3">' . $num_rows_manufactures . ' gefundene Hersteller:</tr>';
while($row = mysql_fetch_array($getRecordHersteller))
{
$query = "select oxseourl FROM oxseo WHERE oxobjectid = '" . $row['OXID'] . "' AND oxlang = 0";
$result = mysql_query($query);
while($zeile1 = mysql_fetch_array($result))
{
$seourl = $zeile1['oxseourl'] ;
}
$picname = str_replace(".jpg", "", trim(utf8_encode($row['OXICON'])));
?>
<tr>
<td class="title" colspan="2"><?php echo '<a class="picture" href="/' .$seourl .'">' . $row['OXTITLE']. '</a>'; ?></td>
<td class="image"><?php echo '<a href="/' .$seourl .'"><img src="'.$sShopURL.'out/pictures/generated/manufacturer/icon/56_42_100/' . $picname . '.jpg" alt="' . $row['OXTITLE'] . '">'; ?></td>
</tr>
<?php
}
}
if ($pages_sum > 1) {
echo '<tr><td class="pages" colspan="3"><span>Seiten:</span><ul class="pagination">';
for($i=1; $i<=$pages_sum; $i++)
{
if ($i==$page){
echo '<li class="active"><a href="' . $i . '"><span>' . $i . '</span></a></li>';
}
else {
echo '<li><a href="' . $i . '"><span>' . $i . '</span></a></li>';
}
}
echo '</ul></td></tr>';
}
echo '</table>';
exit; // Header-Fehler vermeiden
} else {
exit;
}
}
}
?>
search_field.tpl für basic.tpl (an gewünschter Stelle inkludieren) bzw. im Basic Template innerhalb
der _header.tpl (mittels: [{ include file=“search_field.tpl” }]). Vorher das Template natürlich auf den Server laden und unter search_field.tpl speichern.
<script type="text/javascript">
function autoSuggest() {
var q = jQuery.trim($('#searchparam').val());
if (q.length >= startSuggest)
{
$("#results").hide();
$("#results").html(" ");
$.ajax({
url: parent.location.protocol + '//www.meinestruempfe.de/index.php?cl=autosuggest&q=' + q,
cache: false,
type: "get",
success: function(data){
if(data) {
$("#results").html(" ");
$("#results").html(data);
$('#results').show();
}
initPagination(q);
}
});
} else {
$('#results').hide();
}
}
function initPagination(q) {
$('.pagination li a').click(function() {
var p = $(this).attr("href");
$.ajax({
url: parent.location.protocol + '//www.meinestruempfe.de/index.php?cl=autosuggest&q=' + q + '&page=' + p,
cache: false,
type: "get",
success: function(data){
if(data) {
$("#results").html(" ");
$("#results").html(data);
$("#results").show();
}
initPagination(q);
}
});
return false;
});
}
</script>
[{if $oView->showSearch() }]
<div id="sitesearch">
<form action="[{ $oViewConf->getSelfActionLink() }]" method="get" class="search" id="f.search">
<div>
<div class="inner">
[{ $oViewConf->getHiddenSid() }]
<input type="hidden" name="cl" value="search">
<input type="text" name="searchparam" value="Suchbegriff eingeben" size="20" id="searchparam" class="text" autocomplete="off">
</div>
[{if $oView->getSearchCatTree() }]
<select id="test_searchCategorySelect" class="search_input" name="searchcnid" [{if $oViewConf->isAutoSearchOnCat() }]onchange="oxid.search('f.search','f.search.param');"[{/if}]>
<option value=""> [{ oxmultilang ident="INC_SEARCHLEFTITEM_ALLCATEGORIES" }] </option>
[{include file="inc/category_options.tpl" tree=$oView->getSearchCatTree() sSpacer=""}]
</select>
[{/if}]
<button id="test_searchGo" type="submit" class="btn" value="Suchen"><span>Los</span></button>
</div>
</form>
</div>
<div id="results"></div>
[{/if}]
Bitte zulassen. Einer reicht. Ich werd sonst klirre.
@leofonic: Dazu kann man doch die Ergebnisse begrenzen und 25000 Artikel kann man so oder so nur mit Suchbegriffen durchforsten.
[QUOTE=cottoneyejoe;62827]
@leofonic: Dazu kann man doch die Ergebnisse begrenzen und 25000 Artikel kann man so oder so nur mit Suchbegriffen durchforsten.[/QUOTE]
Ja, und? Amazon war doch nur ein Beispiel dafür warum ich die Suche bei http://www.yacht-steel.com/deutsch.html nicht für das Maß der Dinge halte, das Beispiel http://www.smow.de/ von caladan finde ich auch sehr gut.
Dann habe ich das falsch interpreteirt. Ich habe jetzt nciht so die Ahnung, aber wird nicht mit
oxparentid = ""
eine Variante ausgeschlossen?
hmm könnte es nicht sein, dass oxparentid NULL ist? und ich meine mich zu erinnern bei sql wäre das dann “oxparentid= NIL” … aber nicht sicher.
Das findet man in allen Abfragen des Shops und muß korrekt sein.
Zwischenfrage: Das Thema ist sehr interessant. Noch interessanter finde ich allerdings Filter. Könntert ihr euch vorstellen, so ein Tuts auch dafür zu machen. ?
das wäre dann wohl offtopic und mach doch nen eigenen thread dafür auf
[QUOTE=caladan;62856]das wäre dann wohl offtopic …[/QUOTE]
[QUOTE=cottoneyejoe;62847]Dann habe ich das falsch interpreteirt. Ich habe jetzt nciht so die Ahnung, aber wird nicht mit
oxparentid = ""
eine Variante ausgeschlossen?[/QUOTE]
Hab das gerade gecheckt. Das Feld ist nicht NULL. Ist also korrekt. Es werden dann nur Vaterartikel angezeigt.
Amazon löst es übrigens wirklich geschickt. Zunächst wird verglichen ob der Suchbegriff als Teil eines Kategorienamens irgendwo auftaucht. Wenn ja, dann erscheint zunächst die Kategorie, ansonsten der Artikel, sortiert nach Relevanz. Ausserdem zieht die Live-Suche auch Attribute mit ran. So z.b DVD player tragbar, DVD Player Auto, DVD player USB etc. p. p. So kommt man auch mit nur wenigen Suchergebnissen aus.
Interessant ist, dass zuerst Kategorien und Attribute, dann erst Artikelergebnisse angezeigt werden.
Mal am Rande Sobald ich das Gefühl habe, dass eine Live Suche für mich wichtige Suchergebnisse unterschlägt nutze ich diese eh nicht, und schlänge mich lieber durch die normalen Ergebnisse.
Den Sinn des Thread Schliessens habe ich übrigens nicht ganz verstanden.