Autor Thema: virtueller Adventskalender  (Gelesen 7125 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline dobra

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1353
  • Lob: 18
virtueller Adventskalender
« am: Oktober 29, 2007, 12:56:03 »
Hallo,

Ich habe einen virtuellen Adventkalender gebastelt.
(funktioniert ohne JS - nur mit ssp und css)

Als "Zuckerl" gibt es am jeweiligen Tag jeweils einen Artikel mit xx% Rabatt (Rabatt kann für jeden Artikel ein anderer sein)
Die Tage in der Vergangenheit haben ein "geöffnetes Türchen" -> ein Bildchen wird angezeigt
Wird ein Türchen in der Zukunft angeklickt, wird ein "ist noch nicht" Text eingeblendet.

Beispiel wie es ausschauen könnte:
Kalender (Testannahme es ist heute der 9.12,)


heutige Tag angeklickt -> aktuelles Tagesangebot wird eingeblendet -> bei Klick auf Artikel kommt man zur entsprechenden Artikelseite


ein Tag in der Zukunft wird angeklickt -> "ist noch nix" wird eingeblendet


Auf den Artikelseiten

und im WK könnte das dann z.B. so aussehen:


Das sind natürlich alles nur Beispiele und individuell gestaltbar !
Das Script arbeitet vollautomatisch und ist also auch in den nächsten Jahren verwendbar.

Hat jemand interesse an dem Script?

(die Dokumentation ist recht aufwendig und wenn's eh niemanden interessiert, spar ich mir die Arbeit  :))

Linkback: https://www.shoppilot.net/pf/index.php?topic=972.0
mfG
dobra

Offline Andi

  • Hero Member
  • *****
  • Beiträge: 540
  • Lob: 2
    • Auto Tuning Shop
Re: virtueller Adventskalender
« Antwort #1 am: Oktober 29, 2007, 23:24:16 »
Hallo Dobra..
ich zB. hätte da durchaus Interesse dran ...

ist aber anscheinend (wie du selber schreibst) mit hohem Aufwand verbunden...
.. was wieder die Ursache sein wird, das wir es nicht schaffen, dieses nette Tool
bei uns einzubauen (leider).


Grüße v. ANDI
Alufelgen - Reifen - Komplettr?der
www.auto-tuning-shop.com

Offline dobra

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1353
  • Lob: 18
Re: virtueller Adventskalender
« Antwort #2 am: Oktober 30, 2007, 05:22:34 »
Hallo Andi,

Das Script ist ja fertig  :D
Das Anpassen an die eigenen Seiten ist natürlich immer noch zeitaufwendig, aber an einem Wochenende zu schaffen und ein bißchen Zeit ist ja noch bis zum 1. Dezember.

Ist nur für mich nicht so einfach, eine verständliche (und allgemein gültige) "Gebrauchsanweisung" zu formulieren, aber ich versuch's mal...

Es gibt 2 (auch unabhängig voneinander einsetzbare) Teile.

1.) Der tagesabhängig gegebene Artikelrabatt:

Dazu legt man 2 benuntzerdeffinierte Artikel-Felder an - "RABKLASSE" und "DATUM"
In "RABKLASSE" wird der Rabatt in % eingetragen ( z.B. 0.2 für 20%)
In "DATUM" wird das Datum, an dem der Rabatt gegeben werden soll eingetragen (MonatTag ohne Punkt dazwischen - z.B 1205 für den 5. Dezember)

Die Scripte:
in stdcart.ipl
<!--spmacro:module(Callback)
$rabattsumme = 0;
sub invoice_addpos {
my $ref_gesamt = $_[0];
my $ref_gesamt_steuer = $_[2];
my $anzahl = ssp::get_cart_items();
my $ust = $_[3]/100;
my $netto = $_[4];
for (my $i = 0;$i <= $anzahl;++$i) {
my $wert = ssp::get_var_cart('RABKLASSE',$i) ;
$rabattsumme += $wert * ssp::get_var_cart('preis',$i) *
ssp::get_var_cart('anzahl',$i);
}
if ($netto > 0) {
$$ref_gesamt -= $rabattsumme;
$$ref_gesamt_steuer -= $rabattsumme*$ust;
} else {
$$ref_gesamt -= $rabattsumme;
$$ref_gesamt_steuer -= $rabattsumme*(1-1/(1+$ust));
}
return 0;
}
-->

<!--spmacro:module(rabatt)

sub rpreis {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_cart('RABKLASSE',$index);
my $tag = ssp::get_var_cart('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
main::mprint( &main::fp((1-$wert) * ssp::get_var_cart('preis',$index))) ;
}
}
return 0;
}

sub rgesamt {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_cart('RABKLASSE',$index);
my $tag = ssp::get_var_cart('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
main::mprint( &main::fp((1-$wert) * ssp::get_var_cart('preis',$index) * ssp::get_var_cart('anzahl',$index))) ;
}
}
return 0;
}

sub rwert() {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_cart('RABKLASSE',$index);
my $tag = ssp::get_var_cart('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
main::mprint( $wert * 100 . "%") ;
}
}
return 0;
}

sub rsumme {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_cart('RABKLASSE',$index);
my $tag = ssp::get_var_cart('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
my $out = ( $wert * 100 . "%") ;
my $neupreis = ( &main::fp((1-$wert) * ssp::get_var_cart('preis',$index))) ;
my $preis = ssp::get_var_cart('preis',$index);
my $div = &main::fp(($preis - $neupreis ) * ssp::get_var_cart('anzahl',$index));
my $out = qq | <tr>
<td colspan="4" align="right" style="BORDER-LEFT: #cccc99 1px solid; BORDER-BOTTOM: #cccc99 1px solid"><b> __rabatt::rwert__  Adventrabatt  = Ihr heutiger Preis:</b><br> <font color="red">Sie sparen heute $div</font></td>
<td valign="top" nowrap style="BORDER-LEFT: #cccc99 1px solid; BORDER-BOTTOM: #cccc99 1px solid" align="right"><font color="red">__rabatt::rpreis__</font></td>
<td valign="top" nowrap style="BORDER-RIGHT: #cccc99 1px solid; BORDER-LEFT: #cccc99 1px solid; BORDER-BOTTOM: #cccc99 1px solid"><div align="right"><font color="red">__rabatt::rgesamt__</font></div></td>
</tr> |;
main::mprint $out;
}
}
}


sub advpreis {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $out ="__preis__";
my $tag = ssp::get_var_cart('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if ($tag == $datum)  { $out = "<strike>__preis__</strike";}
main::mprint $out;
}
}

sub advgpreis {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $out ="__gesamteinzel__";
my $tag = ssp::get_var_cart('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if ($tag == $datum)  { $out = "<strike>__gesamteinzel__</strike";}
main::mprint $out;
}
}

-->
Der HTML-Code für die "Adventrabattzeile" (my $out = qq | ... |;)  muß angepaßt werden.
ACHTUNG: in den Demoshops funktioniert das SO
wenn der Warenkorb modifiziert ist - man also z.B. gewichtsabhängige Versandkosten verwendet - muß auch das Callback-Script angepaßt werden!

(bin gerade dabei herauszufinden, wie ich es für meine - sehr spezielle - WK-Konfiguration machen kann)

ein Datei "rabatt_produkt.ipl" erstellen und im WC mit "Dateien hinzufügen" einbinden
<!--spmacro:module(rabatt)
sub rpreis {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_article('RABKLASSE',$index);
my $tag = ssp::get_var_article('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
my $apreis =( &main::fp((1-$wert) * ssp::get_var_article('preis',$index))) ;
main::mprint "<font color=\"red\">Ihr heutiger Preis = <b>$apreis</b></font>";
}
}
return 0;
}

sub rwert() {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_article('RABKLASSE',$index);
my $tag = ssp::get_var_article('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
my $prozent = ( $wert * 100 . "%") ;
my $neupreis = ( &main::fp((1-$wert) * ssp::get_var_article('preis',$index))) ;
my $preis = ssp::get_var_article('preis',$index);
my $div = &main::fp($preis - $neupreis);
main::mprint "$prozent Adventrabatt<br> - $div";
}
}
return 0;
}

-->

Im Warenkorb, Bestellformular und Bestettmail __preis__ mit __rabatt::advpreis__ und __gesamteinzel__ mit  __rabatt::advgpreis__ erstetzen.
Im loopitem Bereich __rabatt::rsumme__ einfügen (= die Zeile "ihr heutiger Preis ... " wird - wenn vorhanden - eingeblendet)
<!--spmacro:loopitem-->
<tr>
   <td>...</td>
   <td>...</td>
       ....
</tr>
__rabatt::rsumme__
<!--spmacro:enditem-->

Sonst baucht man im WK nichts weiter tun, da stdcart automatisch eingebunden wird.

In den Verzeichnis- und Deteilseiten das Script mit
<!--spmacro:include(rabatt_produkt.ipl)-->
einbinden und __preis__ mit __preis__ <br>__rabatt::rwert__<br> __rabatt::rpreis__ ersetzen.

2.) Der Kalenderteil:

Eine Datei "advent.ipl" erstellen und im WC mit "Dateien hinzufügen" einbinden
<!--spmacro:module(advent)
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
my $datum2 = sprintf("%2d.%2d.",$mday,$mon);
my $datum3 = sprintf("%2d.%2d.%4d",$mday,$mon,$year);

sub embed {
my $count = ssp::readSQLData("SELECT ITEMID FROM PY2_ITEM WHERE DATUM='$datum'","ITEMID");
if ($count >= 0) {
my $i=0;
while ($count > $i) {
$artikel = ssp::get_var_db("ITEMID",$i);
ssp::embedded("csearch","advent.txt",$artikel);
++$i;
return "noinc"; # verhindert, daß "als Verknüpfung" kopierte Atrikel doppelt angezeigt werden
}
}
}

sub test {
my $heute = ssp::get_var_form('heute');
if ($heute == $datum) {
my $out = qq| <div class="adventbox2">__advent::embed__</div>  |;
main::mprint $out;
}
}

sub td1 {
if ($datum > 1201) { $out = qq| <img border="1"  src="PFAD_ZUM_1._BILD"> |; }
if ($datum == 1201) { $out = qq|<form method="post" name="heute" id="heute" action= "http://__xxpath__?showbynameNAME_DER_SEITE_AUF_DER_DAS_SCRIPT_EINGEAUT_WIRD,__xxsession__">
<td valign=bottom">
<table  class="rahmen" cellpadding="8"><tr><td align="center">
<input type="hidden" name="heute" id="heute" value="$datum">
<input type="submit" class="advsubmit" value="&nbsp;1&nbsp"> </a>
</td></tr></table>
</td> </form>|; } 
if ($datum < 1201)  { $out = qq| ... HIER KOMMT DER HTML-CODE FÜR DIE ANZEIGE BEI "zu früh" HINEIN ... |; }
main::mprint $out;
}

sub td2 {
if ($datum > 1202) { $out = qq| <img border="1"  src="PFAD_ZUM_2._BILD"> |; }
if ($datum == 1202) { $out = qq|<form method="post" name="heute" id="heute" action= "http://__xxpath__?showbynameNAME_DER_SEITE_AUF_DER_DAS_SCRIPT_EINGEAUT_WIRD,__xxsession__">
<td valign=bottom">
<table  class="rahmen" cellpadding="8"><tr><td align="center">
<input type="hidden" name="heute" id="heute" value="$datum">
<input type="submit" class="advsubmit" value="&nbsp;2&nbsp"> </a>
</td></tr></table>
</td> </form>|; } 
if ($datum < 1202)  { $out = qq| ... HIER KOMMT DER HTML-CODE FÜR DIE ANZEIGE BEI "zu früh" HINEIN ... |; }
main::mprint $out;
}
...
usw bis sub td24 { ...
...
-->

Damit die einzelnen "Fenster" ein- bzw. ausgeblendet werden, in der Style Datei (z.B. stile.css) eintragen.
.adventbox {z-index:99; font-family: Arial, Helvetica, sans-serif; font-weight:bold; font-size: 16px; color: red; text-decoration: none;}
.adventbox a span {position:absolute; display:none; font-family: Arial, Helvetica, sans-serif; font-weight:bold; font-size: 16px; color: red; text-decoration: none;}
.adventbox a:focus span {position:absolute; top:220; left:45%; z-index:99; display:block;
color:black;
background:#ffffff;
font:bold 11px Arial, Helvetica, sans-serif;
border:2px solid red;
padding:5px;}
.adventbox a:active span {position:absolute; top:220; left:45%; z-index:99; display:block;
color:black;
background:#ffffff;
font:bold 11px Arial, Helvetica, sans-serif;
border:2px solid red;
padding:5px;}

.adventbox2 {z-index:29; overflow:visible; position:absolute; top:305; left:38%; display:block;}
.adventbox2 a:link span {overflow:visible;  z-index:29; display:block;}

.rahmen { border:1px dashed black; font-family: Arial, Helvetica, sans-serif; font-weight:bold; font-size: 16px; color: red; text-decoration: none;}
.rahmen a:link {  font-family: Arial, Helvetica, sans-serif; font-weight:bold; font-size: 16px; color: red; text-decoration: none;}
.advsubmit { background:transparent; border:0px; padding:0px; margin:0px;  font-size: 16px; font-weight:bold; color: red; text-decoration: none; cursor:hand; cursor:pointer;}
Mit "top" und "left" wird die Position, an der das "Fenster" eingeblendet wird, eingestellt.
Hinweis: mit FF (a:focus) und IE (a:active) bleibt das Infofenster eingeblendet, bis man irgendwo anders hinklickt nur mit Opera verschwindet das "Fenster" sobald man die Maustaste losläßt - andere Browser habe ich nicht getestet

Der eigentliche Kalender:
Eine Datei "Adventkalender.html" erstellen und im WC mit "Dateien hinzufügen" einbinden
<!--spmacro:include(advent.ipl)-->

<link rel="stylesheet" href="PFAD_ZUR_DATEI/stile.css">

<table border="0" cellspacing="0" cellpadding="0">
<tr>
  <td height="320" align="CENTER" background="PFAD_ZUM_HINTERGRUNDBILD">       
<table width="520" height="320" border="2" cellspacing="0" cellpadding="0">
  <tr align="center" valign="middle">
   <td>
<table width="100%"  height="80" border="0" cellspacing="0" cellpadding="0">
   <tr>
  <td width="40"></td>
  <td > __advent::td19__</td>
  <td width="60"></td>
  <td >__advent::td11__</td>
  <td width="60"></td>
  <td >__advent::td3__</td>
  <td width="60"></td>
  <td >__advent::td23__</td>
  <td width="60"></td>
  <td>__advent::td14__</td>
  <td width="60"></td>
  <td>__advent::td21__</td>
  <td width="40"></td> 
</tr>
</table>
<table width="100%"  height="80" border="0" cellspacing="0" cellpadding="0">
   <tr>
  <td width="40"></td>
  <td >__advent::td4__</td>
  <td width="60"></td>
  <td >__advent::td17__</td>
  <td width="60"></td>
  <td >__advent::td1__</td>
  <td width="60"></td>
  <td>__advent::td5__</td>
  <td width="60"></td>
  <td>__advent::td10__</td>
  <td width="60"></td>
  <td>__advent::td18__</td>
  <td width="40"></td> 
</tr>
</table>
<table width="100%" height="80" border="0" cellspacing="0" cellpadding="2">
   <tr>
  <td width="40"></td>
  <td>__advent::td6__</td>
  <td width="60"></td>
  <td >__advent::td13__</td>
  <td width="60"></td>
  <td>__advent::td16__</td>
  <td width="60"></td>
  <td>__advent::td24__</td>
  <td width="60"></td>
  <td>__advent::td2__</td>
  <td width="60"></td>
  <td>__advent::td8__</td>
  <td width="40"></td> 
</tr>
</table>
<table width="100%" height="60" border="0" cellspacing="0" cellpadding="2">
   <tr>
  <td width="40"></td>
  <td>__advent::td20__</td>
  <td width="60"></td>
  <td >__advent::td12__</td>
  <td width="60"></td>
  <td>__advent::td7__</td>
  <td width="60"></td>
  <td>__advent::td22__</td>
  <td width="60"></td>
  <td>__advent::td15__</td>
  <td width="60"></td>
  <td>__advent::td9__</td>
  <td width="40"></td> 
</tr>
</table>
</td>
   </tr>
   </table>
  </td>
</tr>
  </table>
__advent::test__

In diesem Fall ist das Kalenderbild 520 x 320 groß - wenn Du ein anderes Format verwenden willst, bitte anpassen.

Zur Anzeige der Tagesaktionen braucht man jetzt noch eine txt Datei - hier "advent.txt" (muß natülich auch im WC mit "Dateien hinzufügen" eingebunden werden)
<!--spmacro:module(rabatt)
sub rpreis {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_article('RABKLASSE',$index);
my $tag = ssp::get_var_article('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
main::mprint( &main::fp((1-$wert) * ssp::get_var_article('preis',$index))) ;
}
}
return 0;
}

sub rwert() {
my $index = $_[0];
my $anzahl = $_[1];
if ($index <= $anzahl) {
my $wert = ssp::get_var_article('RABKLASSE',$index);
my $tag = ssp::get_var_article('DATUM',$index);
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum = sprintf("%02d%02d",$mon,$mday);
if (($wert > 0 ) && ($datum == $tag)){
my $out = ( $wert * 100 . "%") ;
my $neupreis = ( &main::fp((1-$wert) * ssp::get_var_article('preis',$index))) ;
my $preis = ssp::get_var_article('preis',$index);
my $div = &main::fp($preis - $neupreis);
main::mprint "$out ADVENTRABATT";
}
}
return 0;
}
-->

<!--spmacro:module(get)
sub datum {
($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
$mon += 1; $year += 1900; # Y2K
my $datum3 = sprintf("%2d.%2d.%4d",$mday,$mon,$year);
main::mprint $datum3;
}
-->
 ... UND HIER DER HTML-CODE ...
<table> .... was auch immer ...
(wie bei üblichen embed-Teilen

Und wenn ich nichts vergessen habe, war's das auch schon  ;)

Der Kalender muß nur noch auf der Seite und der Stelle, wo er angezeigt werden soll, mit <!--spmacro:include(Adventkalender.html)--> eingebunden werden.
Wenn Du den SB verwendest, solltest Du einen mitternächtlichen cronjob einrichten, damit der kalender auch auf den statischen Seiten immer aktuell ist.

Tipp:  zum testen habe ich eine inoffizielle Infoseite angelegt und das Datum in advent.ipl "vorgestellt"

   ($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
   $mon += 1; $year += 1900; # Y2K
   my $x = sprintf("%02d%02d",$mon,$mday);
   my $datum = $x + 180;

(mit my $datum = $x + 100; wäre der 1. November = 1. Dezember)
gilt aber NICHT für den Artikelrabatt - der soll natürlich erst im Dezember angezeigt werden !!

Mal gucken?  http://www.woll-insel.at/cgi-bin/shop2/iboshop.cgi?show1200005300
(ist aber optisch noch nicht ganz fertig)
« Letzte Änderung: November 03, 2007, 06:46:59 von dobra »

Offline dobra

  • Global Moderator
  • Hero Member
  • *****
  • Beiträge: 1353
  • Lob: 18
Re: virtueller Adventskalender
« Antwort #3 am: November 01, 2007, 09:24:09 »
ACHTUNG - GANZ WICHTIG !!!

Habe das ganze Teil zuerst für einen Demoshop gebaut und getestet.
Jetzt habe ich alles (von tagesabhängiger Rabatt, Anzeige auf Artikelseiten, in WK bis Bestellmail, Kalender funktion usw)
in meinen Shop - der sehr viel anders konfiguruert ist eingebaut und bin draufgekommen, daß ich da sehr viel an den Scripten ändern mußte.
(kompliziert war das vor allem, weil ich schon diverse andere Extrascripte für die Bestellabwicklung verwende und da jedes an das neue Rabattscript angepaßt werden mußte)

Es ist also keine universell verwendbare Lösung !

Wenn dennoch jemand versuchen möchte, (auf eigene Gefahr  ;)) mein Script zu verwenden,
BITTE UNBEDINGT VORHER eine Sicherungskopie aller Shopdaten machen
damit man, wenn doch etwas schiefgeht, auf die ursprünglichen Dateien zurückgreifen kann.