Alternative zu __wkcheck__ -> Crossartikel mit Radiobutton

Begonnen von dobra, Dezember 26, 2007, 15:36:55

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

dobra

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.

  • zu losen Flüssigkeiten muß ein Behälter mitbestellt werden - aber nicht mehr als einer
  • eine Kombitherme braucht ein Thermostat - es gibt verschiedene Ausführungen aber nur eine soll gewählt werden können
  • ein Auspuff brauch ein - aber eben nur ein - Endstück
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)
mfG
dobra

dobra

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.
mfG
dobra