|
In acest tutorial ne vom ocupa de implementarea unui model extins din clasa Zend_Db_Table_Abstract, apoi vom crea controller-ul principal si vom adauga actiunile pentru adaugarea si stergerea stirilor.
Aceasta reprezinta a doua parte din seria de tutoriale "Implementarea unui modul de stiri in Zend Framework", deci, daca nu ai parcurs prima parte, o poti accesa aici.
Modelul News
Pentru inceput, avem nevoie de un model care sa faca legatura cu tabelul STIRI care se afla in baza de date. Acesta este de fapt o clasa copil a Zend_Db_Table_Abstract, ce reprezinta baza pentru orice model din Zend Framework si implementeaza o serie de metode pentru lucrul cu tabele. Cateva dintre cele mai utilizate functii are acestei clase sunt:
- insert($arrData) - are ca parametru un array asociativ de tipul nume_coloana => valoare, pe care il insereaza ca un rand in tabela;
- update($arrData,$where) - are ca parametri un array asociativ de tipul nume_coloana => valoare si un sir de caractere ce reprezinta o conditie, utilizate pentru a forma un query UPDATE;
- delete($where) - sterge toate randurile ce indeplinesc conditia $where;
- fetchAll($where), fetchRow($where) - formeaza interogari de tip SELECT pentru citirea informatiilor din tabela.
Acestea fiind spuse, in directorul models vom crea un fisier denumit NewsModel.php, in care vom scrie urmatorul cod:
<?php
class NewsModel extends Zend_Db_Table_Abstract {
public $_name = 'STIRI';
public $_primary = array('Id');
}
?>
Dupa cum poti observa, proprietatea _name este initializata cu numele tabelei MySQL. In cazul in care aceasta lipseste, numele tabelei este initializat in mod implicit cu numele clasei.
Pentru a defini cheia primara avem nevoie de proprietatea _primary. Aceasta poate lua ca valoare fie un sir de caractere cu denumirea coloanei ce reprezinta cheia primara, fie un array de string-uri daca tabela are mai multe chei primare.
In cazul in care logica aplicatiei necesita initializari suplimentare la declararea unui obiect, acestea se vor face in metoda init(), ce este apelata in mod automat dupa ce toate metadatele tabelului au fost procesate. Este recomandat sa utilizezi aceasta medota in locul __construct.
Ca exemplu, am adaugat o proprietate suplimentara _columns, in care vom retine toate coloanele tabelei noastre. Pentru aceasta, in metoda init() am preluat informatiile ce ne intereseaza din obiectul curent si le-am memorat in _columns.
<?php
protected $_columns = array();
public function init() {
$infoDBTabel = $this->info();
$this->_columns = $infoDBTabel['cols'];
}
?>
Ca ultima observatie, retine ca pentru a putea utiliza un model trebuie sa instantiezi clasa astfel:
<?php
$NewsModel = new NewsModel();
?>
dupa care vom putea apela diversele metode din Zend_Db_Table_Abstract.
Controller-ul principal si view-ul implicit
Acum ca avem modelul, putem incepe sa scriem codul pentru controller-ul principal. Mai intai, in directorul controllers vom crea fisierul IndexController.php. Denumirea IndexController specifica faptul ca acesta este controller-ul default, ce va fi apelat in mod automat la accesarea url-ului http://numedomeniu.ro/public.
Pentru inceput, vom scrie urmatorul cod:
<?php
class IndexController extends Zend_Controller_Action {
public function indexAction() {
$viewObject = new Zend_View();
$viewObject->setScriptPath(APPLICATION_PATH.'views/');
echo $viewObject->render("index.phtml");
}
}?>
Dupa cum poti observa, am definit actiunea index, ce are rolul de a incarca si de a afisa continutul fisierului index.phtml din directorul views. Aceasta functie este de asemenea apelata automat, deci pentru a o rula este de ajuns sa accesezi directorul public. Cu alte cuvinte, caile:
http://numedomeniu.ro/public/
si
http://numedomeniu.ro/public/index/index/
sunt echivalente.
Pentru ca momentan nu avem nici un template (in afara celui de eroare), in directorul views vom defini fisierul index.phtml cu urmatorul continut:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Modul de stiri in ZF</title>
<link type="text/css" rel="stylesheet" href="<?php echo DIR_LOCALPATH;?>styles/style.css" />
</head>
<body>
<div align="left" style="padding:50px;">
<h1>Modul de stiri</h1>
<ul>
<li><a href="<?php echo DIR_LOCALPATH?>index/add">Adaugare stire</a></li>
<li><a href="<?php echo DIR_LOCALPATH?>index/view">Vizualizare / editare stiri</a></li>
</ul>
</div>
</body>
</html>
Browserul va afisa:
Dupa cum poti vedea, acest fisier cuprinde un meniu foarte simplu care ne trimite catre paginile de adaugare si vizualizare stiri. Retine ca pentru celelalte actiuni din controller-ul Index va trebui sa specifici calea completa, inclusiv denumirea controller-ului (de exemplu http://numedomeniu.ro/public/index/add sau http://numedomeniu.ro/public/index/view).
Adaugarea unei stiri
In primul rand, pentru adaugare va trebui sa afisam un formular care sa contina campurile titlu, data, descriere si continut ce vor fi salvate in baza de date. In directorul views vom crea fisierul add.phtml cu urmatorul cod html:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Modul de stiri in ZF</title>
<link type="text/css" rel="stylesheet" href="<?php echo DIR_LOCALPATH;?>styles/style.css" />
</head>
<body>
<div align="left" style="padding:50px;">
<ul style="padding:0px;margin:0px;">
<li><a href="<?php echo DIR_LOCALPATH?>">Inapoi la prima pagina</a></li>
</ul>
<h1>Adaugare stire</h1>
<form name="addform" id="addform" action="<?php echo DIR_LOCALPATH?>index/addsave" method="post" enctype="multipart/form-data">
<table width="100%" border="0" cellpadding="2" cellspacing="2">
<tr>
<td width="120">Titlu</td>
<td><input type="text" name="title" id="title" /></td>
</tr>
<tr>
<td>Data</td>
<td><input type="text" name="date" id="date" value="<?php echo date('Y-m-d');?>" /></td>
</tr>
<tr>
<td valign="top">Descriere</td>
<td><textarea name="description" id="description" rows="5" cols="70"></textarea></td>
</tr>
<tr>
<td valign="top">Continut</td>
<td><textarea name="content" id="content" rows="10" cols="70"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="submitBtn" id="submitBtn" value="Salveaza" /></td>
</tr>
</table>
</form>
</div>
</body>
</html>
Ca observatie, poti vedea ca formularul de adaugare cuprinde atat un link de revenire la pagina principala, cat si un buton de submit care va transmite informatia catre actiunea addsave din controllerul Index. Pentru a-l afisa, in controller vom adauga urmatoarea metoda:
<?php
public function addAction() {
$viewObject = new Zend_View();
$viewObject->setScriptPath(APPLICATION_PATH.'views/');
echo $viewObject->render("add.phtml");
}
?>
Browserul va arata urmatoarea pagina:
Actiunea addsave este ceva mai complicata:
<?php
public function addsaveAction() {
if($this->getRequest()->isPost()) {
$POST = $this->getRequest()->getPost();
if(!empty($POST)) {
$arrData = array(
'Titlu' => $POST['title'],
'Data' => $POST['date'],
'Descriere' => $POST['description'],
'Continut' => $POST['content']
);
$NewsModel = new NewsModel();
$lastInsertedRowId = $NewsModel->insert($arrData);
}
}
$viewObject = new Zend_View();
$viewObject->setScriptPath(APPLICATION_PATH.'views/');
echo $viewObject->render("save.phtml");
}
?>
In primul rand, am preluat datele din formular utilizand metoda getRequest() a controller-ului, apoi am construit un array asociativ cu informatiile din post si l-am salvat in baza de date cu ajutorul functiei insert a modelului News. Dupa ce am terminat, am afisat un mesaj de succes cu ajutorul unui view suplimentar denumit save.phtml:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Modul de stiri in ZF</title>
<link type="text/css" rel="stylesheet" href="<?php echo DIR_LOCALPATH;?>styles/style.css" />
</head>
<body>
<div align="left" style="padding:50px;">
<ul style="padding:0px;margin:0px;">
<li><a href="<?php echo DIR_LOCALPATH?>">Inapoi la prima pagina</a></li>
<li><a href="<?php echo DIR_LOCALPATH?>index/view">Inapoi la vizualizare stiri</a></li>
</ul>
<h1>Salvare stire</h1>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>Stirea a fost salvata cu succes.</td>
</tr>
</table>
</div>
</body>
</html>
Stergerea unui stiri
Pentru a sterge o stire avem nevoie de o singura actiune care sa accepte ca parametru id-ul randului pe care vrem sa il stergem:
<?php
public function deleteAction() {
if(is_numeric($this->_request->getParam('id')) && $this->_request->getParam('id') != 0) {
$NewsModel = new NewsModel();
$NewsModel->delete('Id = '.$this->_request->getParam('id'));
}
$viewObject = new Zend_View();
$viewObject->setScriptPath(APPLICATION_PATH.'views/');
echo $viewObject->render("delete.phtml");
}
In browser, parametrul id este concatenat caii care duce catre actiunea respestiva astfel:
http://numedomeniu.ro/public/index/delete/id/4
Bineinteles, in template-ul delete.phtml afisam un mesaj si linkuri catre celelalte pagini:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Modul de stiri in ZF</title>
<link type="text/css" rel="stylesheet" href="<?php echo DIR_LOCALPATH;?>styles/style.css" />
</head>
<body>
<div align="left" style="padding:50px;">
<ul style="padding:0px;margin:0px;">
<li><a href="<?php echo DIR_LOCALPATH?>">Inapoi la prima pagina</a></li>
<li><a href="<?php echo DIR_LOCALPATH?>index/view">Inapoi la vizualizare stiri</a></li>
</ul>
<h1>Salvare stire</h1>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td>Stirea a fost stearsa cu succes.</td>
</tr>
</table>
</div>
</body>
</html>
Aici se incheie acest tutorial. In ultima parte veti putea citi atat despre citirea din baza de date si vizualizarea stirilor, cat si despre modificarea acestora.
|