Autor Zpráva
Joan
Profil
Zdravím,
mám již funkční webový formulář, beztabulkový a ráda bych event. chyby vypsala přímo vedle špatně vyplněného políčka. Hned po podmínce mám výpis event. chyby a tady barvu písma v hlášce vypsané pomocí "echo" změnit umím, ale není mi jasné, jak to echo nastylovat na patřičné místo ve formuláři. Zatím se mi všechna "echa" zobrazují v levém horním rohu prohlížeče.
Když hlášku, kterou má echo vypsat, vložím do odstavce s identifikátorem, tak externí styl na to nereaguje. Mám ošetřeno, aby se již uživatelem zadaná data stále zobrazovala i při špatném vyplnění, pomocí
<input type="text" name="email" id="email" value=<?php echo $mail ?>

napadlo mě to nějak napozicovat sem, ale jak?
Popostrčíte mě někdo prosím?
Laman
Profil
pokud správně rozumím otázce, tak jde o to, že výstup z echa se ti vypíše, tam kde máš v kódu echo. takže když dáš echo za to formulářové okénko (podobně jako máš teď $mail uvnitř), tak bude na správném místě a tam taky zůstane.
co se podmínek týče, tak třeba něco takového:
<?
$hlaskaMail="";
if($spatnyMail){ //jakákoli tvoje podmínka
$hlaskaMail="neplatně zadaný mail";
}
?>
...
<input type="text" name="email" id="email" value=<?php echo $mail; ?> > <?echo ($hlaskaMail);?> //spíš asi spojit obě vypisování dohromady
panther
Profil
Joan:
echo se pozicovat nedá, echo není ve výsledném HTML kódu nic. Pracovat můžeš s jeho výstupem, tj. nějakým třeba spanem, do nějž si chybovou hlášku vypíšeš a s tím pak budeš dále pracovat jako s prostým HTML (výstup echa nic jiného než HTML není, zobraz si zdrojový kód výsledné stránky).
Joan
Profil
panther:
Chápu, blbě jsem se vyjádřila. Mám v chybové hlášce např. toto:
echo "span style='color: red'>Vyplňte správnou emailovou adresu</span>"


A teď bych moc ráda věděla, jak tomu spanu řeknu, že ho chci zobrazit právě u tohoto konkrétního inputu a ne standardně v levém horním rohu prohlížeče. Jít to musí, protože jsem takové formuláře viděla :-)
panther
Profil
Joan:
standardně v levém horním rohu nebude, bude tam, kam ho dáš v kódu (pokud nebudeš absolutně pozicovat, což je blbost). Dej sem odkaz na konkrétní stránku, dostaneš konkrétní radu pro konkrétní situaci.

Vůbec nekoukej na to, že to generuje PHP script, výsledek je stejný, jako by sis ten span dala natvrdo do HTML kódu.
Joan
Profil
No však včil moje naděje, že formulář půjde pozicovat relativně a spany s echem v něm absolutně právě vzala za své... nešlape to. A při absolutním pozicování text vyjíždí ven při změně velikosti písma. Já ten span mám tak nějak "ve vzduchu", od čeho se mám teda odrazit při pozicování? Díky za trknutí!

Podstatná část kódu:

<label for="jmeno">Vaše jméno:</label><input type="text" name="jmeno" id="jmeno" value="<?php echo $jmeno ?>"<br>


<?php
$chyba ="";
if ($jmeno=="")
$chyba .= "<span id='jmeno'>Napište jméno</span><br />;"
echo $chyba;
?>


Toto je to poslední co mi chybí "ke štěstí" abych mohla formulář na svých stránkách vypustit do světa :-)
panther
Profil
Joan:
Podstatná část kódu:
podstatný je mnohem větší kus HTML, k tomu i nemalá část CSS. Opravdu sem dej odkaz na web, bude to nejlepší.
Joan
Profil
panther:
Tak jo, připravila jsem, co je v mejch silách:
tu je odkaz na můj formulář. Začínám vlastním formulářem "mail_formular.php", který zpracovávám scriptem "mail_zpracuj.php", v němž se tento formulář opakuje kvůli možným opravám nevyplněných políček apod. a taky obsahuje echo kvůli udržení obsahu v inputech.

Toto je zpracující script:
<html>
<head>
<title>Zpracovávání webového formuláře bez tabulek</title>
  <link rel="stylesheet" type="text/css" href="styl_formulare.css">
</head>
<body>
<?php

/* *************** diskuse.jakpsatweb.cz *** PHP FAQ ********************** */
function autoUTF($s)
{
    // detect UTF-8
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
        return $s;
    // detect WINDOWS-1250
    if (preg_match('#[\x7F-\x9F\xBC]#', $s))
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    // assume ISO-8859-2
    return iconv('ISO-8859-2', 'UTF-8', $s);
}

function cs_mail ($to, $predmet, $zprava, $head = "")
       {  $predmet = "=?utf-8?B?".base64_encode(autoUTF ($predmet))."?=";
          $head .= "MIME-Version: 1.0\n";
          $head .= "Content-Type: text/plain; charset=\"utf-8\"\n";
          $head .= "Content-Transfer-Encoding: base64\n";
          $zprava = base64_encode (autoUTF ($zprava));
          return mail ($to, $predmet, $zprava, $head); }
/* ********************************************************************** **  */

$nick = $_POST["nick"];
$email = $_POST["email"];
$predmet = $_POST["predmet"];
$zprava = $_POST["zprava"];
$spam = $_POST["spam"];
$poslano = $_POST["poslano"];
$odeslano = $_POST["odeslano"];
$predmet2 = "Neodpovídejte prosím";

$zprava = str_replace("\n", " <br> ", $zprava); //nové řádky nahradí <br>
$nick = stripslashes($nick);  //odstraní zpětná lomítka
$email = stripslashes($email);
$predmet = stripslashes($predmet);
$zprava = stripslashes($zprava);

$nick = htmlspecialchars($nick);
$email = htmlspecialchars($email);
$predmet = htmlspecialchars($predmet);
$zprava = htmlspecialchars($zprava);
if ($_POST["odeslano"])
//kontrola vsech vlozenych udaju
{
$chyba ="";
  if(!isset($_POST["email"]) || preg_match("/^[^@]+@[^@]+[.][a-zA-Z]+$/", $_POST["email"]) == 0)
  $chyba .= "<span id='email'>Zadejte prosím emailovou adresu ve správném tvaru</span><br />";
  if ($predmet=="")
  $chyba .= "<span id='predmet'>Napište prosím předmět zprávy</span><br />";
  if ($spam!=12)
  $chyba .= "<span id='spam'>Vyplňte prosím správné číslo</span><br />";
  if ($zprava=="")
  $chyba .= "<span id='zprava'>Nezapomněli jste napsat samotnou zprávu?</span><br />";
  if (strlen($zprava) > 300)
  $chyba .= "Délka zprávy nemůže přesáhnout 300 znaků.<br />";
  {
  echo $chyba;
  }
  if (!$chyba) 
        {
cs_mail("zlatberry@email.cz", $predmet, $zprava, "From: $email\n");
 echo "Zpráva byla úspěšně odeslána<br />";
      } 
      if (isset($_POST["kopie"]))
      if (($_POST['kopie']=="ano") && (!$chyba))
      {
cs_mail($email, $predmet2, "Z formuláře na webu zlatberry.cz jste odeslali tuto zprávu:\n---------------------------------------------------------------------------\n\n $zprava", "From: no-reply@zlatberry.cz\n");
 echo "Zpráva byla odeslána na Vaši adresu<br />";
      } 
 }
   if (!$odeslano || $chyba)
{
?>
<pre>Přemýšlíte, jak mi říci, 
že je někde chyba?
Nebo jen tak napsat pár vět?
Tu na stránce třeba:</pre>
<?php
if ($chyba)
{  
echo "<p style='color: red; font-style: italic';>Opravte prosím chyby a odešlete formulář znovu</p>";
}
?>
<form action="mail_zpracuj.php" method="post">
<h2 id="formular"><strong>Chcete mi odeslat námět nebo připomínku?</strong></h2>
<label for="nick">Vaše jméno nebo přezdívka:</label><input type="text" size=25 maxlength=25 name="nick" id="nick" value="<?php echo $nick ?>"><br>
<label for="email"><font color=red>*</font>Váš email:</label><input type="text" size=25 maxlength=25 name="email" id="email" value="<?php echo $email ?>"><br>
<label for="predmet"><font color=red>*</font>Předmět zprávy:</label><input type="text" size=25 maxlength=25 name="predmet" id="predmet" value="<?php echo $predmet ?>"><br>
<p id="spambot">Ochrana před spambotem - doplňte prosím výsledek:</p>
<label for="spam"><font color=green>čtyři krát tři</font></label><input type="text" size=10 name="spam" id="spam" value="<?php echo $spam ?>"><br>
<p id="zprava"><label for="zprava"><font color=red>*</font>Text Vaší zprávy:</label><br>
<textarea name="zprava" id="zprava" <?php if(isset($_POST["zprava"])) echo $_POST["zprava"]; ?></textarea></p><br>
<p><input type="checkbox" name="kopie" id="checked" value="ano" <?php if(isset($_POST["checked"])) echo ($_POST['kopie']=="ano") ? "checked" : ""?>>Poslat si zprávu i na zadaný email</p><br>
<input type ="submit" name="poslano" value="Odeslat zprávu" id="poslano"><br>
<input type ="hidden" name="odeslano" value="Odeslat"><br>
<h5>Políčka s <font color=red>červenou *</font> je nutné vyplnit</h5>
</form>
<?php 
}
?>
</body>
</html>



Faktem je, že formulář skutečně funguje (ani jsem tomu skoro nevěřila).
Ale:
1) když vyplním zprávu do textarea a něco jiného nevyplním, tak jednak obsah textarey zmizí do pryč a taky se odškrtne možnost odeslat si kopii zprávy sám sobě (odesilatel) - toto fakt nevím, jak ošetřit
2) uvědomila jsem si, že tam mám input pro jméno či přezdívku, ale už ho nemám zahrnutý do zpracování. Chtěla jsem, aby se mi zobrazilo v případě vyplnění odesilatelem - pokoušela jsem se ho naroubovat někam do zprávy, ale parse error na sebe nenechal dlouho čekat.
Tuto položku
"From: =?UTF-8?B?".base64_encode(autoUTF ("Moje Jméno"))."?=<ja@email.cz> /r/n";

ve scriptu nemám, protože nevím přesně kam ji připojit, protože vlastně používám současně 2x funkci email.

P.S.: Formulář jsem páchala na 8,9" palcovém noťásku (věrný můj společník) a koukám, že na 17" monitoru vypadá docela jinak...
Javascript zatím nepoužívám, napřed chci JS script aspoň zhruba pochopit a ne jen slepě okopírovat. Teď vidím, že span kolem hlášky o délce znaků jsem zapomněla, to už si doplním.
Ráda bych, aby se mi spany v echu s chybovými hláškami zobrazovaly nejspíš kousek nad konkrétním inputem.

Díky moc za pomoc - a přeji dobrou noc :-) !
panther
Profil
Joan:
první věc, které jsem si všiml je, že chybové hlášky mají každá ID (zbytečně), ale co je hlavní, ID je stejné jako u formulářpvých polí (jednak ID může být na stránce jen jednou, ale hlavně po kliknutí na label se nestane příslušné formulářové pole aktivním).

Ráda bych, aby se mi spany v echu s chybovými hláškami zobrazovaly nejspíš kousek nad konkrétním inputem.
v tom případě asi takto:
<style>
.error {font-style: italic; color: red;}
</style>
<?php
$chyba = array();
if(!isset($_POST["email"]) || preg_match("/^[^@]+@[^@]+[.][a-zA-Z]+$/", $_POST["email"]) == 0)
	$chyba[0] = "Zadejte prosím emailovou adresu ve správném tvaru";
if ($predmet=="")
	$chyba[1] = "Napište prosím předmět zprávy";
if ($spam!=12)
	$chyba[2] = "Vyplňte prosím správné číslo";
//a tak dale

if(empty($chyba)) { // vse v poradk vyplneno (misto if(!chyba))
	mail(...);
}

?>
<label for="nick">Vaše jméno nebo přezdívka:</label><input type="text" size=25 maxlength=25 name="nick" id="nick" value="<?php echo $nick ?>"><br>
<?php if(!empty($chyba[0])) echo '<span class="error">'.$chyba[0].'</span>'; ?>
<label for="email"><font color=red>*</font>Váš email:</label><input type="text" size=25 maxlength=25 name="email" id="email" value="<?php echo $email ?>"><br>
<?php if(!empty($chyba[1])) echo '<span class="error">'.$chyba[1].'</span>'; ?>
<label for="predmet"><font color=red>*</font>Předmět zprávy:</label><input type="text" size=25 maxlength=25 name="predmet" id="predmet" value="<?php echo $predmet ?>"><br>


2) uvědomila jsem si, že tam mám input pro jméno či přezdívku, ale už ho nemám zahrnutý do zpracování.
jednoduše nick přidej do funkce mail k třetímu parametru se zprávou:
cs_mail("zlatberry@email.cz", $predmet, $nick.$zprava, "From: $email\n");
Samozřejmě si to naformátuj, jak uznáš za vhodné, přidej si tam třeba <br> mezi to nebo něco :-)

1) když vyplním zprávu do textarea a něco jiného nevyplním, tak jednak obsah textarey zmizí do pryč
obsah se vkládá mezi značky <textarea> a </textarea>, tedy takto:
<textarea name="zprava" id="zprava"><?php if(isset($_POST["zprava"])) echo $_POST["zprava"]; ?></textarea>


a taky se odškrtne možnost odeslat si kopii zprávy sám sobě (odesilatel) - toto fakt nevím, jak ošetřit
tam mš divné $_POST['checked'], ma tam být $_POST['kopie'].
<input type="checkbox" name="kopie" id="checked"<?php if(isset($_POST["kopie"])) echo " checked" ?>>


Pokud jsou v kódu nějaké překlepy, omlouvám se, přeci jen už je pokročilá hodina :-)
Joan
Profil
panther:
To je chytré! Tím, že hlášky hodím do pole, tak indexy už míří přímo do konkrétního políčka. Identifikátor jsem přidala každému inputu proto, že jsem uvažovala o přesném napozicování každého z nich. Mně osobně nikdy nenapadlo klikat ve formulářích (v žádných) na label apod., vždy klikám přímo do políčka, takže toto mi uniklo.

Tu proměnnou $nick mě náhodou taky napadlo připojit k $zprava (ani na tu tečku jsem nezapomněla), jenom v opačném tvaru $zprava.$nick a vím, že vyskočila chyba, kde se vyskytoval výraz "T_STRING" ale víc si nepamatuju. Zkusím to doma ještě jednou.

Aha, u toho checkboxu jsem fakt myslela, že tam má být $_POST["checked"] - jako že zaškrtnuto, opravím si to.

Zatím vřelé díky Tobě a za těchto deštivých dnů si k tomu velmi ráda sednu :-)

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0