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
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
}
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 ??
Wie sieht denn Ihr momentaner SSP-Code und HTML-Code aus?
@ ahe
mail unterwegs
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 .......... ::)
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.
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?
Gibt es auf der Seite noch ein zweites Element mit id="a__4542"?
nein
je nur 1x name="a__4542"
value="a__4542"
und id="a__4542"
Nennen Sie die Funktion mal mychecked ;)
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???
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.
alert Ausgabe
"__lib::artikelnummer2__"
wird also doch nicht ersetzt ???
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">
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?
Haben Sie die Funktion "checked" oder "mychecked" genannt?
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,,,,,,
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)
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.......
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.
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);
}
Gibt es schon eine URL unter der ich das mal testen kann?
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)
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.......
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".
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
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);
}
}
-->
(http://www.woll-insel.at/Bilder/smiley/gewonnen.gif)
ein ganz großes DANKE an ahe