Shopsystem ShopPilot

ShopPilot => SSP - Shop Server Pages => SSP Bibliothek => Thema gestartet von: dobra am Dezember 26, 2007, 15:36:55

Titel: Alternative zu __wkcheck__ -> Crossartikel mit Radiobutton
Beitrag von: dobra am Dezember 26, 2007, 15:36:55
Hallo,

Nachdem ich im Moment an "Arbeitsnotstand" leide  ;), hab' ich mal in meiner "Bastelstube" nach Scripten gegraben, die vielleicht auch für andere interessant sein könnten.
(habe dieses "alte" Script nochmal überarbeitet und vereinfacht, so daß es universell anwendbar ist)

Aufgabe:
In manchen Fällen ist es sinnvoll, Crossartikel nicht mit Checkboxen sondern mit Radiobutton einzubinden.
z.B. usw


Lösung:
In der txt-Vorlage das __wkcheck__ mit
<input name="myradio" type="radio" value="__lib::artikelnummer2__"  onclick='check_radios(this)'>  
<input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer2__" value="" >

ersetzen.

In der (den) Detailseite(n) in denen die Crossartikel verwendet werden den JS-Code eintragen
<script language="JavaScript" type="text/javascript">
function check_radios(el) {
        var m_itemids = new Array(__print::jsscript__);
for (var i = 0; i < m_itemids.length; i++) {
document.getElementById('a__' + m_itemids[i]).value = "0";
}
document.getElementById(el.value).value = "1";
}
</script>

(kann alternativ auch in eine externe JS-Datei - die in allen Seiten eingebunden ist - geschrieben werden)

In stdall.ipl folgenden ssp-Code eintragen:
<!--spmacro:module(lib)
## Identifier nachbauen
sub artikelnummer2 {
    my $index = shift;
    my $anzahl = shift;
        if ($index <= $anzahl) {
    my $itemid = ssp::get_var_article('itemid', $index);
my $out = qq|a__$itemid|;
    main::mprint $out;
    }
    return 'noinc';
}
-->

<!--spmacro:module(print)
sub jsscript {
    my $index = shift;
    my $anzahl = shift;
   
    for($i=0; $i <= $anz; ++$i) {
        my $cross = ssp::get_var_article('ergaenz4', $index);
$cross =~ s/,/","/g;

main::mprint "\"$cross\"";

    }
}
-->

Hier sind die Crossartikel in ergaenz4 eingetragen - muß gegebenenfalls angepasst werden

Die Funktionen und die Einbindung bleiben die selben - einziger Unterschied: es werden Radiobutton statt Checkboxen verwendet


Nachtrag:
Soll der Kunde einen Crossartikel dazu bestellen müssen, das JS-Script um diesen Code ergänzen:
function check(){
  var okay = false;
  for(var i = 0; i < document.getElementsByName('myradio').length; i++)
  {
    if(document.getElementsByName('myradio')[i].checked == true)
    {
       okay = true;
    }
  }
  if (okay == false)
  {
    alert("Bitte wählen Sie eine Variante");
    return false;
  }
  return true;
}

und in den form tag onsubmit="return check()" schreiben
<form method="post" action="http://__xformcart__" onsubmit="return check()">

Auf diese Weise kann man z.B. einen speziellen Produktkonfigurator bauen, bei dem zwischen verschieden Komponenten (die mit der Crossartikel-Methode natürlich mit dem üblichen Bild, Text, Beschriebung, Preis usw dargestellt werden können) gewählt werden kann, aber eben EIN Teil zwingend gewählt werden muß.

(einziges - kleines - Problem dabei: es fehlt noch die ShopPilot-Funktion, diese Teile auch im WK zu koppeln, da der Kunde ja jetzt theoretisch die Komponenten in WK auch einzeln löschen oder die Mengen ändern kann)
Titel: Re: Alternative zu __wkcheck__ -> Crossartikel mit Radiobutton
Beitrag von: dobra am Dezember 28, 2007, 08:03:37
Achtung: Script für mehrere Komponenten nochmal überarbeitet
(im ursprünglichen Script hat die "zwangsweise" Auswahl bei mehr als einer Komponente nicht richtig funktioniert)

Hauptartikel
Komponente1 (Crossartikel aus ergaenz3)
Komponente2 (Crossartikel aus ergaenz4)
usw

Die Scripte (für 2 "Pflicht-Komponenten") schauen dann so aus:

Detailseite:
<script language="JavaScript" type="text/javascript">
function check_radios(el) {
        var m_itemids = new Array(__print::jsscript__);
for (var i = 0; i < m_itemids.length; i++) {
document.getElementById('a__' + m_itemids[i]).value = "0";
}
document.getElementById(el.value).value = "1";
}

function check_radios2(el) {
        var m_itemids2 = new Array(__print::jsscript2__);
for (var i = 0; i < m_itemids2.length; i++) {
document.getElementById('a__' + m_itemids2[i]).value = "0";
}
document.getElementById(el.value).value = "1";
}

function check(){
  var okay = false;
  for(var i = 0; i < document.getElementsByName('myradio').length; i++)
  {
    if(document.getElementsByName('myradio')[i].checked == true)
    {
       okay = true;
    }
  }
  if (okay == false)
  {
    alert("Bitte wählen Sie eine Variante");
    return false;
  }

  var okay2 = false;
  for(var i = 0; i < document.getElementsByName('myradio2').length; i++)
  {
    if(document.getElementsByName('myradio2')[i].checked == true)
    {
       okay2 = true;
    }
  }
  if (okay2 == false)
  {
    alert("Bitte wählen Sie die 2. Komponente");
    return false;
  }
  return true;
}

</script>


Die Crossartikel für die beiden Komponenten natürlich separat einbinden (z.B.  __cross::show1__  und __cross::show2__)

in cross1.txt wie gehabt
   <input name="myradio" type="radio" value="__lib::artikelnummer2__"  onclick='check_radios1(this)'>    
   <input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer2__" value="0" >

in cross2.txt
   <input name="myradio2" type="radio" value="__lib::artikelnummer2__"  onclick='check_radios2(this)'>    
   <input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer2__" value="0" >

In stdall.ipl oder eingebundener cross.ipl Datei (Beispiel)
<!--spmacro:module(cross)

sub show1 {
my $str = ssp::get_var_article('ergaenz3');
ssp::embedded("csearch","embedded/iplCross3.txt",$str . ":10000000");
}

sub show2 {
my $str = ssp::get_var_article('ergaenz4');
ssp::embedded("csearch","embedded/iplCross3.txt",$str . ":10000000");
}
-->


und

<!--spmacro:module(lib)
## Identifier nachbauen
sub artikelnummer2 {
    my $index = shift;
    my $anzahl = shift;
        if ($index <= $anzahl) {
    my $itemid = ssp::get_var_article('itemid', $index);
my $out = qq|a__$itemid|;
    main::mprint $out;
    }
    return 'noinc';
}
-->

<!--spmacro:module(print)
sub jsscript {
    my $index = shift;
    my $anzahl = shift;
   
    for($i=0; $i <= $anz; ++$i) {
        my $cross = ssp::get_var_article('ergaenz4', $index);
$cross =~ s/,/","/g;

main::mprint "\"$cross\"";

    }
}

sub jsscript2 {
    my $index = shift;
    my $anzahl = shift;
   
    for($i=0; $i <= $anz; ++$i) {
        my $cross = ssp::get_var_article('ergaenz3', $index);
$cross =~ s/,/","/g;

main::mprint "\"$cross\"";

    }
}
-->


Hat man mehr Komponenten als freie Felder, kann man die Crossartikel auch in ben. def. Felder eintragen.
Allerdings sind diese nicht "pinfähig"
- man muß also einen kleinen Umweg machen: ein dafür vorgesehenes Feld festpinnen, Crossartikel eintragen und per copy and past in's be. def. Feld schreiben.