Shopsystem ShopPilot

ShopPilot => SSP - Shop Server Pages => Thema gestartet von: dobra am Juli 02, 2007, 13:57:34

Titel: if Radio-Button checked
Beitrag von: dobra am Juli 02, 2007, 13:57:34
Hallo,

Gibt es eine Möglichkeit, mit ssp abzufragen, ob ein Radio-Button ausgewählt ist?

<td><input name="test" type="radio" value="__lib::artikelnummer2__">
<input type="hidden" name="__lib::artikelnummer2__" value="__check::radio__" ></td>


Wird (Quelltext) so ersetzt
<td><input name="test" type="radio" value="a__4711">
<input type="hidden" name="a__4711" value="1" ></td>


value = "1"   ->  (Cross)Artikel wird in den WK gelegt
value = "0"   ->  (Cross)Artikel wird nicht in den WK gelegt

Die Funktion sollte ungefähr so ausschauen: ??

<!--spmacro:module(check)
sub radio {
my $out = "";
   if  ( Radio-Button == checked ) {
         my $out =  qq | 1 |:
       } else {
         my $out = qq | 0|;
     }
   main::mprint $out;
}
-->

Wenn ich mit meiner Überlegung richtig liege, sollte das funktionieren, aber dazu fehlt mir der blaue  Codeteil       
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 02, 2007, 14:05:59
Hallo dobra,

so sollte es gehen...

if (ssp::get_var_form("test") eq $ssp::undefined) {
    ## Es ist NICHTS ausgewählt
}


analog dazu

if (ssp::get_var_form("test") ne $ssp::undefined) {
    ## Es ist IRGENDWAS ausgewählt
}


und ausserdem

if (ssp::get_var_form("test") eq "a__4711") {
    ## Es ist GENAU der Eintrag mit value="a__4711" ausgewählt
}
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 02, 2007, 14:33:04
Hallo ahe,

Danke für die superschnelle Antwort.

Habe es mit allen 3 Versionen versucht - funktioniert aber nicht...

Habe da scheinbar einen Gedankenfehler gemacht?
value = "__check::radio__" wird beim absenden (mit <form method="post" action="__xformcart__">) nicht ersetzt.

Nachtrag: 

mit
my $x = ssp::get_var_form("test");
main::mprint &x
wird im WK mit __check::radio__  die Artikelnr.  (z.B. a__4564 ) ausgegeben
Das funktioniert also

Aber eq $ssp::undefined  und ne $ssp::undefined wird ignoriert
eq "__lib::artikelnummer2__"  (würde "übersetzt" doch wenn a__4564 == a__4564 heißen ??
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 02, 2007, 15:05:36
Wie sieht denn Ihr momentaner SSP-Code und HTML-Code aus?
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 02, 2007, 15:20:04
@ ahe

mail unterwegs
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 02, 2007, 18:44:58
offensichtlich habe ich da wirklich einen Gedankenfehler gemacht  :'(

ohne "my" innerhalb der if-Bedingung wird  value="__check::radio__"  ersetzt
ABER auf der Detailseite -> also bei ALLEN Positionen value="0" da ja beim laden noch nichts ausgewählt ist.
Beim Absenden (erst da sollte es ja ersetzt werden) wird dann auch bei allen Artikeln dieses "0" gesendet (egal ob etwas ausgewählt ist oder nicht)

Wie kann ich es machen, daß value="__check::radio__" erst NACH dem absenden (also im WK) ersetzt wird?

Ich vermute mal, daß ich dazu eine clientseitige JS-Abfrage brauche?
<input type="radio" .... onclick=checkedon()>
Aber wie müßte die checkedon() - Funktion ausschauen, damit - wenn der Radiobutton ausgewählt ist - das value bei type="hidden" von "0" auf "1" gesetzt wird?
irgendwie mit inertHTML und mit <div id="testirgendwas"></div> die ganze Zeile <input type="hidden" name="__lib::artikelnummer2__" value="1" > einfügen?
Allerdings müßte die Zweile ja, wenn dann doch ein anderer Artikel ausgewählt wird, wieder entfernt werden...

...ein softwareseitiges __wkradio__ (s.Wunschliste) wäre soooooo schön und einfach ..........  ::)

Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 03, 2007, 10:21:17
Zitat von: dobra am Juli 02, 2007, 18:44:58
Ich vermute mal, daß ich dazu eine clientseitige JS-Abfrage brauche?
<input type="radio" .... onclick=checkedon()>
Aber wie müßte die checkedon() - Funktion ausschauen, damit - wenn der Radiobutton ausgewählt ist - das value bei type="hidden" von "0" auf "1" gesetzt wird?
irgendwie mit inertHTML und mit <div id="testirgendwas"></div> die ganze Zeile <input type="hidden" name="__lib::artikelnummer2__" value="1" > einfügen?
Vorausgesetzt das hidden Input würde sein
<input type="hidden" name="testitem" id="testitem" value="0">
Das könnten Sie mittels JS so ändern
document.getElementById('testitem').value = "neuer Wert";
ändern.
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 10:43:14
Hallo ahe,

Hab's mal so vesucht:

in .js Datei

function checked()
{
document.getElementById('__lib::artikelnummer2__').value = "1";
}

(und dann auch versuchsweise noch mit ['__lib::artikelnummer2__'])

in cross.txt

   <tr>
      <td><input name="test" type="radio" value="__lib::artikelnummer2__" onclick="checked(this);">
      <input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer2__" value="0" ></td>
   </tr>

wird im Quelltext so geschrieben

      <td><input name="test" type="radio" value="a__4542" onclick="checked(this);">
      <input type="hidden" name="a__4542" id="a__4542" value="0" ></td>

Aber wenn ich auf einen Radiobutton klicke, bekomme ich die Fehlermeldung:
"Das Objekt unterstützt diese Aktion nicht"

Was habe ich falsch gemacht?
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 03, 2007, 13:30:01
Gibt es auf der Seite noch ein zweites Element mit id="a__4542"?
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 13:33:43
nein

je nur 1x  name="a__4542"
              value="a__4542"
              und id="a__4542"
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 03, 2007, 13:39:50
Nennen Sie die Funktion mal mychecked ;)
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 14:08:31
jetzt sagt er
" 'document.getElementById(...)' ist Null oder kein Objekt "

function mychecked()
{
document.getElementById('__lib::artikelnummer2__').value = "1";
}

das __lib::artikelnummer2__ wird also zwar im Quelltext richtig ersetzt, aber nicht in JS

.......  was tun???
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 03, 2007, 14:19:38
Das muss gehen  ;D
Beim Aufbau der Seite im Browser werden von ShopPilot alle Identifier ersetzt.
Da Sie erst nach dem Aufbau der Seite auf den Button klicken können muss zu diesem Zeitpunkt auch schon der Identifier (auch in JS) ersetzt sein.

Lassen Sie sich doch in der Funktion mal mit alert('__lib::artikelnummer2__'); ausgeben welche Id schlussendlich beim Klicken benutzt wird.
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 14:41:03
alert Ausgabe

"__lib::artikelnummer2__"

wird also doch nicht ersetzt  ???
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 03, 2007, 14:54:39
Ich habe es nun mal in einem Testshop (Vorlage der Startseite) nachgebaut.
Alles funktioniert bestens... Im IE 7 und im FF.
Die Ausgaben der alerts sind (im FF)
1. [object HTMLInputElement]
2. 1

<!--spmacro:module(lib)
sub artikelnummer2 {
    main::mprint("testitem");
    return 'noinc';
}
-->                       

<script type="text/javascript">
    function mychecked() {
        var myElem = document.getElementById('__lib::artikelnummer2__');
        alert(myElem);
        myElem.value = "1";
        alert(myElem.value);
    }
</script>

<input name="test" type="radio" value="__lib::artikelnummer2__" onclick="mychecked(this);">
<input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer2__" value="0">

Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 15:43:37
wenn ich den JS-Code SO (mit <script...) direkt in die HTML-Vorlage schreibe, kommt jetzt die alert_meldung

" [objekt] "  und " 1 "

wenn ich es ohne <script> </script> in die externen js-Datei kopiere (wie ich es normalerweise mache), kommt
" Objekt erwartet "

Ist mir zwar nicht ganz klar, warum aber OK - Script direkt in die Vorlage schreiben statt in externe js-Datei ist das kleinste Problem.

Aber wenn ich jetzt (in der Vorlage)
<script type="text/javascript">
function checked()
{
document.getElementById('__lib::artikelnummer2__').value = "1";
}
</script>

schreibe, kommt auch " Objekt erwartet " 

Habe ich bei meinem JS-Script einen Fehler eingebaut?

Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 03, 2007, 16:13:39
Haben Sie die Funktion "checked" oder "mychecked" genannt?
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 16:32:17
oups

da habe ich den alten Code mit "checked" kopiert

Habs's jetzt auf "mychecked" ausgebessert
= KEINE Fehlermeldung mehr, aber der Crossartikel wird auch nicht in den WK gelegt

(http://www.woll-insel.at/Bilder/bestellen.gif)

(http://www.woll-insel.at/Bilder/Warenkorb.gif)

....wenn ich diese letzte Hürde noch schaffen könnte,,,,,,
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 03, 2007, 17:25:16
ich glaube, ich habe den Fehler gefunden (?)
(aber keine Lösung dafür  :()

habe testweise mal das geschrieben

function mychecked()
{
        var myElem = document.getElementById('__lib::artikelnummer2__');
        alert('__lib::artikelnummer2__');
        myElem.value = "1";
        alert(myElem.value);
    }
</script>


jetzt wird (bei ALLEN Crossartikeln) die Artikelnummer des Hauptartikels ausgegeben

d.h. __lib::artikelnummer2__ wird nicht durch die Cross-Artikelnr, ersetzt (aber nur für diese verwendet)
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 04, 2007, 06:46:38
Vielleicht (??) bin ich der Lösung einen kleinen Schritt näher gekommen:

Habe nach unendlich vielen Fehlversuchen einen Code gefunden, der in alert die jeweils richtige Artikelnummer ausgibt.
zur besseren Kontrolle habe ich bei jedem Crossartikel die Artikelnummer ausgegeben und das <input type "hidden"..> in der cross.txt Datei weggelassen

in externer JS-Datei:
function checkvalue (el)
{
    alert('<input type="hidden" name="' + el.value + ' " value="1" >');
}

in cross.txt:
<td><input name="test" type="radio" value="__lib::artikelnummer2__" onclick="checkvalue(this)"></td>

(http://www.woll-insel.at/Bilder/alert.gif)
(Rabiobox anklicken -> Alertmeldung)

Das funktioniert jetzt so bei allen Crossartikeln aber es nutzt mir noch nichts  ;)
Ich brauche ja keine Alertmeldung, sondern ein "wenn ausgewählt mit Hauptartikel in den WK legen"

komme nicht dahinter, wie ich das anstellen kann.......
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 04, 2007, 08:46:56
Liegen auch alle relevanten <input>s innerhalb des <form></form>?
Zu dem Zeitpunkt wo Sie auf "Bestellen" klicken müssen sich also mindestens

<input name="a__hauptartikel" value="1">
<input name="a__cross1" value="1">
<input type="submit">

innerhalb des <form></form> befinden.
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 04, 2007, 08:55:57
so schaut der komplette Code im Moment aus
Detailseite http://www.woll-insel.at/Bilder/temp.txt (http://www.woll-insel.at/Bilder/temp.txt)
cross.txt http://www.woll-insel.at/Bilder/cross.txt (http://www.woll-insel.at/Bilder/cross.txt)

<input name="a__hauptartikel" value="1"> funktioniert aber nicht, da damit nur der Hauptartikel (Einheit) in den WK gelegt wird und nicht die ausgewählte Menge
habe das so gelöst:

              <SELECT name="METER____artnr__" id="Liter" size="1" onchange="getFlaschen(this)" >
                <OPTION id="1" value="0,5">0.5 Liter</OPTION>
                <OPTION id="2" value="0,75">0.75 Liter</OPTION>            
                <OPTION id="3" value="1">1 Liter</OPTION>
              </SELECT>
           <input type="hidden" name="__print::xartnr__" value="1" size="1">  bestellen  __id__</td>

sub xartnr {
   my $out = qq |a____artnr__|;
    main::mprint($out);
}
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 04, 2007, 09:21:55
Gibt es schon eine URL unter der ich das mal testen kann?
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 04, 2007, 09:36:50
leider nein (läuft nur mit LiveView)

habe das aktuelle Shop Projekt (ohne Bilder und Detailbeschreibungstexte)  mal auf den Server gelegt
(link kommt per mail)
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 04, 2007, 17:23:54
ein halber  Erfolg:

Habe eine Scriptversion zusammengebastelt, die mit FF (ohne Fehlermeldung in der Konsole !) funktioniert  ;D

mit IE aber garnicht (kann nicht mal die Crossartikel anzeigen)   :'(

function checkvalue (el)
{
document.getElementById(el.value).value = "1";
}


und

<input name="test" type="radio" value="__lib::artikelnummer2__" onclick='checkvalue(this)'>
<input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer2__" value="0" >


was hat der besch...  IE gegen dieses Script?

NACHTRAG

HURRRAAAAA  ;D ;D  es funktioniert auch mit IE
(hatte noch "alte Leichen" - Codeschnipsel von vorherigen Versuchen-  herumliegen die quer geschossen haben)

Jetzt bleibt noch ein Problem:
ich müßte noch irgendeine Abfrageschleife einbauen - wenn man vor dem Absenden mehrere Radioboxen hintereinander anklickt, wird zwar nur die letzte als ausgewählt angezeigt, aber alle gesendet....

Hat jemand eine Idee, wie ich das angehen könnte?

Mein Versuch:
function checkvalue (el,__artnr__) {
if(document.getElementById(__artnr__).checked == false) {
document.getElementById(el.value).value = "0";
} else {
document.getElementById(el.value).value = "1";
}
}


mit
<input id="__artnr__" name="test" type="radio" value="__lib::artikelnummer5__" onblur='checkvalue(this)'>
<input type="hidden" name="__lib::artikelnummer2__" id="__lib::artikelnummer5__" value="0" >

funktioniert nicht.......
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 05, 2007, 16:50:02
Hallo dobra,

Sie könnten beim Aufbau der Seite per SSP eine globale Javascript-Variable schreiben lassen.
Das sollte dann ein JS-Array sein, das alle Artikelnummern enthält.

ZB __lib::printitemarray__
Gibt aus var m_items = new Array('itemid1', 'itemid2', 'itemid3');

In der Onclick-Funktion durchlaufen Sie dann dieses Array, holen sich dabei alle entsprechenden input's und setzten value="0".
Danach setzen Sie dann wie gehabt den angeklickten Artikel auf value="1".
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 05, 2007, 17:36:58
Hallo ahe,

beim 5.x lesen fange ich (sehr) langsam an, das zu verstehen  ;)

ich setze also mit onclick in der Radiobox zuerst alle Artikel auf value="0" und dann den ausgewählten auf "1" ?

Ist ja garnicht so kompliziert, wie's im ersten Moment ausgeschaut hat (wenn ich den ssp-Code schaffe)
- hoffentlich weiß mein Code dann auch, in welcher Reihenfolge er das machen soll  :D
Titel: Re: if Radio-Button checked
Beitrag von: ahe am Juli 06, 2007, 08:56:02
Zur Verdeutlichung mal ein kleines Beispiel zum einfügen von JS mittels SSP.

Das Script fügt die globale Variable wie oben beschrieben ein.
Voraussetzung ist, dass Crossartikel in "Ergänzung 4" eingetragen sind.

<!--spmacro:module(jstest)
sub printcrossartikelarray {
    my $index = shift;
    my $anzahl = shift;
   
    if ($index <= $anzahl) {
        my $cross = ssp::get_var_article('ergaenz4', $index);
               
        ## Liste der Artikelnummern liegt in einem String vor.
        ## Deshalb hier in ein Array aufsplitten und alle Elemente in einfachen Anführungszeichen setzten
        ## damit diese Elemente dann einfach so genommen und als Javascript-Text ausgegeben werden können.
        my @crossids = split(",", $cross);
        for (my $i = 0; $i < scalar(@crossids); $i++) {
            $crossids[$i] = "'" . $crossids[$i] . "'";
        }
       
        ## Ab hier das JS ins HTML-Dokument schreiben
        my $out = qq|<script type="text/javascript">|;
        ## Hier die globale Variable anlegen.
        ## join erzeugt einen String, der alle Elemente aus @crossids enthält und sie durch ',' trennt.
        $out .= "var m_itemids = new Array(" . join(",", @crossids) . ");";
        $out .= "</script>";
        main::mprint($out);
    }
}
-->
Titel: Re: if Radio-Button checked
Beitrag von: dobra am Juli 06, 2007, 16:31:11

(http://www.woll-insel.at/Bilder/smiley/gewonnen.gif)

ein ganz großes DANKE an ahe