Visų pirma norėčiau pradžiuginti visus, pasirodė Zend Framework 1.5.0 Preview, bet kadangi tai tik Preview, tai toliau straipsnyje nagrinėsiu senąją 1.0.3 versiją.
Pasižadėjau parodyti, kaip sukurti sistemą su prisijungimu, tai ir pratęsiu savo pasakojimą pradėtą straipsnyje: Norit PHP sudėtingai?. Prieš pasakodamas toliau, norėčiau padėkoti visiems už protingus komentarus, ypač neworld už tai, kad pasidalino naudinga informacija.

Šiuo momentu turime tik sistemą, kuri išveda įrašus iš duomenų bazės. Laikas skaityti toliau dokumentaciją ir pabandyti kurti programą.
Ilgai galvojęs nusprendžiau, jog neverta visko suplakti į vieną vietą, ne kiaušinienę darom, ir prisijungimui sukurti atskirą valdiklį. Tiems, kas neprisimena ankstesnio straipsnio, priminsiu, jog valdikliai rašomi direktorijoje application\controllers. Sukuriu failą LoginController. Pirmiausia apsirašysime indexAction

class LoginController extends Zend_Controller_Action
{
 
function indexAction()
    {
	$this->view->message ="Prisijungimas";
    }

Šiuo atveju indexAction, tiesiog atvaizdos index.phtml, kurį mes apsirašysime kiek vėliau.
O dabar apsirašykite loginAction

 function loginAction()
    {
        $this->view->message = '';
        if ($this->_request->isPost()) {
 
            $username = $this->_request->getPost('username');
            $password = $this->_request->getPost('password');

Pirmiausia patikriname ar POST masyve yra duomenų ir jeigu yra juos prisikiriam kintamiesiems, su kuriais toliau dirbsime.

Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
$db = Zend_Registry::get('db');
$authAdapter = new Zend_Auth_Adapter_DbTable($db);
$authAdapter->setTableName('demo_users');
 
$authAdapter->setIdentityColumn('login');
$authAdapter->setCredentialColumn('password');
 
$authAdapter->setIdentity($username);
$authAdapter->setCredential($password);
 
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);

Šiomis eilutėmis mes užsikrauname Zend autentifikacijos klasę ir apsirašome lentelę bei laukus, kurie bus naudojami autentifikacijos patvirtinime. Dabar tiems laukams priskiriame kintamuosius ir įvykdome užklausimą

if ($result->isValid()) {
   $data = $authAdapter->getResultRowObject(null, 'password');
   $auth->getStorage()->write($data);
   $this->_redirect('/');
} else {
     $this->view->message = 'Prisijungimas nepavyko.';
}

Jeigu pavyko, tai nukreipiame vartotoją į puslapio index failą, kurį apsirašėme anksčiau, o jeigu ne, tiesiog išvedame žinutę tame pačiame lange. Tiesa, kad išvedimas įvyktų dar reikia parašyti kelias eilutes ir gali būti nelabai aišku man taip išskaidžius kodą dalimis, bet viskas paaiškės, kai pamatysite bendrą vaizdą.

     }
    $this->view->title = "Prisijungimas";
    $this->render('index');
  }	   	
}

Dabar einame į direktoriją application\views\scripts ir ten susikuriame kitą login, kurioje bus talpinami visi su prisijungimu susiję vaizdai, sukursime failą index.phtml

<?php if(!empty($this->message)) 
echo $this->escape($this->message);
?>
 
<form action="login/login" method="post">
<div>
    <label for="username">Vartotojas</label>
    <input type="text" name="username" value=""/>
</div>
<div>
    <label for="password">Slaptazodis</label>
    <input type="password" name="password" value=""/>
</div>
<div id="formbutton">
<input type="submit" name="login" value="Pirmyn" />
</div>
</form>

Pabandykite, jau veikia. Laikas grįžti prie IndexController, bet pirmiausia patobulinsime jo kuriamą vaizdą.
Direktorija application\views\scripts\index failas index.phtml

<table>
<?php foreach($this->note as $note) : ?>
<tr>
	<td><?php echo $this->escape($note->title);?></td>
	<td><?php echo $this->escape($note->story);?></td>
	<td><a href="index/delete/del/<?php echo ($note->id);?>">Trinti</a></td>
</tr>
<?php endforeach; ?>
</table>

Tiems, kas nepastebėjo ką pakeičiau, tai pridėjau mytuką “Trinti” ir dabar IndexController apsirašysiu deleteAction

  function deleteAction()
    {
       Zend_Loader::loadClass('Notes'); 
       $note = new Notes();
       $id=(int)$this->_request->getParam('del');
       if ($id>0) {
         $where = 'id = ' . $id;
         $rows_affected = $note->delete($where); 
        } 
      $this->_redirect('/');
    }

Toks veiksmas tikrai veiks, tačiau jį galės atlikti visi, net ir neturintys prisijungimo vartotojai, kas mums visai nepatinka.
Todėl kodą mes padailinsime keletu eilučių.

function deleteAction()
{
  $auth = Zend_Auth::getInstance();
   if ($auth->hasIdentity()) {
   // cia prasideda senas kodas     
       Zend_Loader::loadClass('Notes'); 
       $note = new Notes();
       $id=(int)$this->_request->getParam('del');
       if ($id>0) {
         $where = 'id = ' . $id;
        $rows_affected = $note->delete($where); 
       } 
     $this->_redirect('/');
// čia senas kodas baigiasi
    } else {
       $this->_redirect('login/login');
      }   
 }

Dabar trinti galės tik prisijungę žmonės.
Analogiškai galime pasidaryti mygtukus “Keisti” bei “Įterpti naują”. Manau, juos sugebėsite pasidaryti ir be manęs.
Šioje programoje lieka viena smulkmenėlė, mygtukas “Trinti” matomas neprisijungusiems vartotojas, vienas iš būdų jį pašalinti, tai prisijungus nukreipti vartotoją į kitą vaizdinį, bet gal kas nors gali pasiūlyti geresnį sprendimą?
Visą sukurtos programos kodą galite parsisiųsti iš čia. (Pastaba: archyvas be Zend framerwork)

Jau reikėtų apibendrinti savo dviejų dienų potyrius. Visų pirma norėčiau pasakyti, jog naujokui visi dalykai iš pradžių būna sunkūs. Ir tikrai reikalauja žinių bei patirties. Kita vertus jis suteikia daugybę galimybių ir nuostabią dokumentaciją tereikia mokėti pasinaudoti tuo, kas duota.
Trumpai ir aiškiai: nenoriu sakyti, kad yra blogai, kaip kai kuriems skaitytojams galėjo pasirodyti, tačiau taip pat nesiruošiu tvirtinti, jog tai geriausias sprendimas/pasirinkimas. Bet koks kategoriškas tvirtinimas būtų labai šališkas, ypač prieš tai nepabandžius kitų alternatyvų.

Panašūs straipsniai


“Zend framework - prisijungimas” komentarų: 16

  1. asterisk

    Tam, kad nebūtų rodomas “trinti” ir t.t. mygtukai neprisijungusiam vartotojui, reikia perduoti identity į view. Paprasčiausias būdas tai padaryti tai sukurti kažką tokio IndexController.php:

    public function init()
    {
        parent::init();
        $this->_auth = Zend_Auth::getInstance();
        $this->view->identity = $this->_auth->getIdentity();
    }

    Dabar view`e galima bus patikrinti ar $this->identity tuščias ar ne. init funkcija bus inicijuojama ties visais actions. Nereikės kiekvienam action to pačio kodo rašyt. Na o $this->_auth panaudojau, nes dabar visuose actions galima vietoj kiekvieną kartą Zend_Auth::getInstance() inicijavimo tiesiog naudoti $this->_auth, nes viskas, kaip sakiau, kas init, automatiškai daroma paleidžiant tam kontroleryje bet kokį action.
    Nežinau ar aiškiai pasakiau, bet turėjot suprast.

  2. vaidas

    O nelogiskiau vadinti usercontroller o ne login?

  3. neworld

    login yra trumpiau :)

  4. elt.lt » Blog Archive » Apžvalga. Šiandien aš skaičiau… #35

    […] tobulina „Zend Framework” […]

  5. Sepa

    Svarbiausia ne katras populiariausias ir pasak daugumos geriausias, svarbiausia - kad pačiam patogu ir nereikia knistis giliai, kad kažką padaryt. Kolkas šiuo klausimu ZF mane tenkina, tačiau va praeitame straipsnyje kažkas paminėjo, kad Symfony - skirtas aukšto intelekto žmonėms.

    Sukilo ambicijos, tad artimiausiu laiku, jei darbai mokslai egzaminai visokie kitokie niekai neužspaus - pasinagrinėsiu. Noriu būt aukšto intelekto žmogus. :D

  6. zDk

    Kuo giliau nagrinėju “Zend framework”, tuo labiau pradeda man jis patikt. Geras straipsnis.
    Nesustok rašyt apie freimwork’ą ties šiuo login’u :)

  7. Sepa

    Dėl kontrolerio pavadinimo - tai čia skonio reikalas. Aš irgi turbūt daryčiau UserController su veiksmais login, logout, profile. Kažkaip man atrodo labiau “sava”. :)

    Žodžiu, laukiam tęsinių - čia tikrai bus naudingas resursas LT kalba

  8. insane

    Daugiau nei pries metus kaip tik nusprendziau naudot koki tai freimworka. Ziurejau i cakephp, po to i zend, bet symfony vistik labiausiai tenkino mano reikalavimus
    Tik nezinau kodel kazkas ivertino symfony kaip kazka tokio sudetingo..
    Aisku teko pradzioj pavargt su dokumentacijom kad suprast kaip kas veikia, bet paskui po truputi isivaziuoti. plius kai ten metosi kalnai pluginu, tai faktiskai nereik sukt galvos apie visokiu prisijungimu rasyma) bet aisku sitas straipsnis skirtas labiau zendo pazinimui

  9. sirex

    Kažkoks tai labai jau griozdiškas tas Zend Frameworkas. Aišku kol kas pagrindinės Zend Frameworko įdėjos nepagavau, nes paprasčiausiai nelabai aiškinausi, tačiau pirmas įspūdis tikrai ne koks. Python ar RoR frameworkai gerokai tobulesni…

  10. asterisk

    sirex, python ne freimworkas, RoR ne programavimo kalba.

    Zend Frameworko esmė yra ne automagic funkcijos, kurios viską interpretuoja automatiškai. Tarkim RoR turi tam tikrus standartus ir rėmus į kuriuos turi tilpti. Čia atvirkščiai - laisvė. Gali pasinaudoti tik viena klase, gali pasinaudoti visomis galimybės, kaip MVC and so on. Zend Framework - klasių rinkinys, kuris veikia ir kartu ir visiškai atskirai, pavieniui. Zend Frameworku gali integruoti į bet kokį kitą php frameworką (jeigu jis leidžia 3rdparty klases). Tame ir pasireiškia ZF kietumas :)

  11. Savaitgalio skaitiniai #50 » Pixel.lt

    […] Sveiki, sveikinu su 50 savaitgaliu, per kurį pateikiame skaitinius! Atsiprašau, jog šią savaitę nebuvo pateikti PHP klausimai, jie bus pateikti kitą savaitę su praėjusios savaitės rezultatais. Šią savaitę NePo pratęsė savo Zend Framework tyrinėjimus ir parašė straipsnį apie autentifikacijos kūrimą. […]

  12. NightVisio

    Trumpai ir aiškiai: nenoriu sakyti, kad Zend Framework yra blogai, kaip kai kuriems skaitytojams galėjo pasirodyti, tačiau taip pat nesiruošiu tvirtinti, jog tai geriausias sprendimas/pasirinkimas. Bet koks kategoriškas tvirtinimas būtų labai šališkas, ypač prieš tai nepabandžius kitų alternatyvų.

    Mielas NePo, norechiau pridurti, kad Zend Framework yra THE BEST SOLUTION FOR PHP EVER!!! Lygiai tas pats isheitu - ( tarkim ) “as chia nelabai zhinau kas ta gitara, ten dauguma akordu sudetingi, reishkia gitara nelabai koks instrumentas…”!!!

    Idomus shiais laikais zhmones, ko gerai neishmano - tas reishia nera “geriausias sprendimas”, arba ish vis “lamuku irankis”….

  13. Vox

    Man tik idomu, neturiu pries nieko nei Zend Framework’us, Cakus ar smarcius, bet atsiprasant kuriu velniu rasiti koda kitaip, jei yra tai paprasta ispresta php? Kuriem velniams darasyti dar pvz. zendo funkcijas? jei galima ta rasyti php? Ar as nesuprantu nieko? Pasakykit man tamsuoliui….:) Kame privalumas?

  14. asterisk

    Vox, nusišnekėjai kaip reikalas :) Išsiaiškink ką reiškia framework ;)
    Dėl smarty sutinku - it’s useless.

  15. NePo

    Vox, atsakymas labai paprastas, atsakysiu užduodamas klausimą, kam rašyti, tai kas jau parašyta? Kam gaišti savo laiką jeigu gali panaudoti tai kas padaryta pakankamai gerai? Zend framework atvejų, kaip kurie sprendimai padaryti įpatingai gerai :)
    Teoriškai frameworkai reikalingi tam kad sutaupytų tau laiką ir palengvintų rutininius darbus :)

  16. Zenla

    Daug laiko domejausi ZF. Taciau teko imoneje pradeti dirbti su CI.
    Visko pilnai uztenka ka turi CI. ZF griozdas labiau tinkantis PHP navarotams mokytis. Komerciniam projektui niekad neimciau ZF.

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.