Jak v PHP na zasílání komentářů emailem?

MyEgo.cz

home foto blogy mywindows.cz kontakt

Jak v PHP na zasílání komentářů emailem?

PHP 14.04.04
old PHP coder

Navrhl jsem Jirkovi Macichovi aby si na svém blogu zřídil aspoň trošku lepší formu komentářů. Zasílání příspěvků emailem je snad i ok, nicméně, pokud musím kliknout na mailto: odkaz, napsat tam název článku, na který reaguji, svoje jméno, a pár dalších věcí, tak… se mi to toho moc nechce.

Komentáře jsou přitom podstatné nejen pro návštěvnost, ale i pro získávání feedbacku k vlasním názorům. Veřejná oponentura!

Jirka na tom nějakou dobu pracoval a… nic. Takže, následuje malý kurz PHP, který jsem během 20 minut napsal ;)

Řešení je velice jednoduché, stačí nabídnout jednoduchý formulář, generovaný pomocí PHP, pro zaslání komentáře k danému článku, a použít trošku JavaScriptu pro otevření tohoto okna, a zapamatovat si pár údajů v cookies.

Jak takové řešení vypadá? Začnu od konce. Zde se můžete podívat na výsledek.

Co to umí?

  • otevřít okno formuláře na vložení komentáře s parametrem název a URI článku.
  • zkontrolovat vyplnění jména, emailu a zprávy.
  • odeslat (emailem) komentář majitelu blogu.
  • odeslat (emailem) komentář tomu, kdo jej vložil.
  • zaznamenat IP adresu a DNS resolution.
  • zapamatovat si jméno, email a URI komentujícího v cookies.
  • předvyplnit, při druhé návštěvě tyto hodnoty.
  • zavřít na konci okno, popřípadě vrátit se zpět, v případě chyby.

Jak na to v HTML kódu?

Použití je vskutku jednoduché, stačí nadefinovat v šabloně (třeba EasyBlogu) název článku a jeho URI, a s tím zavolat JavaScriptovou funkci pro nové otevření okna, komentar.php. V této funkci budeme předávat parametry jako je název článku pomocí parametrů v URI, v PHP se k nim dostaneme přes globální proměnnou $_GET[‘název-proměnné’] .

<script type='text/javascript'>
 function commentOpen(name,url){ 
     w=window.open('./komentar.php?name='+name+'&url='+url,
	 'komentar','resizable=no,scrollbars=no,height=450,width=450',false); 
 }
 </script>
 </head><body> 
 <h1>Test volání komentáře</h1>
 <form>
 <p><input 
 type='button' 
 value='Komentář!' 
 onClick="commentOpen('toto je nazev clanku','https://myego.cz/nazev-clanku');" />
 </p>
 </form>

A jak to zpracovat v PHP?

Základem je samozřejmě formulář, do kterého můžeme zadat údaje:

<h3>Článek: <?php echo $_GET['name']; ?></h3>
   <h4>URI: <?php echo $_GET['url']; ?></h4>
   <form method='post'>
   <fieldset>
 <legend>Váš komentář</legend>
 <p><label>Vaše jméno: <input class='formfield' <?php _value('name'); ?> type='text' name='name' tabindex='1' /></label></p>
 <p><label>E-mail: <input class='formfield' <?php _value('email'); ?> type='text' name='email' tabindex='2' /></label></p>
 <p><label>URI: <input class='formfield' <?php _value('uri'); ?> type='text' name='uri' tabindex='3' /></label></p>
 <p><textarea class='formfield' name='message' cols='40' rows='6' tabindex='4'></textarea></p>
 <p><input class='formbutton' name='submit' type='submit' value='Odeslat komentář!' tabindex='5' /></p>
 </fieldset>
 </form> 

Pokud čtete pozorně, všimnete si, že XHTML kód je proložen voláním PHP funkce _value(), ta je definována následovně, a zajišťuje anplnění výchozích hodnot pro jméno uživatele, email a URI z uložených cookies (pokud jsou):

 function _value($s){  if (isset($_COOKIE[$s])) echo " value='".$_COOKIE[$s]."' "; }  

Následně nezbývá nic jiného, než formulář pro zaslání komentáře zpracovat, tedy, zjistit zda je správně vyplněn, včetně správného formátu emailové adresy, nastavit cookies pro další návštěvu toho samého člověka (je to dobrý servis pro něj), a poslat email majiteli blogu (sobě) a taky člověku, který daný komentář vložil. Pro jeho kontrolu, jinde se na komentář podívat nemůže!

<?php
 // byl submit?
 if (isset($_POST['submit'])){
 // kontrola zda je zprava, name a email ok
 if ( !empty($_POST['message']) && !empty($_POST['name']) &&
 ereg('^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)+$',$_POST['email'])
 ){ 
 // email, na ktery ma byt komentar zaslan
 $email="vas@email.cz";
 // nastaveni cookies 
 setCookie('name',$_POST['name'],time()+36002430,'/',$_SERVER['SERVER_NAME']);
 setCookie('email',$_POST['email'],time()+36002430,'/',$_SERVER['SERVER_NAME']);
 if (isset($_POST['uri'])) setCookie('uri',$_POST['uri'],time()+36002430,'/',$_SERVER['SERVER_NAME']);
 // sestaveni zpravy
 $from = "From: $email nContent-Type: text/plain; charset=iso-8859-2";
 empty($_POST['uri']) ? $uri="N.A." : $uri=$_POST['uri'];
 $xdns = @gethostbyaddr($_SERVER["REMOTE_ADDR"]);
 $msg="Jméno: ".$_POST['name']."n".
 "Email: ".$_POST['email']."n".
 "URI: ".$uri."n".
 "IP adresa: ".$_SERVER["REMOTE_ADDR"]."n".
 "DNS: ".$xdns."n".
 "Datum: ".date("F j, Y, g:i a")."n".
 "URI článku : ".$_GET['url']."n".
 "Název článku: ".$_GET['name']."n".
 "Komentář: ".$_POST['message'];
 // poslani komentare majiteli blogu
 // @mail($email,"Komentář k článku: ".$_GET['name'],$msg,$from);
 // poslani komentare jeho autorovi 
 @mail($_POST['email'],"Komentář k článku: ".$_GET['name'],$msg,$from);
 }
 }
 ?>  

A co nám zbývá? No, ještě jsme neošetřili žádné chybové stavy, konkrétně špatné vložení adresy, jména, a další problémy. Jak na to? Zde je kód:

<?php
 function _finish($s,$back=1){
 global $msg;
 echo $s;
 if ($back) 
 echo "<p><a href='javascript:history.go(-1);'>Zpět</a></p>";
 else
 echo str_replace("n","<br />",$msg)."<p><a href='javascript:window.close();'>Zavřít</a></p>";
 echo "</body></html>";
 exit; // zastav zpracovani skriptu
 }
if (isset($_POST['submit'])){
   if ( !empty($_POST['message']) && !empty($_POST['name']) &&
      ereg('^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(.[a-zA-Z0-9-]+)+$',$_POST['email']) 
   )
   _finish("<h3>Váš vzkaz byl odeslán. Děkuji!</h3>",0);
   else {
     if (empty($_POST['message'])) _finish("<h1>Zpráva je prázdná...</h1>");
     if (empty($_POST['name'])) _finish("<h1>Vaše jméno není vyplněno...</h1>");
     _finish("<h1>Email není platný...</h1>");
   }
}
?>

Jednoduché, ne? Lidem, co neumí PHP a JavaScript by toto mohlo přinést trošku světla do této problematiky.

Soubory ke stažení:

Ať slouží :-)


Komentáře

  1. 1 Jiří Macich ml. 14.04.04, 02:04:35
    FB

    Jen poznámka. U mě se nemusí psát do mailu na co se reaguje, protože to automaticky dávám do předmětu 8)

  2. 2 Radek Hulán 14.04.04, 02:04:46
    FB

    [1] tak to je dobře.. nicméně, já bych si tipnul, že bude podstatně více lidí, co použijí formulář pro komentář než aby posílali email ze svého email klienta (zvláště pokud vyhodíš kontrolu na jejich email). Docela mě zajímají výsledky..

  3. 3 Jiří Macich ml. 14.04.04, 03:04:26
    FB

    [2] No, když tam budou obě možnosti tak jo. Až to spustím (chci to dát na web s novou verzí blogu, aby to mělo větší zvuk), tak ti dám vědět, co se používá víc. Ok? :D

  4. 4 #lama 14.04.04, 02:04:53
    FB

    Hele, pekny, ale ;) :
    1. Musel jsem vypnout pop-up blocker (mam na status baru ;))
    2. <p><a href='javascript:history.go(-1);'>Zpět</a></p> ? Proc ne referer?
    3. Nebere mi to mail ;(
    4. u toho mail, bys mohl dat nejakej error ne?

    Tot vse, jinak pekny.

  5. 5 Radek Hulán 14.04.04, 02:04:59
    FB

    [4] hm,

    1. rozumnej popup-blocker neblokuje okna vyžádaná uživatelem. Když si někdo zakáže úplně všechno, vyžádané popup, JS, obrázky, atd., tak ať se nediví, že mu něco nefunguje, že se mu mírně omezí komfort.. 8)
    2. okno se otevírá JS, není tudíž důvod jej nepoužívat nadále ;)
    3. na email je ereg() kontrola ;)
    4. když je email blbě, je tam hláška ;)

  6. 6 #lama 14.04.04, 03:04:51
    FB

    1. Ja jsem si dal brutalne vsechno blokovat, protoze unwanted popups nestaci, nemel jsem zatim problemy
    2. Tak ok
    3. Chapu, ale kazdej dela blby eregi na emaily, nikdy mi to nebere muj mail
    4. Myslim odeslani

  7. 7 Radek Hulán 14.04.04, 04:04:06
    FB

    [6] hm, blokovat všechno je, jednoduše řečeno, blbost. Pak ti nefungují bookmarklety, redakční systém, atd. Navíc, proč se chceš chránit sám před sebou? Já si sám sobě povolím otevírat nová okna ;) Ale skriptům ne :idea:

  8. 8 llook 14.04.04, 07:04:45
    FB

    [1] tohle má jenom jednu potenciální chybu - spousta uživatelů používá webmaily, takže při kopírování odkazu musíte mazat schéma, tj. "mailto:"(kromě Opery) a dotaz, tj. "?Subject=P%F8edm%ECt"(i v Opeře), já osobně třeba ve škole, z různých důvodů.

    ad pop-up blokovače)
    já si blokování pop-up oken zapínám jenom při prohlížení porna, protože nikde jinde většinou žádné problémy nejsou.

  9. 9 Radek Hulán 14.04.04, 07:04:49
    FB

    [8] jo, dobrá připomínka, v tom je mailto: dost nepohodlné..