Artikel ins Angebot übernehmen
Jnnbo
- mysql
- php
0 Jörg Reinholz0 Jnnbo
0 Kay0 1unitedpower
Moin,
ich habe irgendwie den Faden verloren. Meine Ausgangsdatei sieht so aus. Ich möchte jetzt den jeweiligen Artikel in mein Angebot übernehmen. Ich habe die Wahl zwischen Preis 1, Preis 2 und Preis 3.
Lege ich jetzt um jeden Artikel ein eigenes Formular und füge unter jeden Preis ein Radio Button ein? Oder wie würdet ihr dieses Problem angehen? Ich kenne es bis jetzt eben immer nur wenn ich einen Artikel auf einer Seite habe, dann wäre das für mich kein Problem.
Moin!
Was sind denn das für 3 Preise? Anhand welcher Kriterien ist die Auswahl zu treffen und bleibt diese nicht für alle Artikel konstant? Möglicherweise könnte eine Vorauswahl schon an anderer Stelle getroffen und z.B. in der Session gespeichert werden, so dass sich das Problem der Einzelauswahl erübrigt.
Jörg Reinholz
Hallo Jörg,
Was sind denn das für 3 Preise? Anhand welcher Kriterien ist die Auswahl zu treffen und bleibt diese nicht für alle Artikel konstant? Möglicherweise könnte eine Vorauswahl schon an anderer Stelle getroffen und z.B. in der Session gespeichert werden, so dass sich das Problem der Einzelauswahl erübrigt.
ich habe zu jedem Artikel drei Preise zur Verfügung, somit kann ich wenn ich mit einem Kunden telefoniere zwischen drei Preisen wählen. Somit weiß ich für mich, egal welcher Preis ich nehme ich zahle definitiv nicht drauf, Preis drei wäre natürlich immer am besten.
Und nein, ich kann erst an dieser Stelle die Preise anzeigen lassen, denn diese Seite erhalte ich, wenn ich nach einem Artikel gesucht habe.
Moin!
Hm. Also, auch wenn mir das Ganze irgendwie nicht gefällt...
Du hast offenbar bereits irgendwie, irgendwo ein Formular?
Dann mach die Preise zu Buttons und onclick einen 1-Zeiler, der den Preis in ein verstecktes - oder sichtbares Formularfeld übernimmt, ggf den Button einfäbt (und die anderen entfärbt (oder alle entfärbt und den angeklickten einfärbt.
Es geht auch jede andere Optik. Du kannst genau so gut radio-inputs nehmen, die ebenso reagieren.
Jörg Reinholz
Hallo Jörg,
Du hast offenbar bereits irgendwie, irgendwo ein Formular?
nein, derzeit habe ich noch kein Formular, da ich mir ja nicht sicher war wie ich dieses umsetzten kann. Hab irgendwie gehofft dass ich es ohne Radiobuttons umsetzten kann, dass ich die Preise als <button type="button">Preis 1</button> <button type="button">Preis 2</button> <button type="button">Preis 3</button> machen. Ich muss aber ja irgendwie ein Formular haben um den Preis und die ArtikelID zu übermitteln?
Dann mach die Preise zu Buttons und onclick einen 1-Zeiler, der den Preis in ein verstecktes - oder sichtbares Formularfeld übernimmt, ggf den Button einfäbt (und die anderen entfärbt (oder alle entfärbt und den angeklickten einfärbt.
Ok, den ersten Teil habe ich verstanden, das ist ja so wie oben bereits beschrieben? Aber was meinst du mit dem 1-Zeiler?
Hallo Jörg,
eine andere Idee, ich lass die Preise so stehen wie sie jetzt sind mach daraus ein Link und setzte die Werte mit in die URL: /fax-com/fax-com-337?artikel=KB-LC20008510&preis=10,99&artikelID=5847585
Moin!
eine andere Idee, ich lass die Preise so stehen wie sie jetzt sind mach daraus ein Link und setzte die Werte mit in die URL: /fax-com/fax-com-337?artikel=KB-LC20008510&preis=10,99&artikelID=5847585
Jörg Reinholz
Hallo Jörg,
- Und wie schickst Du die Faxnummer des Bestellers?
- Also braucht Du doch Javascript.
ich verstehe deine Frage nicht so ganz. Ich bin hier derzeit auf der Produkt Seite. Zu jedem Gerät gibt es mehrere Versionen, jede Version hat 3 Preise. Durch einen Klick auf den jeweiligen Preis möchte ich diese Version mit dem ausgewähltem Preis in mein Angebot übernehmen (in die Datenbank speichern) Was hat das mit Faxnummer zu tun?
Moin!
Was hat das mit Faxnummer zu tun?
Naja. Ich habe ja von dieser Geschichte nicht wirklich viel Code gesehen und keine detaillierte Vorstellung ... meine Glaskugel jedenfalls ließ mich vermuten, dass hinter
/fax-com/fax-com-337?
irgendwas mit einem Fax steckt, dass an den Kunde gehen soll. Aber natürlich kann das auch das Gerät sein, zu dem die Tinte passt.
Jörg Reinholz
Moin!
Ok, den ersten Teil habe ich verstanden, das ist ja so wie oben bereits beschrieben? Aber was meinst du mit dem 1-Zeiler?
Etwas wie:
onclick="document.getElementById('preis').innerHtml='31.67';"
Ich muss aber ja irgendwie ein Formular haben um den Preis und die ArtikelID zu übermitteln?
Tja. Wolltest Du es mit etwa mit Sprachsteuerung machen? Selbst für ein "Siri! Preis 2 übernehmen" brachst Du wohl was, womit Siri den Browser steuern kann. Üblicherweise ein Formular.
Jörg Reinholz
Hallo Jörg,
onclick="document.getElementById('preis').innerHtml='31.67';"
ich wollt es so umsetzten, aber irgendwie klappt es nicht, der Wert wird nicht in mein "value" geschrieben
<table>
<tr>
<td>Alternativ zu Brother LC-1000 Tinten Spar-Set (4xBK,je 2xC,M,Y) 10 Stück</td>
<td><button type="button" onclick="document.getElementById('preis').innerHtml='10,64';">Preis 1</button> - <button type="button" onclick="document.getElementById('artikel_id').innerHtml='10,99';" >Preis 2</button> - <button type="button" onclick="document.getElementById('artikel_id').innerHtml='11,64';">Preis 3</button></td>
<td>
<form method="post" action="test.php">
<input type="hidden" value="" name="preis" id="preis">
<input type="hidden" value="54785475" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</td>
</tr>
</table>
Wenn ich mit
<pre>
<?php
print_r($_POST);
?>
</pre>
ausgeben lasse, erhalte ich
Array ( [preis] => [artikel_id] => 54785475 [wk] => In den Warenkorb )
Der Preis wird also nicht übertragen.
EDIT: Hab es gesehen als ich es abgeschickt hatte, so geht es:
<button type="button" onclick="document.getElementById('preis').value ='10,64';">Preis 1</button> - <button type="button" onclick="document.getElementById('preis').value ='10,99';" >Preis 2</button> - <button type="button" onclick="document.getElementById('preis').value ='11,64';">Preis 3</button>
Jetzt ist noch die Frage, wie kann ich den aktuellen Button Farblich hervorheben bzw. die anderen etwas grauer darstellen? Hast du dazu noch eine Idee?
Hallo Jörg,
ich dachte ich hätte es gelöst bekommen, allerdings habe ich jetzt ein Problem, wenn ich mehrere Artikel einfüge, wie hier auf dem Bild zu sehen
Ich kann den Preis beim ersten Artikel ändern, beim zweiten Artikel allerdings wieder nichts mit übertragen, warum?
Hallo,
Ich kann den Preis beim ersten Artikel ändern, beim zweiten Artikel allerdings wieder nichts mit übertragen, warum?
weil du verbotenerweise zwei Elemente mit derselben ID im Dokument hast. Eine ID muss dokumentweit einzigartig sein; getElementById() findet in deinem Fall also immer nur das erste.
Übrigens würde ich die Werte, die du als value übergibst, gleich mit Dezimal_punkt_ notieren, dann kannst du sie serverseitig leichter auswerten. Dem Nutzer (dir?) kannst du sie ja im Element-Inhalt trotzdem mit Komma anzeigen.
So long,
Martin
Hallo Martin,
weil du verbotenerweise zwei Elemente mit derselben ID im Dokument hast. Eine ID muss dokumentweit einzigartig sein; getElementById() findet in deinem Fall also immer nur das erste.
Danke für den Hinweis, hab es abgeändert und es funktioniert. Ich lass hinter dem Preis einfach noch meine Datenbank ID mit dranhängen, so kann eine ID nicht mehrmals vorkommen
Übrigens würde ich die Werte, die du als value übergibst, gleich mit Dezimal_punkt_ notieren, dann kannst du sie serverseitig leichter auswerten. Dem Nutzer (dir?) kannst du sie ja im Element-Inhalt trotzdem mit Komma anzeigen.
Ok, habe ich auch geändert, ich hätte die Werte im Formular welches für das PDF zuständig ist, die Zahlen nochmals geändert.
Jetzt habe ich nur noch eine Frage und zwar wie kann ich dafür sorgen dass der geklickte Button eine andere Farbe bekommt, dass ich einfach sehe, was derzeit ausgewählt ist. Jörg meinte gestern Abend, es wäre irgendwie möglich. Hast du da vielleicht eine Idee oder kannst du mir sagen, nach was ich suchen soll?
Hallo Martin,
Jetzt habe ich nur noch eine Frage und zwar wie kann ich dafür sorgen dass der geklickte Button eine andere Farbe bekommt, dass ich einfach sehe, was derzeit ausgewählt ist. Jörg meinte gestern Abend, es wäre irgendwie möglich. Hast du da vielleicht eine Idee oder kannst du mir sagen, nach was ich suchen soll?
Ok, das geht so.
<button type="button" id="1" onclick="document.getElementById('preis').value ='10.64'; document.getElementById('1').style.backgroundColor = '#efefef';">10,64 €</button>
Ist es eigentlich möglich ein geklickter Button auch wieder zu entklicken? :)
Moin,
um die Buttons hervorzuheben füge ich beim Klick eine CSS Class hinzu, wenn ich auf den zweiten Button klicke, wird diese beim ersten und beim dritten Button wieder entfernt, dieses setzte ich so um
Geht dieses auch einfacher, denke ich wieder viel zu kompliziert? Und ist es möglich ein Button komplett zu "entklicken" dass der Wert wieder gelöscht wird, wenn ich ein zweites mal auf den Button klicke?
Moin,
hab noch eine weitere Frage, einem "hidden" Feld kann man wohl kein required mitgeben oder? Wollte es so testen
<input type="hidden" value="" name="preis" id="preis-000002" required>
Mein HTML Code sieht wie hier gezeigt aus. Kann derzeit einfach mein Formular ohne einem Preis abschicken, was nicht wirklich toll ist.
hab noch eine weitere Frage, einem "hidden" Feld kann man wohl kein required mitgeben oder?
Nein, die Spzezifikation ist da eindeutig:
Constraint validation: If an input element's type attribute is in the Hidden state, it is barred from constraint validation.
Hallo 1unitedpower,
Nein, die Spzezifikation ist da eindeutig:
habe ich dann irgendwie eine andere Möglichkeit zu prüfen ob ein Preis geklickt wurde?
Hallo,
habe ich dann irgendwie eine andere Möglichkeit zu prüfen ob ein Preis geklickt wurde?
ich prüfen nun das ganze mit PHP, ob ein Preis übergeben wurde, das geht auch bei einem hidden Feld
if(isset($_POST['wk'])){
if(!empty($_POST['preis'])){
echo "<pre>";
print_r($_POST);
echo "</pre>";
}
else {
echo "Bitte ein Preis wählen";
}
}
ich prüfen nun das ganze mit PHP, ob ein Preis übergeben wurde, das geht auch bei einem hidden Feld
Das musst du sowieso machen. Clientseitige Validierung macht serverseitige Validierung nämlich nicht obsolet. Du musst immer davon ausgehen, dass Daten bei deinem Server eintreffen, die nicht das erwartete Format haben. Zum Beispiel, weil jemand deinen Server absichtlich mit falschen Daten füttert. Wenn du deine Formulare also keiner serverseitigen Überprüfung unterziehst, dann gehst du damit enorme Sicherheitsrisiken ein.
Auf der anderen Seite, brauchst du trotzdem clientseitge Validierung, denn das hilft deinen Nutzern dabei, das Formular korrekt auszufüllen. Wenn du das nicht machst, behinderst du Menschen, zum Beispiel solche, die nicht sehen können.
Hallo 1unitedpower,
Das musst du sowieso machen. Clientseitige Validierung macht serverseitige Validierung nämlich nicht obsolet. Du musst immer davon ausgehen, dass Daten bei deinem Server eintreffen, die nicht das erwartete Format haben. Zum Beispiel, weil jemand deinen Server absichtlich mit falschen Daten füttert. Wenn du deine Formulare also keiner serverseitigen Überprüfung unterziehst, dann gehst du damit enorme Sicherheitsrisiken ein.
wenn die Seite im Netz wäre würde ich dir sofort zustimmen aber die Seite ist nur für mich wenn ein Kunde anruft und ein Toner bestellen will, klicke ich auf einen der drei Preise und dieser Wert wird in die Datenbank übertragen
Im ganzen sieht es später dann so aus
Das erste muss ich mit dem zweiten noch verbinden, will aber zum testen nicht ständig in meinen fertigen Dateien fummeln.
Auf der anderen Seite, brauchst du trotzdem clientseitge Validierung, denn das hilft deinen Nutzern dabei, das Formular korrekt auszufüllen. Wenn du das nicht machst, behinderst du Menschen, zum Beispiel solche, die nicht sehen können.
Solange ICH noch sehen kann ist alles gut :) Wie gesagt die Seite wird nicht für die Öffentlichkeit sein und nur ICH tragen die Daten ein.
@@Jnnbo
Da isser wieder, der Kapitalfehler:
print_r($_POST);
Niemals Daten unbearbeitet in HTML-Code schreiben!!![^1]
Es muss
print_r(htmlspecialchars($_POST));
heißen, sonst Sicherheitslücke.
(Warum verwendest du hier eigentlich print_r()
anstatt echo
?)
LLAP
Tach!
Da isser wieder, der Kapitalfehler:
print_r($_POST);
Niemals Daten unbearbeitet in HTML-Code schreiben!!![^1]
Ganz ruhig, Brauner! Das ist eine Test-Ausgabe, die gleich darauf wieder aus dem Code verschwindet. print_r() ist wie var_dump() keine Funktion, die man in der Produktivumgebung stehen hat. Allenfalls ein <pre> vorher ist sinnvoll. Selbst ein </pre> danach hat meist keinen gesteigerten Wert. Das kaputte Rendering der restlichen Seite ist zu dem Zeitpunkt egal, wenn es nur darum geht, Variableninhalte zu prüfen. Es ist jedenfalls nicht davon auszugehen, dass jemand, der diese Funktionen verwendet, sich selbst mit XSS angreift. Zu viel Postillon gelesen?
(Warum verwendest du hier eigentlich
print_r()
anstattecho
?)
Weil es nur eine Testausgabe ist und print_r() was ganz anderes macht als echo, besonders bei Arrays.
dedlfix.
@@dedlfix
Nun mach mal halblang! Das ist eine Test-Ausgabe, die gleich darauf wieder aus dem Code verschwindet.
Wer das mit der kontextspezifischen Behandlung von Daten verinnerlicht hat, macht das immer. Wer das nicht verinnerlicht hat, macht es auch sonst nicht. Deshalb halte ich den Hinweis auch hier für angebracht.
Es ist jedenfalls nicht davon auszugehen, dass jemand, der diese Funktionen verwendet, sich selbst mit XSS angreift.
Hat Jnnbo vielleicht hier im Thread oder in einem anderen den URI zu seiner (Test-)Seite preisgegeben? Während er/sie seine Seite testet, könnten andere das auch tun.
LLAP
Tach!
Ganz ruhig, Brauner! Das ist eine Test-Ausgabe, die gleich darauf wieder aus dem Code verschwindet.
Wer das mit der kontextspezifischen Behandlung von Daten verinnerlicht hat, macht das immer. Wer das nicht verinnerlicht hat, macht es auch sonst nicht. Deshalb halte ich den Hinweis auch hier für angebracht.
Wer das weiß, weiß wann man das machen muss und macht das nicht stur nach einer Regel - und sich dabei die Daten kaputt. $_POST ist ein Array. Wenn du das durch htmlspecialchars() schickst, kommt das Wort „Array“ raus. Dessen Anwendung ist also nicht nur überflüssig sondern sogar falsch. Wenn du es denn unbedingt kontextgerecht ausgeben lassen willst, musst du sowas wie
echo htmlspecialchars(print_r($_POST, true));
notieren. Das ist viel zu viel Aufwand für eine schnöde Testausgabe. Selbst wenn man das in eine Funktion auslagert - die muss man ja dann auch noch einzubinden nicht vergessen.
Es ist jedenfalls nicht davon auszugehen, dass jemand, der diese Funktionen verwendet, sich selbst mit XSS angreift.
Hat Jnnbo vielleicht hier im Thread oder in einem anderen den URI zu seiner (Test-)Seite preisgegeben? Während er/sie seine Seite testet, könnten andere das auch tun.
Und? Meinst du, die greifen sich dann an? Oder die Testausgabe bleibt lang genug drin, dass es jemandem gelingt, anderen daraus eine Falle zu bauen? Gib mal bitte ein Beispiel, was man schlimmstenfalls damit anrichten kann.
dedlfix.
Hallo Gunnar,
Hat Jnnbo vielleicht hier im Thread oder in einem anderen den URI zu seiner (Test-)Seite preisgegeben? Während er/sie seine Seite testet, könnten andere das auch tun.
nein, geht auch schlecht, da ich meine Seite mit http://localhost/toner/ aufrufe.
Moin!
Hat Jnnbo vielleicht hier im Thread oder in einem anderen den URI zu seiner (Test-)Seite preisgegeben? Während er/sie seine Seite testet, könnten andere das auch tun.
Selbst wenn. Überleg mal, wen oder was er dann mit
Daten -> sein Browser -> Server (direkte Ausgabe, kein Speichern!) -> sein Browser
angreifen könnte. Das ist wie der Ping of Death auf die 127.0.0.1.
Jörg Reinholz
Nun mach mal halblang! Das ist eine Test-Ausgabe, die gleich darauf wieder aus dem Code verschwindet.
Wer das mit der kontextspezifischen Behandlung von Daten verinnerlicht hat, macht das immer. Wer das nicht verinnerlicht hat, macht es auch sonst nicht.
LOL. Ein weiteres Indiz für Gunnars privilegierte Arbeitsweise.
Moin!
LOL. Ein weiteres Indiz für Gunnars privilegierte Arbeitsweise.
Wieso ist eine binär dargestellte 5 (und woher hast Du die?) ein "Indiz für Gunnars privilegierte Arbeitsweise"?
Jörg Reinholz
@@Jnnbo
um die Buttons hervorzuheben füge ich beim Klick eine CSS Class hinzu, wenn ich auf den zweiten Button klicke, wird diese beim ersten und beim dritten Button wieder entfernt
Es gibt keine CSS-Klassen.
Es gibt die Pseudoklasse :active
, die ein Button dann hat, wenn er geclickt ist.
Geht dieses auch einfacher, denke ich wieder viel zu kompliziert?
Ja, das tust du. Zur Auwahl einer aus mehrern Möglichkeiten gibt es in HTML native Elemente: eine Gruppe von Radiobuttons und select
/option
(wobei erstere Vorteile haben).
Diese Funktionalität mit anderen Elementen (button
) und JavaScript nachbauen zu wollen, ist Unsinn. Das führt dazu, dass die Seite nicht mehr barrierefrei bedienbar ist, TL;DR also nicht bedienbar ist. Man müsste enormen Aufwand betreiben, um die Barrierefreiheit wieder herzustellen.
Besser ist es, immer die passenden HTML-Elemente zu verwenden. Die lassen sich mit CSS stylen, bspw. die Radiobuttons selbst verstecken und die Labels wie Buttons aussehen zu lassen. (Beispiel)
Und ist es möglich ein Button komplett zu "entklicken" dass der Wert wieder gelöscht wird, wenn ich ein zweites mal auf den Button klicke?
Auch das Problem erfreut sich bei Verwendung der richtigen HTML-Elemente seiner Nichtexistenz.
LLAP
Hallo Gunnar,
Besser ist es, immer die passenden HTML-Elemente zu verwenden. Die lassen sich mit CSS stylen, bspw. die Radiobuttons selbst verstecken und die Labels wie Buttons aussehen zu lassen. (Beispiel)
Von den Buttons bin ich mitlerweile auch komplett weg, wie du in diesem Beispiel sehen kannst http://forum.selfhtml.org/self/2015/may/30/artikel-ins-angebot-uebernehmen/1641893#m1641893
Wahnsinn, was man alles mit Radiobuttons anstellen kann. Ich muss mal schauen ob ich dein Beispiel für meine Sache verwenden kann um die Radiobuttons wie "normale" Buttons aussehen zu lassen.
Moin!
Wahnsinn, was man alles mit Radiobuttons anstellen kann. Ich muss mal schauen ob ich dein Beispiel für meine Sache verwenden kann um die Radiobuttons wie "normale" Buttons aussehen zu lassen.
Grob dargestellt wäre das hier ein Weg:
<span class="foo_spans">
<input type="radio" id="foo1" name="foo" class="foos">
<label id="foo1_label" for="foo1">foo</label>
</span>
input.foos {
border:0;
}
span.foo_spans {
border: 2px solid gray;
}
Natürlich ist da noch allerhand Feinarbeit zu leisten.
Jörg Reinholz
@@Jnnbo
print_r($_POST);
Oh, die eindringliche Ermahnung gehörte bereits hier hin.
LLAP
Tach!
print_r($_POST);
Oh, die eindringliche Ermahnung gehörte bereits hier hin.
Nein, siehe Antwort dort. Das ist ein Irrtum deinerseits.
dedlfix.
Moin Moin,
nur mal so ins Blaue geschossen. Warum tust du dir das an?
Wenn ich das richtig sehe, brauchst du sowas wie eine webbasierte open source Wawi. Auftrag, Lieferschein, Rechnung, Gutschrift. Hast du nur Endverbraucher als Kunden oder auch Firmen? Ausweisung der MWSt, spätesten wenn die Kleinunternehmerregel nach § 19 UStG nicht mehr greift.
Die Suchmaschine wirft genügend aus. Je nach Anforderung hast du auch gleich eine Buchhaltung, Lagerverwaltung, Lieferantenverwaltung oder Kundenverwaltung etc. dabei.
WaWi(Warenwirtschat), ERP, CRM, webbasiert sind Stichworte für die open source Suche.
Oder als Schnellübersicht
Es gibt einige Leichtgewichte.
openz oder nuclos sind vielleicht schon zu überdimensioniert für dich.
Lege ich jetzt um jeden Artikel ein eigenes Formular und füge unter jeden Preis ein Radio Button ein?
Ja, entweder mit Radio-Buttons. Oder, wenn es für den User nur ein Klick sein soll, dann benutz jeweils für einen Preis einen Submit-Button.
Das JavaScript-Gefummel vergiss mal schnell wieder. Ein JavaScript-Entwickler, der sich nicht mit der grundlegenden und weiterführenden Anatomie von Formularen auskennt, ist ein Elefant im Porzelanladen.
Hallo 1unitedpower,
Ja, entweder mit Radio-Buttons. Oder, wenn es für den User nur ein Klick sein soll, dann benutz jeweils für einen Preis einen Submit-Button.
nein, das ist jetzt schon zu spät, ich sitze an dem ganzen Krempel schon den ganzen Tag um dieses hinzubekommen gestern Abend hat man mir noch die Buttons empfohlen jetzt stelle ich gewiss nicht wieder alles um.
Und warum sollte ich auf das JS verzichten? Jedesmal Seiten neu laden ist auch nicht wirklich gut. Ich muss eben ein paar Videos anschauen wie so etwas umgesetzt wird oder mir ein Script aus dem Netz ziehen.
Ja, entweder mit Radio-Buttons. Oder, wenn es für den User nur ein Klick sein soll, dann benutz jeweils für einen Preis einen Submit-Button.
nein, das ist jetzt schon zu spät,
Hast du deine Lösung denn schon veröffentlich? Nein? Dann sehe ich auch noch Hoffnung, deine bisherigen Fehler wieder auszubügeln, noch ist nichts zu spät.
ich sitze an dem ganzen Krempel schon den ganzen Tag
Das sollte kein Grund sein, an deiner Lösung festzuhalten. Eher noch, um sie abzustreifen.
Und warum sollte ich auf das JS verzichten?
Weil du nur Schaden anrichtest, weil dir das nötige Grundlagenwissen fehlt. Du hast bisher mit viel Aufwand versuchst, das Verhalten von Radiobutton-Gruppen nachzubauen. Wieso benutzt du nicht einfach Radiobuttons, so wie es dir deine Intention schon ganz am Anfang vermittelt hat? In deinem ersten Posting warst du schon auf der richtigen Spur, aber ohne zu Erläutern, worin das Problem mit dieser Lösung besteht, hast du unmittelbar damit begonnen, nach einer anderen Lösung zu suchen.
Mit dem JavaScript-Ansatz, den du bisher verfolgst, wirst du jedenfalls nicht weit kommen. Du hast bereits die natürliche Constraint-Validierungs deines Browsers geschickt außer Kraft gesetzt
Jedesmal Seiten neu laden ist auch nicht wirklich gut.
Dazu habe ich auch nicht geraten.
Ich muss eben ein paar Videos anschauen wie so etwas umgesetzt wird oder mir ein Script aus dem Netz ziehen.
Oder du eignest dir selber das nötige Wissen, um solche Aufgaben zukünftig selbstständig erarbeiten zu können.
Hallo 1unitedpower,
Hast du deine Lösung denn schon veröffentlich? Nein? Dann sehe ich auch noch Hoffnung, deine bisherigen Fehler wieder auszubügeln, noch ist nichts zu spät.
natürlich, da man hier nur 5? Minuten editieren kann, muss ich jedesmal neu Anfangen, deshalb über mehrere Beiträge verteilt:
http://forum.selfhtml.org/self/2015/may/30/artikel-ins-angebot-uebernehmen/1641861#m1641861
Und hier
http://forum.selfhtml.org/self/2015/may/30/artikel-ins-angebot-uebernehmen/1641874#m1641874
Das sollte kein Grund sein, an deiner Lösung festzuhalten. Eher noch, um sie abzustreifen.
Ich muss eben viel bei Google suchen und dann verstehen wie es umgesetzt wurde, braucht eben alles seine Zeit und ich muss nebenher auch noch bisschen Geld verdienen.
Mit dem JavaScript-Ansatz, den du bisher verfolgst, wirst du jedenfalls nicht weit kommen. Du hast bereits die natürliche Constraint-Validierungs deines Browsers geschickt außer Kraft gesetzt
Warum komme ich damit nicht weit? Außerdem hat man mir genau dieses Vorgehen empfohlen:
http://forum.selfhtml.org/self/2015/may/30/artikel-ins-angebot-uebernehmen/1641843#m1641843
Da ich mich damit nicht auskennen muss ich mich drauf verlassen was andere sagen und Jörg hat bis jetzt immer nur Ideen geliefert.
Hast du deine Lösung denn schon veröffentlich? Nein? Dann sehe ich auch noch Hoffnung, deine bisherigen Fehler wieder auszubügeln, noch ist nichts zu spät.
natürlich, da man hier nur 5? Minuten editieren kann, muss ich jedesmal neu Anfangen, deshalb über mehrere Beiträge verteilt:
Du hast mich missverstanden, die Frage war, ob du deine Lösungsansatz bereits auf der Webseite deines Kunden integriert hast. Den Thread hier habe ich schon durchgelesen.
Das sollte kein Grund sein, an deiner Lösung festzuhalten. Eher noch, um sie abzustreifen.
Ich muss eben viel bei Google suchen und dann verstehen wie es umgesetzt wurde, braucht eben alles seine Zeit und ich muss nebenher auch noch bisschen Geld verdienen.
Du willst dem Browser etwas beibringen, dass er selber längst kann. Die Zeit kannst du dir komplett sparen, indem du einfach die richtigen Werkzeuge benutzt. Du hast momentan nur einen Hammer in deinem Werkzeugkasten und deshalb sieht für die alles aus wie ein Nagel. Wenn das Ding, was du im Holz versenken willst, ein Gewinde hat, dann solltest du nochmal in dich kehren und überlegen, ob es nicht ein passenderes Werkzeug gibt.
Mit dem JavaScript-Ansatz, den du bisher verfolgst, wirst du jedenfalls nicht weit kommen. Du hast bereits die natürliche Constraint-Validierungs deines Browsers geschickt außer Kraft gesetzt
Warum komme ich damit nicht weit?
Du hast doch selber geschrieben, dass du schon seit über einen Tag an der Lösung arbeitest. Und es stehen weiterhin ungelöste Probleme im Raum.
Außerdem hat man mir genau dieses Vorgehen empfohlen:
Du kannst das wohl kaum eine Empfehlung von Jörg nennen, denn er seit Unwohlsein mit der Lösungsvorschlag, gleich zu Anfang zum Ausdruck gebracht:
Hm. Also, auch wenn mir das Ganze irgendwie nicht gefällt...
Da ich mich damit nicht auskennen muss ich mich drauf verlassen was andere sagen und Jörg hat bis jetzt immer nur Ideen geliefert.
Du solltest dich aber stumpfsinnig darauf verlassen, was andere dir mitteilen. Du solltest versuchen die Argumente nachzuvollziehen und dann selber abwägen.
Hallo 1unitedpower,
Du willst dem Browser etwas beibringen, dass er selber längst kann. Die Zeit kannst du dir komplett sparen, indem du einfach die richtigen Werkzeuge benutzt. Du hast momentan nur einen Hammer in deinem Werkzeugkasten und deshalb sieht für die alles aus wie ein Nagel. Wenn das Ding, was du im Holz versenken willst, ein Gewinde hat, dann solltest du nochmal in dich kehren und überlegen, ob es nicht ein passenderes Werkzeug gibt.
na gut, dann setzte ich es eben so um
dann waren zwar bestimmt 5 - 6 Stunden für den Arsch aber OK, damit muss ich eben leben. Aber hat das jetzt ein Vor- bzw. Nachteil?
na gut, dann setzte ich es eben so um
Die for-Attribute in den label-Elementen sollten sich immer auf die id eines Radiobuttons beziehen. Alternativ kann ein label-Element auch das Eingabefeld, das dazu gehört, umschließen.
Du musst dein Markup auch nochmal auf Fehler überprüfen. Ein Formular kann nicht einfach inmitten zwischen zwei <td>-Elementen geöffnet werden.
Jedes Produkt in deiner Liste braucht übrigens eine eigene Gruppe Radiobuttons. Die Gruppenzugehörigkeit wird über das name-Attribut der Radiobuttons festgemacht. Du kannst die Radiobuttons also nicht bei jeder Produkt wieder "preis" nennen. Die Gruppen müssen sich unterscheiden, das kannst du zum beispiel über einen numerischen Index machen, etwa so:
<input name="preis[1]" type="radio" value="42">
<input name="preis[1]" type="radio" value="1337">
Und die nächste Gruppe hat einen Index von 2:
<input name="preis[2]" type="radio" value="42">
<input name="preis[2]" type="radio" value="1337">
Aber hat das jetzt ein Vor- bzw. Nachteil?
Vorteile:
Nachteile:
Hallo 1unitedpower,
Die for-Attribute in den label-Elementen sollten sich immer auf die id eines Radiobuttons beziehen. Alternativ kann ein label-Element auch das Eingabefeld, das dazu gehört, umschließen. Du musst dein Markup auch nochmal auf Fehler überprüfen. Ein Formular kann nicht einfach inmitten zwischen zwei <td>-Elementen geöffnet werden.
danke für deine Erklärung, hab nun meine HTML Datei etwas angepasst, die Tabellen sollten später eh raus fliegen, diese hatte ich nur drin um zu schauen wie es ausschaut, jetzt sieht es so aus
<section>
<h2>Artikel</h2>
<article>
<h3>Alternativ zu Brother LC-1000 Tinten Spar-Set (4xBK,je 2xC,M,Y) 10 Stück</h3>
<form method="post" action="moin123.php">
<input type="radio" name="preis" value="14.64">14,64 €
<input type="radio" name="preis" value="10.99">10,99 €
<input type="radio" name="preis" value="11.64">11,64 €
<input type="hidden" value="000001" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</article>
<article>
<h3>Original Brother TN-1050 Toner Black</h3>
<form method="post" action="moin123.php">
<input type="radio" name="preis" value="31.61">31,61 €
<input type="radio" name="preis" value="32.40">32,40 €
<input type="radio" name="preis" value="33.20">33,20 €
<input type="hidden" value="000002" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</article>
</section>
<?php
if(isset($_POST['wk'])){
if(!empty($_POST['preis'])){
echo "<pre>";
print_r($_POST);
echo "</pre>";
}
else {
echo "<div class=\"alert alert-danger\">Bitte ein Preis wählen</div>";
}
}
?>
Jedes Produkt in deiner Liste braucht übrigens eine eigene Gruppe Radiobuttons. Die Gruppenzugehörigkeit wird über das name-Attribut der Radiobuttons festgemacht.
Da pro Formular immer nur ein Artikel vorkommt, kann ich es doch so lassen, wie ich es oben umgesetzt habe?
Da pro Formular immer nur ein Artikel vorkommt, kann ich es doch so lassen, wie ich es oben umgesetzt habe?
Ja, das löst das Problem mit den verschiedenen Gruppen von Radio-Buttons. Das Markup gefällt mir auch schon viel besser, als bei deinem letzten Versuche. Ein paar Dinge, solltest du aber noch verbessern.
Du hast die <label>-Elemente nun leider rausgeworfen, die solltest du wieder aufnehmen. Sie verliehen deinem Formular wesentlich sinnbringende Semantik.
Du hast mal erwähnt, dass der Preis ein Pflichtfeld sein soll. Du solltest also noch das required-Attribut vergeben. Es reicht aus, wenn jeweils ein Radiobutton innerhalb einer Radiobutton-Gruppe das required-Attribut besitzt, um die ganze Gruppe verpflichtend zu machen.
Die Fehler, die von deiner PHP-Überprüfung festgellt werden, sollten direkt an den betroffenen Feldern ausgegeben werden, und nicht irgendwo ihres Kontextes entrissen am Anfang oder Ende des Formulars ausgegeben werden.
Hallo 1unitedpower,
- Du hast die <label>-Elemente nun leider rausgeworfen, die solltest du wieder aufnehmen. Sie verliehen deinem Formular wesentlich sinnbringende Semantik.
Ok, habe ich nun geändert, ist es so richtig?
<section>
<h2>Artikel</h2>
<article>
<h3>Alternativ zu Brother LC-1000 Tinten Spar-Set (4xBK,je 2xC,M,Y) 10 Stück</h3>
<form method="post" action="moin123.php">
<input type="radio" name="preis" id="000001-preis1" value="14.64" required>
<label for="000001-preis1">14,64 €</label>
<input type="radio" name="preis" id="000001-preis2" value="10.99">
<label for="000001-preis2">10,99 €</label>
<input type="radio" name="preis" id="000001-preis3" value="11.64">
<label for="000001-preis3">11,64 €</label>
<input type="hidden" value="000001" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</article>
<article>
<h3>Original Brother TN-1050 Toner Black</h3>
<form method="post" action="moin123.php">
<input type="radio" name="preis" id="000002-preis1" value="31.61" required>
<label for="000002-preis1">31,61 €</label>
<input type="radio" name="preis" id="000002-preis2" value="32.40">
<label for="000002-preis2">32,40 €</label>
<input type="radio" name="preis" id="000002-preis3" value="33.20">
<label for="000002-preis3">33,20 €</label>
<input type="hidden" value="000002" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</article>
</section>
- Du hast mal erwähnt, dass der Preis ein Pflichtfeld sein soll. Du solltest also noch das required-Attribut vergeben. Es reicht aus, wenn jeweils ein Radiobutton innerhalb einer Radiobutton-Gruppe das required-Attribut besitzt, um die ganze Gruppe verpflichtend zu machen.
Habe ich auch eingefügt.
- Die Fehler, die von deiner PHP-Überprüfung festgellt werden, sollten direkt an den betroffenen Feldern ausgegeben werden, und nicht irgendwo ihres Kontextes entrissen am Anfang oder Ende des Formulars ausgegeben werden.
Ja, das würde ich auch viel lieber machen, das würde dann bedeuten, ich muss diesen Block nach jedem Formular einfügen?
if(isset($_POST['wk'])){
if(!empty($_POST['preis'])){
echo "<pre>";
print_r($_POST);
echo "</pre>";
}
else {
echo "<div class=\"alert alert-danger\">Bitte ein Preis wählen</div>";
}
}
Ok, habe ich nun geändert, ist es so richtig?
So langsam macht das Formular einen richtig guten Eindruck.
- Die Fehler, die von deiner PHP-Überprüfung festgellt werden, sollten direkt an den betroffenen Feldern ausgegeben werden, und nicht irgendwo ihres Kontextes entrissen am Anfang oder Ende des Formulars ausgegeben werden.
Ja, das würde ich auch viel lieber machen, das würde dann bedeuten, ich muss diesen Block nach jedem Formular einfügen?
So ähnlich könntest du vorgehen, allerdings würde das jetzt noch dazu führen, dass die Fehlermeldung bei jedem Formular angezeigt werden würde, unabhängig davon, welches Formular überhaupt ausgefüllt und versendet wurde. Du müsstest also vorher noch prüfen, auf welchen Artikel sich die Fehlermeldung eigentlich bezieht. Dazu kannst du Artikel-ID benutzen, die du ja von dem Hiddenfeld übermittelt bekommst.
Kopieren von Codeausschnitten ist außerdem ein Indiz dafür, dass man den Code besser organisieren könnte, zum Beispiel indem du den Codeausschnitt in eine wiederverwendbare Funktion packst und die Stellen, die sich unterscheiden können, durch Parameter generalisierst. Viele Entwickler versuchen sogar, sich möglichst nie zu wiederholen, das Prinzip heißt "Don't repeat yourself" kurz DRY, also "Wiederhole dich nicht selbst".
Hallo 1unitedpower,
So ähnlich könntest du vorgehen, allerdings würde das jetzt noch dazu führen, dass die Fehlermeldung bei jedem Formular angezeigt werden würde, unabhängig davon, welches Formular überhaupt ausgefüllt und versendet wurde. Du müsstest also vorher noch prüfen, auf welchen Artikel sich die Fehlermeldung eigentlich bezieht. Dazu kannst du Artikel-ID benutzen, die du ja von dem Hiddenfeld übermittelt bekommst.
Hab es nochmals leicht überarbeitet, was sagst du dazu?
<?php
if(isset($_POST['wk'])){
if(!empty($_POST['preis'])){
echo "<pre>";
print_r($_POST);
echo "</pre>";
}
else {
$error = "Bitte ein Preis wählen";
}
}
?>
<section>
<h2>Artikel</h2>
<article>
<h3>Alternativ zu Brother LC-1000 Tinten Spar-Set (4xBK,je 2xC,M,Y) 10 Stück</h3>
<?php if(isset($_POST['wk']) && ($_POST['artikel_id'] == "000001")
&& empty($error) === false) {echo $error;} ?>
<form method="post" action="moin123.php">
<input type="radio" name="preis" id="000001-preis1" value="14.64">
<label for="000001-preis1">14,64 €</label>
<input type="radio" name="preis" id="000001-preis2" value="10.99">
<label for="000001-preis2">10,99 €</label>
<input type="radio" name="preis" id="000001-preis3" value="11.64">
<label for="000001-preis3">11,64 €</label>
<input type="hidden" value="000001" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</article>
<article>
<h3>Original Brother TN-1050 Toner Black</h3>
<?php if(isset($_POST['wk']) && ($_POST['artikel_id'] == "000002")
&& empty($error) === false) {echo $error;} ?>
<form method="post" action="moin123.php">
<input type="radio" name="preis" id="000002-preis1" value="31.61">
<label for="000002-preis1">31,61 €</label>
<input type="radio" name="preis" id="000002-preis2" value="32.40">
<label for="000002-preis2">32,40 €</label>
<input type="radio" name="preis" id="000002-preis3" value="33.20">
<label for="000002-preis3">33,20 €</label>
<input type="hidden" value="000002" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
</article>
</section>
Viele Entwickler versuchen sogar, sich möglichst nie zu wiederholen, das Prinzip heißt "Don't repeat yourself" kurz DRY, also "Wiederhole dich nicht selbst".
Würde ich auch gerne, aber ich wüsste nicht, wie ich diesen PHP Code nun noch weiter kürzen kann / soll.
Würde ich auch gerne, aber ich wüsste nicht, wie ich diesen PHP Code nun noch weiter kürzen kann / soll.
Das ist schon ein sehr prägnanter Code. Man könnte ihn noch weiter organsieren, aber das solltest du nicht mehr heute machen. Freue dich über den Lernerfolg, den du heute schon erreicht hast. In wenigen Stunden konnten wir eine Lösung erarbeiten, die eleganter und robuster als dein erster Lösungsversuch ist, für den du einen ganzen Tag gebraucht hast. Lese dir die Diskussion noch ein mal durch, versuche die Argumente noch einmal nachzuvollziehen und lass dann deinen Erfolg auf dich wirken, bevor du dich der nächsten Herausforderung stellst.
Hallo 1unitedpower,
eine Frage zur Ausgabe, ich kann scheinbar mein Ausgabe so
echo "<form method=\"post\" action=\"\">
<input type=\"radio\" name=\"preis\" id=\"000001-preis1\" value=\"14.64\">
<label for=\"000001-preis1\">$preis1 €</label>
<input type=\"radio\" name=\"preis\" id=\"000001-preis2\" value=\"10.99\">
<label for=\"000001-preis2\">$preis2 €</label>
<input type=\"radio\" name=\"preis\" id=\"000001-preis3\" value=\"11.64\">
<label for=\"000001-preis3\">".$preis3." €</label>
<input type=\"hidden\" value=\"000001\" name=\"artikel_id\">
<input type=\"submit\" name=\"wk\" value=\"In den Warenkorb\">
</form>";
oder auch so ausgeben lassen:
echo "<form method=\"post\" action=\"\">
<input type=\"radio\" name=\"preis\" id=\"000001-preis1\" value=\"14.64\">
<label for=\"000001-preis1\">$preis1 €</label>
<input type=\"radio\" name=\"preis\" id=\"000001-preis2\" value=\"10.99\">
<label for=\"000001-preis2\">$preis2 €</label>
<input type=\"radio\" name=\"preis\" id=\"000001-preis3\" value=\"11.64\">
<label for=\"000001-preis3\">$preis3 €</label>
<input type=\"hidden\" value=\"000001\" name=\"artikel_id\">
<input type=\"submit\" name=\"wk\" value=\"In den Warenkorb\">
</form>";
Was ist denn nun besser? Es kommt mir auf diese Schreibweise an
<label for=\"000001-preis3\">".$preis3." €</label>
<label for=\"000001-preis3\">$preis3 €</label>
Beide Varianten scheinen richtig zu funktionieren.
Tach!
Was ist denn nun besser? Es kommt mir auf diese Schreibweise an
<label for=\"000001-preis3\">".$preis3." €</label> <label for=\"000001-preis3\">$preis3 €</label>
Keins von beiden. Oder gefällt es dir, ständig diese Backslashes hinschreiben zu müssen?
<label for="000001-preis3"><?= $preis3 ?> €</label>
Und wenn es sich nicht um eine garantierte Zahl handelt, dann so:
<label for="000001-preis3"><?= htmlspecialchars($variable) ?> €</label>
Beide Varianten scheinen richtig zu funktionieren.
Es gehört zum PHP-Grundlagenwissen, zu wissen warum deine beiden Schreibweisen dasselbe Resultat ergeben. Wie notiert man String-Literale und was ist der wesentliche Unterschied zwischen ""- und ''-Strings?
dedlfix.
@@Jnnbo
Was ist denn nun besser? Es kommt mir auf diese Schreibweise an
Nichts von alledem. Nicht HTML in PHP schachteln, sondern PHP in HTML.
Markup (HTML-Tags) nicht mit echo
ausgeben, sondern nur die aus dem Backend kommenden Werte:
<form method="post" action="">
<input type="radio" name="preis" id="000001-preis1" value="14.64">
<label for="000001-preis1"><?php echo $preis1; ?> €</label>
<input type="radio" name="preis" id="000001-preis2" value="10.99">
<label for="000001-preis2"><?php echo $preis2; ?> €</label>
<input type="radio" name="preis" id="000001-preis3" value="11.64">
<label for="000001-preis3"><?php echo $preis3; ?> €</label>
<input type="hidden" value="000001" name="artikel_id">
<input type="submit" name="wk" value="In den Warenkorb">
</form>
Anstatt <?php echo $preis1; ?>
kann auch die Kurzschreibweise <?= $preis1 ?>
verwendet werden.
LLAP
@@Gunnar Bittersmann
<label for="000001-preis1"><?php echo $preis1; ?> €</label>
Bei sowas sorge ich immer dafür, dass zwischen der Zahl und dem Eurozeichen kein Zeilenumbruch auftreten kann. Entweder
statt des Leerzeichens oder label { white-space: nowrap }
im Stylesheet.
<input type="submit" name="wk" value="In den Warenkorb">
Warum das input
-Element für einen Button? Dafür gibt es – trara – das button
-Element, was neben der richtigen Bezeichnung auch den Vorteil bietet, dass die Beschriftung nicht in einem Attribut steckt, sondern im Elementinhalt, und damit auch Markup enthalten kann.
Also besser:
<button type="submit" name="wk">In den Warenkorb</button>
(Wobei type="submit"
der Default ist; man die Angabe also auch weglassen kann.)
LLAP
@@1unitedpower
das Prinzip heißt "Don't repeat yourself" kurz DRY, also "Wiederhole dich nicht selbst".
Und das Gegenteil von DRY ist natürlich WET ;-) (write everything twice).
LLAP
@@1unitedpower
- Du hast die <label>-Elemente nun leider rausgeworfen, die solltest du wieder aufnehmen. Sie verliehen deinem Formular wesentlich sinnbringende Semantik.
Vor allem: Sie machen das Formular benutzbar. Radiobuttons (Checkboxen, Formularfelder allgemein) ohne Label sind Radiobuttons (…) ohne Beschriftung. Wie soll ein Screenreader-Nutzer wissen, welchen er auswählen (was er eingeben) soll?
Und Labels kommen allen Nutzern zugute: Man kann zur Auswahl auch den Text clicken und muss nicht auf den winzigen Radiobutton zielen. (Fitts)
LLAP
@@1unitedpower
Vorteile:
- Das Formular funktioniert nun auch in Browsern mit deaktiviertem JavaScript.
Vor allem: Es funktioniert. [Punkt]
Auch für Nutzer mit eingeschränkten Fähigkeiten. (Ist das PC?)
LLAP