Autor Zpráva
JendaK
Profil
Při zpracování BB značek došlo k samovolnému sežrání celého příspěvku. Pardon.
Alphard
Profil
JendaK:
Příčinou této hlášky je obvykle nezpracování příliš dlouhého kódu. Pokud hádám správně, bude stačit dát sem jen relevantní ukázku.
JendaK
Profil
Asi nejsem sám, kdo má problém :-))


Ahoj,
tak to zkusím vložit postupně :-)
Mám několik problémů se scriptem, se kterým si lámu hlavu už pár dní.
Potřebuji odladit odesílací formulář, aby vše fungovalo jak má.
Mohl bych požádat o radu a případně rovnou o upravení kódu?

Jedná se o tyhle problémy:

1. Když nezvolím některou povinnou položku * a odkliknu ODESLAT, tak se mi odešle formulář do e-mailu, což by nemělo. Sice mi to ukáže varovnou hlášku o požadovaném vyplnění, jenže se stejně odešle mail.

2. Další problém je, že když si vyberu některou položku ze seznamu (SELECT / OPTION), a jiné povinné položky nevyplním, tak se po kliknutí na ODESLAT neuloží zvolený výběr (prostě ho nezobrazí a musí se znova vybrat požadovaná položka). Přitom u INPUT a TEXTAREA se ukazují - tam to funguje.
Přitom do emailu se vybrané položky zašlou ale na webu nejsou vidět, takže nevidim, co jsem navolil.

3. Rozbalovací box POPTÁVKA/OBJEDNÁVKA: dalo by se udělat, aby po rozbalení se automaticky znovu nezabalila - po kliknutí na odkaz ODESLAT? Normálně by to nevadilo, pokud by vyplnili všechno potřebné, jenomže když nevyplní povinnou položku, tak se zabalí a je potřeba fomulář znovu rozbalit. Což je dost otravné. Buď udělat, že by se dala rozbalovat/zabalovat pouze po kliknutí na POPTÁVKA/OBJEDNÁVKA a ignorovala odkaz ODESLAT nebo se rozbalila na trvalo.

4. Jakmile odkliknu ODESLAT a nejsou vyplněné některé položky *, tak se stránka posune úplně nahoru. Nadalo by se nějak udělat, aby po kliknutí zůstala stát (nerolovala se nahoru)? Pouze když budou mít vše vyplněné, tak se klidně může stránka vyrolovat nahoru.

5. Mohl bych ještě požádat o radu či script na ANTISPAM? Nějak se mi ho nedaří zakomponovat, aby fungoval. Myslím takový ten klasický 1+1= napsat výsledek, a k tomu prázdné neviditelné políčko, které musí zůstat prázdné.


Přikládám kompletní kód formuláře. Mám to udělané v jednom dokumentu, což mi plně vyhovuje.
Předem děkuji za pomoc a rady.


<html lang="cs" xml:lang="cs" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>formulář</title>
    <meta content="popis" name="Description" />
    <meta content="klicoveslova" name="Keywords" />
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <meta content="cs" http-equiv="Content-Language" />
    <meta content="no-cache" http-equiv="Cache-control" />

<style>
/* Prepinani */
input.rozbalovac {display: none;} 
/* skryti inputu */
input[type=checkbox]:checked + .rozbalovaci .obsah {display: block;} 
/* zobrazeni obsahu */
.rozbalovaci > .obsah {display: none;} 
/* skryti obsahu */
/* Styl prepinatka */
.rozbalovaci > label {
width: 415px; 
margin: 30px 0px 0px 0px; 
padding: 9px 5px 9px 20px;
border: 1px solid #dcd9d9; 
border-radius: 30px 30px 30px 30px; 
display: block;
cursor: pointer;
background-color: #0093d7;
font-size: 26px; 
color: #FFFFFF;
}
input[type=checkbox]:checked + .rozbalovaci label {
background-color: #8ab335;
border: 1px solid #8ab335;
border-radius: 30px 30px 0px 0px;
}
.rozbalovaci > label:before {
content: "+"; 
background-color: #FFFFFF; 
color: #0093d7; 
padding: 0 .3em; 
margin-right: .5em; 
border-radius: 20px;}
input[type=checkbox]:checked + .rozbalovaci label:before {content: "-"; color: #8ab335; }
.rozbalovaci > .obsah {background-color: #FFFFFF; padding: .0em;}
</style>

</head>
<body>



<?php
function checkmail($mail){
$mail = trim($mail);
if(strlen($mail)==0) return 0;
if(!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,20}+([a-z0-9_-]){0,20}@(([a-z0-9-]+\.)+(com|net|org|mil|".
"edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
"9]{1,3}\.[0-9]{1,3})$/is",$mail))
return 0;
return $mail;

if (!empty($_POST['submit'])) checkmail();
else _print();

}
if(isset($_POST['go']) || ($_POST['go'] == 'Odeslat'))
{
$_ERR='';
$_print='';  
$format = htmlspecialchars(strip_tags(trim($_POST['format'])));
$material = htmlspecialchars(strip_tags(trim($_POST['material'])));
$barva = htmlspecialchars(strip_tags(trim($_POST['barva'])));
$povrchupr = htmlspecialchars(strip_tags(trim($_POST['povrchupr'])));
$pocet = htmlspecialchars(strip_tags(trim($_POST['pocet'])));
$termin = htmlspecialchars(strip_tags(trim($_POST['termin'])));
$title = htmlspecialchars(strip_tags(trim($_POST['title'])));    
$name = htmlspecialchars(strip_tags(trim($_POST['jmeno'])));
$tel = htmlspecialchars(strip_tags(trim($_POST['tel']))); 
$email = htmlspecialchars(strip_tags($_POST['email']));
$text = htmlspecialchars(strip_tags(trim($_POST['text'])));
$firma = htmlspecialchars(strip_tags(trim($_POST['firma'])));  
$ulice = htmlspecialchars(strip_tags(trim($_POST['ulice'])));  
$mesto = htmlspecialchars(strip_tags(trim($_POST['mesto'])));  
$psc = htmlspecialchars(strip_tags(trim($_POST['psc'])));  
$ic = htmlspecialchars(strip_tags(trim($_POST['ic'])));  
$dic = htmlspecialchars(strip_tags(trim($_POST['dic'])));  
 
      if(!isset($format) OR $format == '')
      {
        $_ERR.='<div class="upozor">Vyberte formát!</div>';   
      }
      elseif(!isset($material) OR $material == '')
      {
        $_ERR.='<div class="upozor">Vyberte materiál!</div>';   
      }
      elseif(!isset($barva) OR $barva == '')
      {
        $_ERR.='<div class="upozor">Vyberte barvu!</div>';   
      }
      elseif(!isset($pocet) OR $pocet == '')
      {
        $_ERR.='<div class="upozor">Zvolte požadovaný počet.</div>';   
      }
      elseif(!isset($povrchupr) OR $povrchupr == '')
      {
        $_ERR.='<div class="upozor">Vyberte povrchovou úpravu!</div>';   
      }
      elseif(!isset($title) OR $title == '')
      {
        $_ERR.='<div class="upozor">Napište prosím předmět Vaší zprávy!</div>'; 
      }
      elseif(!isset($name) OR $name == '')
      {
        $_ERR.='<div class="upozor">Napište své jméno a příjmení!</div>';   
      }
      elseif(!isset($tel) OR $tel == '')
      {
        $_ERR.='<div class="upozor">Napište svůj telefon!</div>';
      }
      elseif(checkmail($email) === 0)
      {
        $_ERR.='<div class="upozor">Napište svůj e-mail nebo byl zadán nesprávně!</div>'; 
      }

 /*------error----------*/     
      if($_ERR != '')
      {
        $_print = $_ERR;
      }

      else
      {
      echo'
        <div class="odeslanapop"> 
        Děkujeme za Vaší poptávku. <br />
        Velmi brzo zašleme na Váš e-mail cenovou nabídku.
        </div> 
      ';
      }
 /*-------error konec--------*/ 
  
// obsah v zaslaném e-mailu
$mess = '
Možnost vložit libovolný texty
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Formát:  '.$format.'
Materiál:  '.$material.'
Barva:  '.$barva.'
Povrch. úprava:  '.$povrchupr.'
Termín:  '.$termin.'
Počet:  '.$pocet.'
'.$text.'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Jméno:  '.$name.'
Telefon:  '.$tel.'
E-mail:  '.$email.'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
'.$firma.'
'.$ulice.'
'.$psc.'  '.$mesto.'
IČ:  '.$ic.'
DIČ:  '.$dic.'
';

        // $from - odesílatel
        $header = "From: $email\r\nContent-Type: text/plain";

        // $to - příjemce emailu
        $to = "mujemail@mojedomena.cz";
        
        if(mail($to, $title, $mess, $header)){
        echo '';
    } else{
        echo '';
    }
}
?>



<form action="" method="POST"> 

<!-- form 1 -->

<table class="parametrytable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="parametrytdvlevo"  align="left" valign="top">

<div class="formuljednapodklad">
<table border="0" cellspacing="0" cellpadding="0">
<tbody>

<tr>
<td class="formprvnipopis" align="left" valign="top">
Formát: <span>*</span>
</td>
<td class="formprvniparam" align="left" valign="top">
<select name="format"  class="formprvniselect">
<option value="<?php echo $format;?>">Vyberte formát</option>
<option value="rozměr A">rozměr A</option>
<option value="rozměr B">rozměr B</option>
</select>
</td>
</tr>

<tr>
<td class="formprvnipopis" align="left" valign="top">
Materiál: <span>*</span>
</td>
<td class="formprvniparam" align="left" valign="top">
<select name="material"  class="formprvniselect">
<option value="<?php echo $material;?>">Vyberte</option>
<option value="Lesklý">Lesklý</option>
<option value="Matný">Matný</option>
</select>
</td>
</tr>

<tr>
<td class="formprvnipopis" align="left" valign="top">
Barva: <span>*</span>
</td>
<td class="formprvniparam" align="left" valign="top">
<select name="barva" class="formprvniselect">
<option value="<?php echo $barva;?>">Vyberte</option>
<option value="Modrá">Modrá</option>
<option value="Zelená">Zelená</option>
</select>
</td>
</tr>

<tr>
<td class="formprvnipopis" align="left" valign="top">
Povrchová úprava: <span>*</span>
</td>
<td class="formprvniparam" align="left" valign="top">
<select name="povrchupr" class="formprvniselect">
<option value="<?php echo $povrchupr;?>">Vyberte</option>
<option value="Standard">Standard</option>
<option value="Premium">Premium</option>
</select>
</td>
</tr>

<tr>
<td class="formprvnipopis" align="left" valign="top">
Počet: <span>*</span>
</td>
<td class="formprvniparam" align="left" valign="top">
<select name="pocet" class="formprvniselect">
<option value="<?php echo $pocet;?>">Vyberte počet</option>
<option value="100">100</option>
<option value="1000">1000</option>
</select>
</td>
</tr>

<tr>
<td class="formprvnipopis" align="left" valign="top">
Termín dodání: 
</td>
<td class="formprvniparam" align="left" valign="top">
<select name="termin" class="formprvniselect">
<option value="5 dní">5 dní</option>
</select>
</td>
</tr>

</tbody>
</table>
</div>

</td>
<td class="parametrytdvravo"  align="left" valign="top">
<div class="detailikfoto">
umístění fotky
</div>
</td>
</tr>
</tbody>
</table>

<!-- form 1 konec -->

<!-- form 2 -->

<input class="rozbalovac" id="box1" type="checkbox">
<div class="rozbalovaci">
  <label for="box1">Poptávka / objednávka</label>
  <div class="obsah">

<div id="formu" class="formpdruhyobal">
<?php
echo $_print;
?>

<div class="formnapdis">
Poptávkový formulář
<hr>
</div>
<table class="formpdruhytable" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="formpdruhyvlevo"  align="left" valign="top">
<div class="formppodnadpis">
Poptávku zasílá:
</div>
<div class="formul">
<div>Předmět zprávy: <span>*</span></div>
<input class="formullabel" type="text" name="title" value="<?php echo $title;?>">
</div>
<div class="formul">
<div class="">Jméno a příjmení: <span>*</span></div>
<input type="text" name="jmeno" value="<?php echo $name;?>">
</div>
<div class="formul">
<div>Telefon: <span>*</span></div>
<input type="text" name="tel" value="<?php echo $tel;?>">
</div>
<div class="formul">
<div>E-mail: <span>*</span></div>
<input type="text" name="email" value="<?php echo $email;?>">
</div>
<div class="formul">
<div>Popis poptávky:</div>
<textarea rows="10" cols="25" wrap="soft" name="text"><?php echo $text;?></textarea>
</div>
</td>

<td class="formpdruhyvravo"  align="left" valign="top">
<!-- form 2 vpravo -->
<div class="formppodnadpis">
Fakturační údaje:
</div>
<div class="formul">
<div>Název společnosti:</div>
<input type="text" name="firma">
</div>
<div class="formul">
<div>Ulice a čp.:</div>
<input type="text" name="ulice">
</div>
<div class="formul">
<div>Město:</div>
<input type="text" name="mesto">
</div>
<div class="formul">
<div>PSČ:</div>
<input type="text" name="psc">
</div>
<div class="formul">
<div>IČ:</div>
<input type="text" name="ic">
</div>
<div class="formul">
<div>DIČ:</div>
<input type="text" name="dic">
</div>

<!-- form 2 vpravo konec -->
</td>
</tr>
</tbody>
</table>
<hr>

<div>
Prostor pro antispam
</div>

<div>
* Údaje označené hvězdičkou prosím vyplňte.
</div>

<div>
<input class="butodeslatpop"  type="submit" name="go" value="Odeslat poptávku">
</div>

</div>

</div>
</div>
<!-- form 2 konec -->

</form> 
<!-- formular konec -->

</body>
</html>
Martin2
Profil *
JendaK:
Není moc pravděpodobné, že by se někomu chtělo v tom tvém prasečím kódu přehrabovat jen z dobroty srdce. Asi bys měl vytvořit placenou zakázku a nechat si to udělat celé znovu.
Alphard
Profil
JendaK:

1. Když nezvolím některou povinnou položku * a odkliknu ODESLAT, tak se mi odešle formulář do e-mailu, což by nemělo.
Odeslání emailu musí být v podmínce. Poděkování za poptávku je tam správně, ale samotný email se odešle v každém případě..., takže jen přesunout kód.

2. Další problém je, že když si vyberu některou položku ze seznamu (SELECT / OPTION), a jiné povinné položky nevyplním, tak se po kliknutí na ODESLAT neuloží zvolený výběr
Vybraný option musí mít atribut selected="selected", dávat mu value nemá význam.

3. Rozbalovací box POPTÁVKA/OBJEDNÁVKA: dalo by se udělat, aby po rozbalení se automaticky znovu nezabalila
Úplně do toho nevidím, tam je ještě nějaký javascript? Zřejmě bude nutné přenášet i nějakou informaci, co má být rozbaleno/zabaleno. Nabízí se využít k tomu odlišné css třídy.

4. Jakmile odkliknu ODESLAT a nejsou vyplněné některé položky *, tak se stránka posune úplně nahoru.
Odeslání formuláře prakticky znamená přechod na novou stránku, byť sebe samu; a nová stránka se roluje na začátek. Řešením je přidat do stránky kotku kotvu a na ni odkazovat.

Vzhledem k tomu, že jsou veškeré použité validace triviální, bych doporučil použít validaci v javascriptu. Vyřešilo by to všechny většinu problémů, bez přesměrování na novou stránku by nebylo třeba pamatovat si stav před odeslání a zpětně ho navozovat. Samozřejmě zachovat i tu PHP čast. Ale ve chvíli, kdy bude formulář pro většinu uživatelů validován v javascriptu, již nebude potřeba tolik řešit UX.

Keeehi [#6]:
Díky, upřesnil jsem to i ve svém příspěvku.
Keeehi
Profil
Alphard:
Řešením je přidat do stránky kotku a na ni odkazovat.
Až to budete JendaK hledat, tak se Alphard překlepl a měl na mysli kotvu.

Vzhledem k tomu, že jsou veškeré použité validace triviální, bych doporučil použít validaci v javascriptu.
... jako doplněk k serverové validaci.
JendaK
Profil
Martin2:
Díky za tvůj názor na vytvořený kód. Asi opravdu není moc hezký ale jsem amatér a už jenom tohle je pro mě výkon. Proto tady taky prosím o pomoc a rady, abych ten prasečí kód dal dopořádku a vše fungovalo jak má.


Alphard:
Ahoj,
děkuji za tvé rady ale stále se nějak nedokážu dobrat úspěšného výsledku.
Někde pořád dělám chybu...

Mohl bych tě požádat alespoň o ukázky vložení těch zmiňovaných kódu?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0