Shopsystem ShopPilot

ShopPilot => SSP - Shop Server Pages => Thema gestartet von: dobra am März 11, 2013, 10:15:29

Titel: mit randomitem keine doppelten Artikel ausgeben ?
Beitrag von: dobra am März 11, 2013, 10:15:29
Hallo,

ich habe das Script von ahe
http://www.shoppilot.net/pf/shoppilot-enterprise/wechselnder-artikelinhalt-der-eingangsseite/msg1491/#msg1491 (http://www.shoppilot.net/pf/shoppilot-enterprise/wechselnder-artikelinhalt-der-eingangsseite/msg1491/#msg1491)
ein wenig "missbraucht" und hole mir die zufälligen Artikel für die "Empfehlungen" in der Lightbox nicht von verknüpften Artikeln sondern gefiltert nach Zuordnung aus der ITEM-Tabelle:

<!--spmacro:module(randomitem)
%RANDITEMS = ();
$curIndex = -1;
srand();
sub artikel {
my $id = ssp::get_var_article("itemid");
my $sort = ssp::get_var_article("ZUORDNUNG");

my $pre = ssp::db_get_prefix();
my $ITEM = $pre . 'ITEM';

my $count = ssp::readSQLData("SELECT ITEMID, DIMG, ARTIKELNAME, SEITE, ERG1, PRICE FROM $ITEM WHERE ZUORDNUNG = '$sort' && ITEMID <> '$id'","ITEMID","DIMG","ARTIKELNAME","SEITE","ERG1","PRICE");
if ($count >= 0) {

my $ok = 0;
my $number = 0;
my $check = 0;
while (!$ok) {
if ($check > $count) { $curIndex = -1; return; }
$number = int(rand($count));
$ok = !(defined $RANDITEMS{$number});
if ($ok) {
$RANDITEMS{$number} = 1;
$curIndex = $number;
}
$check = $check + 1;
}

$img = ssp::get_var_db("DIMG",$curIndex);
$artnr = ssp::get_var_db("ITEMID",$curIndex);
....

main::mprint qq|<div class="boxshaddow2" style="float:left; ..."> <html-code> </div>|;
}
}
-->

Funktioniert wunderbar  ;D
(http://www.woll-insel.at/Bilder/SP-Forum/lightbox.png)

nur.....
selten aber doch manchmal werden Artikel doppelt ausgegeben  :(
Wie kann ich das verhindern ?
Titel: Re: mit randomitem keine doppelten Artikel ausgeben ?
Beitrag von: ahe am März 11, 2013, 13:45:21
Hallo dobra,

das liegt vermutlich an Artikelverknüpfungen.
Schliesse die mal aus:

my $count = ssp::readSQLData("SELECT ITEMID, DIMG, ARTIKELNAME, SEITE, ERG1, PRICE FROM $ITEM WHERE ZUORDNUNG = '$sort' AND ITEMID <> '$id' AND XISLINK <> '1'","ITEMID","DIMG","ARTIKELNAME","SEITE","ERG1","PRICE");
Titel: Re: mit randomitem keine doppelten Artikel ausgeben ?
Beitrag von: dobra am März 11, 2013, 13:54:08
Hallo ahe,

Danke - das war's vermutlich wirklich.
(lokal) 25x Seite mit wenigen Zufallsartikeln aufgerufen - keine einzige Doppelausgabe.
Bei der selben Seite online (noch nicht korrigierte Abfrage) - bei jedem 3 - 4 Aufruf ein Artikel doppelt.
Titel: Re: mit randomitem keine doppelten Artikel ausgeben ?
Beitrag von: ahe am März 11, 2013, 14:07:01
Was mir auch gerade auffällt.
Ich würde die beiden Buttons anders herum positionieren.
Also "zum WK" rechts und "weiter einkaufen" nach links.
Das ist die übliche Variante die Buttons zu positionieren.
Innerhalb des Bestellvorgangs klickst du ja auch rechts um mit der Bestellung zu starten / fortzufahren.
Titel: Re: mit randomitem keine doppelten Artikel ausgeben ?
Beitrag von: dobra am März 11, 2013, 14:20:04
Hast recht - ist irgendwie logischer
(hatte das so von einem großen AT-Versandhaus nachgebaut ;) )
werde ich Abend zu Hause ändern
Titel: Re: mit randomitem keine doppelten Artikel ausgeben ?
Beitrag von: dobra am März 11, 2013, 21:27:11
In meinem Script wird für jeden Artikel eine DB-Abfrage gesendet.

Vorteil:  
die Anzahl der ausgegebenen Artikel ist flexibel.
Man schreibt für jeden Artikel der ausgegeben werden soll 1x  __randomitem::artikel__
im Beispiel sollen 4 Artikel angezeigt werden, also
__randomitem::artikel__ __randomitem::artikel__ __randomitem::artikel__ __randomitem::artikel__
Nachteil:
ist eben, dass für jedes __randomitem::artikel__  eine neue DB-Abfrage abgeschickt werden muss

Wenn eine bekannte/gleichbleibende Artikelanzahl verwendet wird, geht das auch eleganter  8)
Danke an hop der mir den Hinweis gegeben hat, dass mein Script so nicht optimal ist wegen der unnötig vielen DB Zugriffe
... und Danke an Tante google die mir das "ORDER BY RAND() LIMIT" verraten hat ;)

<!--spmacro:module(randomitem)
sub artikel {
my $id = ssp::get_var_article("itemid");
my $sort = ssp::get_var_article("ZUORDNUNG");

my $pre = ssp::db_get_prefix();
my $ITEM = $pre . 'ITEM';

my $count = ssp::readSQLData("SELECT ITEMID, DIMG, ARTIKELNAME, SEITE, ERG1, PRICE FROM $ITEM WHERE ZUORDNUNG = '$sort' && ITEMID <> '$id' AND XISLINK <> '1' ORDER BY RAND() LIMIT 4","ITEMID","DIMG","ARTIKELNAME","SEITE","ERG1","PRICE");
  if ($count >= 0) {
 my $i=0;
while ($count > $i) {
$img = ssp::get_var_db("DIMG",$i);
$artnr = ssp::get_var_db("ITEMID",$i);
...

main::mprint qq|<div class="boxshaddow2" style="float:left; ..."> <html-code> </div>|;
++$i;
}
}
}
-->

mit
ORDER BY RAND() LIMIT 4  ## <- hier für 4 Artikel
wird die Anzahl der zufälligen Artikel festgelegt und dann mit nur einer DB-Abfrage und nur einmal
__randomitem::artikel__
die gewünschte Artikelanzahl ausgegeben.