Zend Framework – Céges Demo portál – Kapcsolat űrlap VII. rész

A korábbiakban elkészítettük a legegyszerűbb kapcsolati oldalt, amin keresztül az oldal látogatói üzeneteket tudnak nekünk küldeni. Ahhoz, hogy ez megfelelően működjön, az űrlap adatait fel is kell tudnunk dolgozni. Kliens oldalon lehetőségünk van JavaScript használatára, amivel leellenőrizhető, hogy a bevitt adatok pl.: email cím megfelel-e az elvárásoknak(megfelelő érvényes emailcím). A JavaScript egy nagyon jó dolog a web2 kialakulását nagyban megkönnyíti. Kliens oldalon szerver erőforrás használata nélkül, helyben lehet vele adatokat ellenőrizni akár az oldal tartalmát is módosíthatjuk vele, szerver kérés válasz nélkül. Egy baj van a JavaScripttel s tulajdonképpen az egész webes világgal, ahányféle böngésző annyiféle megoldást kell kitalálnunk, ugyanis mindegyiknek van egy apró pici eltérése. Igazán tökéletesen, ugyanaz a kód sehol sem fut le teljesen ugyanúgy. Így van ez a Javascripttel is, lehet hogy bizonyos böngészőkben tökéletesen lehet használni, lehet hogy más böngészőkben egyáltalán nem vagy csak félig működik, így nem lehetünk biztosak a JavaScript által ellenőrzött adatok megfelelőségében, éppen ezért az adatokat erősen ajánlott szinte kötelező szerver oldalon is ellenőrizni.

Így a JavaScriptes ellenőrzés most nem kerül kitárgyalásra, törekedjünk most a PHP-s adatellenőrzés, feldolgozás megoldására. A formunk feldolgozásáért a

<form method="POST" action="/demo/public_html/index/process-kapcsolat" name="mainform">

utasítás a felelős, azaz az IndexControllernek lesz egy processKapcsolatAction() esemény függvénye, amely feldolgozza az űrlapadatokat(ellenőrzés feldolgozás).

Mit is kell csinálnunk?

Első lépésben kiszedjük a $_POST[] tömbből az adatokat, leellenőrizzük az email címet hogy valid-e? Azaz megfelel-e az email cím szintaktikájának, ha megfelel megnézzük ki van-e töltve minden mezőnk, ha ez megvan akkor küldünk a portál adminisztrátorának egy email-t.

Lássuk a megoldást:

Zend::Filter get() metódusának segítségével megszűrjük, a bevitt adatokat, biztonság szempontjából ez az utasítás kiszedi a HTML elemeket, valamint a SQL injekciók(beviteli mezőkbe SQL utasításokat gépelve az oldal feltörését lehet megkísérelni, biztonság szempontjából szükséges eme lépés) elkerülésére is alkalmas szűrés PHP oldalon. Az alábbi utasítások segítségével szedhetjük ki az elküldött űrlap adatokat a $_POST[] tömbből:

$k_email = Zend_Filter::get($this->getRequest()->getPost('k_email'), 'StripTags');
$k_targy = Zend_Filter::get($this->getRequest()->getPost('k_targy'), 'StripTags');
$k_uzenet = Zend_Filter::get($this->getRequest()->getPost('k_uzenet'), 'StripTags');

Ha ez megvan, akkor le kell ellenőrizni, hogy minden adat ki van e töltve:

if($k_email=='' || $k_targy=='' || $k_uzenet==''){
//ha van olyan mező ami nincs kitöltve akkor "Kérem töltsön ki minden mezőt!"
//felírat jelenjen meg
}
else{
//minden mező ki van töltve
}

Ha van olyan mező, ami nincs kitöltve, akkor a felhasználót visszadobjuk a kapcsolat oldalra s egy üzenetben figyelmeztetjük.

Nos, elvileg minden eseményhez léteznie kellene vele azonos nevű nézetnek. De ilyen esetekben elég macerás lehet a felhasználónknak, hogy begépeli az adatokat s egy másik oldalon figyelmeztető üzenetet kap. Ekkor nekünk kellene egy linket csinálni vagy neki kellene újra a kapcsolat oldalra visszatérnie. Ami plusz lépéseket jelent számára, s lehet az első ilyen próbálkozás után meg is unja. Ennek elkerülése érdekébe, mi ugyanarra az oldalra irányítjuk vissza.

Ennek megoldására ZF-ben létezik egy FlashMessenger nevezetű objektum, ami a látogató munkamenetéhez fűz általunk megadott üzeneteket, mi átirányítjuk másik controller/eseményhez ott elkapjuk ezt az objektumot, kiszedjük az üzeneteket. Ekkor a ZF ezt a flashMessenger objektumot automatikusan meg is szünteti, így másik controller/esemény párosnál már nem lesz bent az üzenet a felhasználónk munkamenetében. Lássuk ennek a megoldását:

Az IndexController/processKapcsolatAction() jában kitöltetlen mezők esetén létrehozzuk egy flashMessenger objektumot. Üzenetet adunk neki(addMessage), majd átirányítjuk a vezérlést az IndexController/kapcsolatAction() eseményre, azaz vissza irányítjuk az űrlapra így:

$this->_helper->flashMessenger->addMessage("Kérem töltsön ki minden mezőt!");
$this->_redirect('index/kapcsolat');

Ezt az üzenetet nekünk el kell kapnunk az IndexController/kapcsolatAction()-ban majd átadni a nézetnek s kiíratni a felhasználónk számára.

Üzenet elkapása a kapcsolatAction() ban:

//üzenetek elkapása
$flash = $this->_helper->getHelper('flashMessenger');
if ($flash->hasMessages()) {
$this->view->message = implode("<br />", $flash->getMessages());
} // if ($flash->hasMessages())

$flash változóba létrehozzuk a flashMessenger objektumot, a hasMessages() függvény segítségével megnézzük van e benne üzenet, ha van akkor ezt átadjuk a nézetnek a message változóba: $this->view->message a getMessages()

függvény segítségével. Ajánlatos ezt minden eseménykezelőbe beleilleszteni, hátha a későbbiekben használni fogjuk, ne kelljen mindig külön megnézni, hogy ezt beleírtuk e.

Az már megvan, hogy kiszedjük az üzenetet s átadjuk a nézetnek, nah de ki is kellene íratni a képernyőre, különben semmit nem ér, ezt a következőképpen tehetjük meg. Lépjünk az application\views\scripts\kapcsolat.phtml forrásunkba. Legelső sorként adjuk hozzá az alábbi kódsort, ami annyit csinál, hogy ha létezik a $this->message változó(van e tartalma és nem null értékkel rendelkezik) akkor kiírja felhasználónk számára az üzenetet:


<?php if($this->message){
echo '<h3>Üzenet:</h3>';
print_r('<p">'.$this->message.'</p>');
}?>

Ezt is, hozzáadhatjuk minden nézetünk elejéhez, ezzel minden átírányítás üzenet kiírás automatikusan lefut mindenhol.

Most már, ha eddig mindent jól csináltunk, akkor félig kitöltött, kitöltetlen űrlap esetén a Kérem töltsön felirat jelenik meg a felhasználónk számára. 🙂

Most ellenőrizzük le, hogy a megadott email cím megfelel e a helyes (valid) emailcím konvencióknak. Ennek megoldására, nem kell saját mintát illesztenünk a ZF-ben erre is van már egy megoldás. Lássuk ezt most röviden:

Ennek leellenőrzésére a Zend_Validate_EmailAddress() objektum lesz segítségünkre. Hozzunk létre egy ilyen objektumot, majd az isValid() metódus segítségével ellenőrizzük le az email cím helyességét. Az alábbi sorok azt mutatják, hogy ha megfelel az email cím akkor kiírja a képernyőre a felhasználónak, hogy megfelel az emailcíme, különben meg azt hogy nem, alkalmazva az átirányítás, flashMessenger megoldásokat:

$emailValidator = new Zend_Validate_EmailAddress();
if ($emailValidator->isValid($k_email)) {
//ha valid
$this->_helper->flashMessenger->addMessage("Az email cím megfelel!");
$this->_redirect('index/kapcsolat');
}
else{
//minden más esetben
$this->_helper->flashMessenger->addMessage("Az email cím nem felel meg!");
$this->_redirect('index/kapcsolat');
}

Most már minden mezőt ki kell töltenie a felhasználónak, helyes email címet is meg kell adnia, ha ezt nem teszi hibaüzenetek sorát kapja. Nem maradt más dolgunk, mint az üzenetet elküldeni saját levelesládánkba. Ezt a következőképpen tehetjük meg.

Létre kell hoznunk egy saját Zend_Mail obejektumot, meg kell adni, az üzenet tárgyát, a feladó azaz a látogatónk email címét, az üzenet tartalmát, meg kell adni melyik email címünkre küldje a levelet majd el is kell küldeni.

Lássuk, hogyan kell csinálni:

$mail = new Zend_Mail();
$mail->setBodyText($k_uzenet);
$mail->setFrom($k_email);
$mail->addTo('info@demokft.hu');
$mail->setSubject($k_targy);
$mail->send();

A setBodyText($k_uzenet) segítségével a küldendő email tartalma a $k_uzenet változónk tartalma lesz, azaz amit a portál látogatója az üzenet űrlap elembe gépelt. A setFrom($k_email) utasítás segítségével megadjuk, hogy ki a feladó, azaz a látogatónk email címe kerül ide. Az addTo(‘info@demokft.hu’) utasítás segítségével megadjuk, kinek melyik email címünkre kell küldeni a levelet, ez a céges elektronikus levelezőcímünk. Meg kell adni az email tárgyát amit a setSubject($k_targy) utasítás segítségével valósítunk meg. Ezután a send() utasítás segítségével a webszerver elküldi az email-t. Azaz a látogatónk kapcsolatfelvételi kísérlete sikeres lesz, ezzel akár egy új ügyfelet nyerhetünk.

(Megj.: WAMP vagy lokális szervern nem fog futni, ha csak nem publikáltuk a lokális szerverünket a külvilág felé, ezt nem ajánlatos megtenni, mert számítógépünkre könnyen betörhetnek, ha mindenképpen ki akarjuk próbálni, tegyük fel tárhelyünkre, ahol jogosultak vagyunk email küldésére webszerverről)

Most összefoglalásként lássuk egybe az IndexController/processKapcsolatAction() eseményt:

public function processKapcsolatAction()
{
$k_email = Zend_Filter::get($this->getRequest()->getPost('k_email'), 'StripTags');
$k_targy = Zend_Filter::get($this->getRequest()->getPost('k_targy'), 'StripTags');
$k_uzenet = Zend_Filter::get($this->getRequest()->getPost('k_uzenet'), 'StripTags');
if($k_email=='' || $k_targy=='' || $k_uzenet==''){
//ha van olyan mező ami nincs kitöltve akkor "Kérem töltsön ki minden mezőt!"
//felírat jelenjen meg
$this->_helper->flashMessenger->addMessage("Kérem töltsön ki minden mezőt!");
$this->_redirect('index/kapcsolat');
}
else{
//minden mező ki van töltve
$emailValidator = new Zend_Validate_EmailAddress();
if ($emailValidator->isValid($k_email)) {
//ha valid
$mail = new Zend_Mail();
$mail->setBodyText($k_uzenet);
$mail->setFrom($k_email);
$mail->addTo('info@demokft.hu');
$mail->setSubject($k_targy);
$mail->send();
$this->_helper->flashMessenger->addMessage("Az üzenet sikeresen elküldésre került! Munkatársunk, hamarosan felveszi önnel a kapcsolatot");
$this->_redirect('index/kapcsolat');
}
else{
//minden más esetben
$this->_helper->flashMessenger->addMessage("Az email cím nem felel meg!");
$this->_redirect('index/kapcsolat');
}
return true;
}
} // public function processKapcsolatAction()

Reklámok

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s