Autor | Zpráva | ||
---|---|---|---|
Hapipo Profil |
Ahoj,
chtěl bych se zeptat, pokouším se o objednávkový formulář. Potřeboval bych při rekapitulaci objednávky přičíst jednotnou taxu při potvrzeném checkboxu, např. za dopravu, ale po mnoha zkoušení a googlení nemůžu přijít, jak to tam zařadit. Script zde: <?php $obchod = simplexml_load_file('zbozi.xml'); $pocetpolozek = $obchod->count(); if ($_POST['akce']) { //ini_set('session.save_path','tmp'); //ini_set("session.cookie_domain",".domena.cz"); session_start(); if ($_POST['akce'] == 'prepocet') { for ($i = 1; $i <= $pocetpolozek+1; $i++) { if ($_POST['pocet_'.$i.'']){ $_SESSION['pocet_'.$i.''] = $_POST['pocet_'.$i.'']; } else { unset($_SESSION['pocet_'.$i.'']); } } print '<h2>Rekapitulace objednávky</h2>'; print '<table>'; print '<tr><th>Zboží</th><th>Cena celkem</th></tr>'; $obchod = simplexml_load_file('zbozi.xml'); $castka = 0; $hmotnost = 0; $zprava = ''; foreach ($obchod->zbozi as $zbozi) { if (isset($_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''])) { $castka_ = 0; $polozka = ""; $polozka .= "<tr>\n"; $polozka .= "<td>".$_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''].'x '. strip_tags($zbozi->nazev->asXML())."</td>\n"; $castka_ = $_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''] * strip_tags($zbozi->cena->asXML()); $polozka .= '<td>'. $castka_ ." Kč</td>\n"; $polozka .= "</tr>"; $zprava .= $_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''].'x '. strip_tags($zbozi->nazev->asXML()) . ', ' . $castka_." Kč\n"; $castka = $castka + $castka_; $celkem= $castka + $doprava; print $polozka; } } print '<tr><td>Celkem za výrobky</td><td>'.$castka .' Kč</td></tr>'; print '<tr><td>Celkem vč. dopravy</td><td>'.$celkem .' Kč</td></tr>'; print '</table>'; ?> Jde o to, aby proměnná "doprava" byla při zaškrtnutém checkboxu např. 80 Kč a při nezaškrtnutém 0 Kč. Děkuji za rady. |
||
Hapipo Profil |
#2 · Zasláno: 9. 4. 2020, 23:35:41
Hapipo:
<input type="checkbox" name="calc">Doprava</input><br/> if(!empty("calc")) $doprava = 300; else $doprava = 200; ...takhle mi to vždy vyhodnotí jako "if", ať mám checkbox aktivní nebo ne |
||
Keeehi Profil |
#3 · Zasláno: 10. 4. 2020, 00:26:34
Hapipo:
Trochu ti tam chybí $_POST ale to je teď vedlejší. Když checkbox nezaškrtneš, vůbec se nepošle (potud vpořádku), když ho zaškrtneš, pošle se jeho hodnota. Tu ale nemáš nikde zadanou takže se pošle to nic, tedy prázdný řetězec. !empty na prázdném řetěci je samozřejmě nepravda. Přidej tedy do inputu value="cokoliv" a začne ti to fungovat. Tedy až na nulu. Protože bohužel empty("0") === true . Ale jakýkoli jiný neprázdný řetězec by ti měl fungovat.
|
||
Hapipo Profil |
Keeehi:
Děkuji moc za reakci, ale ani to mi nepomohlo, nevím, kde už je ten zakopanej pes... Každopádně po přidání value="1" se nic nestalo. Jediné, co mění hodnoty je fakt, že když odeberu $_POST, tak to pořád nezávisle na checkboxu hází hodnotu "if" (=300) a když přidám, tak hodnotu "else" (=200).
tady je kód v hlavní stránce: <script type="text/javascript"> function prepocitat() { var http_request = false; var request = "akce=prepocet&"; if (window.XMLHttpRequest) { http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (error) { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } } var pocetpolozek = <?php $obchod = simplexml_load_file('zbozi.xml'); print $obchod->count(); ?>; for(var i=1; i <= pocetpolozek; i++) { if (document.getElementById('pocet_' + i) != null) { request = request + 'pocet_' + i + '=' + document.getElementById('pocet_' + i).value + '&'; } } http_request.onreadystatechange = function() { prepocitej(http_request); }; http_request.open('POST', 'prepocitej.php', true); http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); http_request.send(request); } function prepocitej(http_request) { if (http_request.readyState == 4) { if (http_request.status == 200) { document.getElementById('rekapitulace').innerHTML = http_request.responseText; } else { alert('Chyba'); } } } function objednat() { var http_request = false; var request = "akce=objednavka&"; if (window.XMLHttpRequest) { http_request = new XMLHttpRequest(); } else if (window.ActiveXObject) { try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (error) { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } } request = request + 'jmeno=' + document.getElementById('jmeno').value + '&'; request = request + 'email=' + document.getElementById('e-mail').value + '&'; request = request + 'telefon=' + document.getElementById('telefon').value + '&'; request = request + 'ulice=' + document.getElementById('ulice').value + '&'; request = request + 'psc=' + document.getElementById('psc').value + '&'; request = request + 'mesto=' + document.getElementById('mesto').value + '&'; request = request + 'e-mail=' + document.getElementById('e-mail').value + '&'; request = request + 'fakturacni=' + document.getElementById('fakturacni').value + '&'; request = request + 'dodaci=' + document.getElementById('dodaci').value + '&'; request = request + 'celkem=' + document.getElementById('celkem').value + '&'; request = request + 'zprava=' + document.getElementById('zprava').value + '&'; http_request.onreadystatechange = function() { objednej(http_request); }; http_request.open('POST', 'prepocitej.php', true); http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); http_request.send(request); } function objednej(http_request) { if (http_request.readyState == 4) { if (http_request.status == 200) { document.getElementById('rekapitulace').innerHTML = http_request.responseText; } else { alert('Chyba'); } } } </script> <h1>Objednávka produktů</h1> <form method="post" action="javascript:prepocitat()"> <table> <tr> <td>Kód</td> <td>Název</td> <td>Cena</td> <td>Počet kusů</td> </tr> <?php $obchod = simplexml_load_file('zbozi.xml'); foreach ($obchod->zbozi as $zbozi) { print "<tr>\n"; print "<td>". strip_tags($zbozi->id->asXML())."</td>\n"; print '<td>'. strip_tags($zbozi->nazev->asXML())."</td>\n"; print "<td>". strip_tags($zbozi->cena->asXML())."</td>\n"; print '<td><input name="pocet_'. strip_tags($zbozi->id->asXML()).'" id="pocet_'. strip_tags($zbozi->id->asXML()).'" type="text" /></td>'."\n"; print "</tr>"; } ?> </table> <input type="checkbox" value="1" name="calc">Doprava</input><br/> <input class="button-objednavka" type="submit" name="submit" value="Přepočítat" title="Přepočítat" /> </form> <div id="rekapitulace"></div> a tady je kód pro prepocitej.php: <?php $obchod = simplexml_load_file('zbozi.xml'); $pocetpolozek = $obchod->count(); if ($_POST['akce']) { //ini_set('session.save_path','tmp'); //ini_set("session.cookie_domain",".domena.cz"); session_start(); if ($_POST['akce'] == 'prepocet') { for ($i = 1; $i <= $pocetpolozek+1; $i++) { if ($_POST['pocet_'.$i.'']){ $_SESSION['pocet_'.$i.''] = $_POST['pocet_'.$i.'']; } else { unset($_SESSION['pocet_'.$i.'']); } } print '<h2>Rekapitulace objednávky</h2>'; print '<table>'; print '<tr><th>Zboží</th><th>Cena celkem</th></tr>'; $obchod = simplexml_load_file('zbozi.xml'); $castka = 0; $hmotnost = 0; $zprava = ''; foreach ($obchod->zbozi as $zbozi) { if (isset($_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''])) { if(!empty($_POST["calc"])) $doprava = 300; else $doprava = 200; $castka_ = 0; $polozka = ""; $polozka .= "<tr>\n"; $polozka .= "<td>".$_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''].'x '. strip_tags($zbozi->nazev->asXML())."</td>\n"; $castka_ = $_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''] * strip_tags($zbozi->cena->asXML()); $polozka .= '<td>'. $castka_ ." Kč</td>\n"; $polozka .= "</tr>"; $zprava .= $_SESSION['pocet_'.strip_tags($zbozi->id->asXML()).''].'x '. strip_tags($zbozi->nazev->asXML()) . ', ' . $castka_." Kč\n"; $castka = $castka + $castka_; $celkem= $castka + $doprava; print $polozka; } } print '<tr><td>Celkem za výrobky</td><td>'.$castka .' Kč</td></tr>'; print '<tr><td>Celkem vč. dopravy</td><td>'.$celkem .' Kč</td></tr>'; print '</table>'; ?> Díky moc za rady. S JavaScriptem se teprve učím. |
||
Tomášeek Profil |
#5 · Zasláno: 10. 4. 2020, 08:39:13
Keeehi:
Já teda nevím, ale value checkboxu se neposila, ne? Posila se jeho name, pokud je vyplněny, nebo nic, pokud není. Kontrola probíhá klasicky issetem. Ale možná se pletu. Nemůžu ověřit, nemám počítač, ale dal bych za to ruku do ohne. Spalim se? |
||
Hapipo Profil |
#6 · Zasláno: 10. 4. 2020, 12:01:04
Tomášeek:
Každopádně, teď mám v scriptu oboje a stejně nefunguje. Nevidíte nějakou chybu, čím by to mohlo být? Díky |
||
Tomášeek Profil |
Hapipo:
Co ti nefunguje? Že přičítáš proměnnou $doprava dříve, než jí přiřadíš nějakou hodnotu? Zapni si vypisování chyb, uvidíš, že pracuješ s nedefinovanou proměnnou na ř. 42.
3 další tipy. Neexistující proměnnou, resp. index bude hlásit i if ($_POST['akce']) .
$_POST['pocet_'.$i.'']; a další, odkud se bere to peklo s .'' na konci klíčů pole? Co si od toho připojení prázdného stringu slibuješ?
Pokud pominu nesmyslnost pojmenování $castka_ , dá se $castka = $castka + $castka_; zapsat elegentněji jako $castka += $castka_;
|
||
Hapipo Profil |
Tomášeek:
Jsem myslel, že definuji proměnou tímto: if(!empty($_POST["calc"])) $doprava = 300; else $doprava = 200; Ale i když dám tento script nad řádek 42, (nahoře jsem upravil, kam jsem umístil, také nefunguje. Kam mám tedy umístit, aby proměnná byla definovaná? Moc prosím o pomoc. Díky |
||
Keeehi Profil |
#9 · Zasláno: 10. 4. 2020, 20:24:38
|
||
Hapipo Profil |
#10 · Zasláno: 10. 4. 2020, 22:32:21
Keeehi:
Tak proč se to nepromítne do toho součtu, když ji mám definovanou? Pořád se mi počítá +300 (if) a nereaguje to na checkbox... Potřebuji, aby se to přepínalo. Dokážete mi v tomhle poradit? Děkuji |
||
Tomáš123 Profil |
#11 · Zasláno: 10. 4. 2020, 23:06:16
Hapipo:
V skripte si vypíš: var_dump($_POST['calc']); .
Keeehi: „Tu ale nemáš nikde zadanou takže se pošle to nic, tedy prázdný řetězec.“ V tvojom príklade to bez value posiela hodnotu on . Neviem do akej miery sa na to ide spoľahnúť.
|
||
Tomášeek Profil |
Keeehi:
Jasně, máš pravdu. Jak jinak by se tahaly zaškrtnlé checkboxy z multicheckboxů ( name="foo[]" ) :-)
Tomáš123: Spolehnout se na to dá. Vlastně tě v případě jednoho checkboxu nezajímá, jestli vrátí on , true nebo 1 (ve skutečnosti to je snad všude on ), zajímá tě, že ten checkbox se definovaný, čili existuje - zjistíš pomocí isset , tu hodnotu kontrolovat nemusíš.
Hapipo: „Tak proč se to nepromítne do toho součtu, když ji mám definovanou? Pořád se mi počítá +300 (if) a nereaguje to na checkbox“ Není dobrý nápad měnit kód ve starých příspěvcích, málokdo si té změny všimne. Ve formuláři sice máš element s name=calc (správně), v PHP s ním po úpravě toho kódu pracuješ dobře, ale ten formulář přechroupáváš a do PHP posíláš AJAXovým voláním, kde ten prvek jaksi chybí... Prostě do toho PHP žádné $_POST['calc'] nepřijde. Přidej ho do toho AJAXového requestu.
|
||
Hapipo Profil |
Tomáš123:
Ahoj, právě to od rána zkouším, ale nedaří se mi to zprovoznit. Chtěl bych poprosit, neukázal bys mi, kam přesněji do scriptu mám ten var_dump($_POST['calc']); vložit, aby mi to už fungovalo. Byl bych moc vděčný.
Děkuji moc za vaše příspěvky, vážím si toho. |
||
Tomáš123 Profil |
#14 · Zasláno: 11. 4. 2020, 17:00:12
Hapipo:
„aby mi to už fungovalo“ Prečítaj si o funkcii var_dump() . Zázračne nevyrieši tvoje problémy. Vypíše informácie o premennej.
Vlož to tam, kde chceš testovať. Napríklad nad tú podmienku, ktorá nefunguje. Čo to vypíše? Nedefinovaný index? Pozri [#12] od Tomášeeka. |
||
Hapipo Profil |
Tomáš123:
Děkuji, ano, píše to "NULL". To už psalo před tím, když jsem to zkoušel. Děkuji za rady, ale tuhle funkci zkouším a studuji na internentu celý den, ale nedokážu to rozchodit. Tohle asi nedokážu. Děkuji za vše, co jste přispěli. Bude to muset funfovat bez toho :( |
||
Hapipo Profil |
Hapipo:
Kdyby někdo chtěl pomoci a dodal do scriptu tu funkci, budu rád, nejsem javascipťák. Jedná se o formulář pro objednávku ochranných štítů pro lékaře, které jim darujeme ZDARMA proti COVID-19. Vyrábíme je na 3D tiskárnách a platí se jen doprava, pokud si nezvolí osobní odběr. Nejde o žádnou komerční záležitost. Také ten web dělám zadarmo. Chtěl jsem to upravit sám s radou, ale asi to nezvládnu. Díky |
||
lionel messi Profil |
Hapipo:
> Tomáš123: > Děkuji, ano, píše to "NULL" Čiže potom sa vždy počíta s cenou 200, keďže empty(NULL) je vždy true.
Asi tresnem blbosť na n-tú, ale hádam ma za to nestihne trest smrti: objednat skladáš reťazec URL parametrov, ale nikde nepracuješ s políčkom doprava . Skúsil si niečo ako:
request = request + 'zprava=' + document.getElementById('zprava').value + '&'; request = request + 'doprava=' + document.querySelector('input[name="calc"]').checked „Kdyby někdo chtěl pomoci“ Mám mail (v profile), nové IDE, dva dni voľna a na Slovensku platí kvôli Covid-19 dosť tvrdý režim (asi ešte o čosi tvrdší než v ČR). |
||
Hapipo Profil |
#18 · Zasláno: 11. 4. 2020, 22:07:09
lionel messi:
Napsal jsem email. :) Díky |
||
lionel messi Profil |
Hapipo:
Dodávam riešenie aj verejne, aby to bolo v súlade so zvyklosťami fóra. Riadok request = request + 'doprava=' + document.querySelector('input[name="calc"]').checked + "&" bolo nutné doplniť za r. 4 prvého kódu v [#4]. |
||
Časová prodleva: 4 roky
|
0