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
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
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
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
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
Hapipo:
Tím se definuje proměnná $doprava.

Tomášeek:
Value checkboxu se posílá. Odkaz
Hapipo
Profil
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
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
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
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].

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0