www.romver.ru
/ Полный список статей / CMS на основе стандарта ZF

Как заказать сайт


АБРАКАДАБРА (Тоже самое но в читаемом виде)

Neodnokratno a stalkivalsa s mneniem, 4to v manuale po Zend Framework o4en' malo tutorialov, to est' v nem xoro6o opisani otdel'nie klassi, no tajelo razobrat'sa kak ix ispol'zovat' vmeste. Sey4as a popitaus' vospolnit' etot nedostatok. Stat'a prednazna4ena dla na4inau6ego i srednego urovna. Posle pro4tenia vi smojete sozdavat' prostie sayti na baze Zend Framework. V konce vi smojete ska4at' polnocenniy rabo4iy kod mini sayta - primera, razrabotannogo special'no pod stat'u. Kod bil protestirovan na Zend Framework 1.5.2, php 5.2.0, mysql 5.0, apache 1.3

V sayte realizovano:
  • Pattern MVC - na osnove Zend_Controller, Zend_View, Zend_Layout i Zend_Db
  • Upravlenie konfiguracionnimi faylami - Zend_Config
  • Rabota s bazoy dannix - Zend_Db, Zend_Db_Select, Zend_Db_Table
  • Otdelenie predstavlenia (vida) s pomo6'u sistemi 6ablonov - Zend_View
  • Dvuxetapnoe predstavlenie - Zend_Layout
  • Upravlenie mar6rutami - Zend_Controller_Router_Rewrite
  • Avtomati4eskaa zagruzka klassov - Zend_Loader
  • Rabota s isklu4eniami i obrabot4ik o6ibok
Start
Dla polu4enia bazovix navikov pro4tite predidu6uu stat'u. Tam mi raspolagali php fayli vne document root direktorii, no u4itivaa, 4to na6i xosteri 4asto ne daut takoy vozmojnosti, teper mi budem raspolagat' vse fayli vnutri document root.

Itak, ska4ivaem poslednuu stabil'nuu versiu freymvorka, razarxiviruem i vibiraem klassi dla raboti. Po4ti vse klassi Zend Framework mojno ispol'zovat' nezavisimo, poetomu viberem tol'ko nujnie. Vot tak vigladit na6 spisok faylov i papok biblioteki Zend:

Faylovaa struktura Zend Framework
Ris. 1. Faylovaa struktura Zend Framework


A vot tak vigladit derevo papok sayta:

Derevo papok sayta na baze Zend Framework
Ris. 2. Derevo papok sayta


Vo mnogom struktura ostalas' takaa je kak v pro6loy stat'e. Vse nazvania papok polnost'u sootvetstvuut faylam, 4to lejat v nix, poetomu, kommentirovat' ix ne budu. Otme4u tol'ko 4to v papku system a kladu sistemnie fayli, kotorie trudno otnesti k kakoy-libo 4asti MVC. Dla lu46ego ponimania vi mojete srazu ska4at' kod, smotret' i sravnivat'. Krome togo kod obil'no otkommentirovan.
Ob6iy algoritm raboti sayta
Dla ob6ego ponimania a sxemati4eski izobrazil algoritm raboti sayta.

Algoritm raboti sayta na baze Zend Framework
Ris. 3. Algoritm raboti sayta


Kak i ranee s pomo6'u fayla .htaccess vse zaprosi k saytu perenapravlautsa na vxodnuu to4ku - fayl index.php leja6iy v korne document root.


RewriteEngine on

RewriteBase /

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d

RewriteRule ^(.*)$ index.php/$1
Ne perenapravlautsa tol'ko zaprosi na real'no su6estvuu6ie fayli, poetomu vo izbejanie nepriatnix situaciy srazu zakrivaem dostup v papku applications gde raspolojeni php fayli. Dla etogo kladem tuda .htaccess zapre6au6iy dostup k lubim faylam.

Rassmotrim kod fayla index.php

<?php

// Podklu4aem fayl nastroek
require 'applications/settings/config.php';

// Sozdaem stroku putey
$paths = implode(PATH_SEPARATOR,
array (
$config['path']['libs'],
$config['path']['models'],
$config['path']['system']
));

// Puti po kotorim proisxodit poisk podklu4aemix faylov, eto papka bibliotek, modeley i sistemnix faylov
set_include_path($paths);


// Podklu4enie glavnogo sistemnogo klassa
require 'Kernel.php';

// Zapusk prilojenia
Kernel::run($config);
Tak kak mi ne xotim kajdiy raz ukazivat' polniy put' k nujnim faylam - zadaem set_include_path. Podklu4aemie fayli eto biblioteki Zend, sistemnie klassi, a takje klassi modeli. index.php zapuskaet Kernel::run() - osnovnoy metod na6ego "adrenogo" klassa Kernel.php. Etot klass prednazna4en dla inicializacii i nastroyki okrujenia.


public static function run($config) {

try {

// Zapusk autoload
Zend_Loader::registerAutoload();

// Sozdanie ob&ekta konfiguracii
$cnf = new Zend_Config($config);

// Zanesenie ob&ekta konfiguracii v reestr
Zend_Registry::set('cnf', $cnf);

// Podklu4enie k baze dannix
self::setDbAdapter();

// Podklu4enie fayla s pravilami mar6rutizacii
if (file_exists($cnf->path->system.'routes.php')) {
require($cnf->path->system.'routes.php');
}

// Inicializacia Zend_Layout, nastroyka puti k maketam, a takje imeni glavnogo maketa.
Zend_Layout::startMvc(array(
'layoutPath' => $cnf->path->layouts,
'layout' => 'index',
));

// Polu4enie ob&ekta Zend_Layout
$layout = Zend_Layout::getMvcInstance();

// Inicializacia ob&ekta Zend_View
$view = $layout->getView();

// Nastroyka ras6irenia maketov
$layout->setViewSuffix('tpl');

// Zadanie bazovogo URL
$view->baseUrl = $cnf->url->base;

// Zadanie puti dla view 4asti
$view->setBasePath($cnf->path->views);

// Ustanovka ob&ekta Zend_View
$layout->setView($view);

// Nastroyka ras6irenia view skriptov s pomo6'u Action pomo6nikov
$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
$viewRenderer->setView($view)
->setViewSuffix('tpl');

Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

// Sozdanie ob&ekta front kontrollera
$front = Zend_Controller_Front::getInstance();

// Nastroyka front kontrollera, ukazanie bazovogo URL, pravil mar6rutizacii
$front->setBaseUrl($cnf->url->base)
->setRouter($router);

// Zapusk prilojenia, v ka4estve parametra peredaem put' k papke s kontrollerami
Zend_Controller_Front::run($cnf->path->controllers);

}
catch (Exception $e) {
// Perexvat isklu4eniy
Error::catchException($e);
}
}
Prakti4eski kajdaa stro4ka otkommentirovana i uje sey4as vi mojete polnost'u predstavit' sebe sxemu raboti sayta-primera.

Dalee, predpolojim mi obratilis' k sleduu6ey stranice na6ego sayta http://ilovezf/pages/1/ V etom slu4ae budet vizvan IndexController i ego deystvie PageAction. (Takoe povedenie proisxodit potomu 4to a dobavil special'noe pravilo v fayl mar6rutov routes.php, po umol4aniu po takomu zaprosu vizovetsa kontroller PagesController i deystvie 1, kone4no esli oni su6estvuut)

V kontrollere proisxodit podklu4enie modeli i polu4enie dannix neobxodimix zapro6ennoy stranice. Zatem proisxodit opredelenie peremennix dla vida.

Nakonec v glavniy maket applications/views/scripts/index.tpl podstavlautsa nujnie nam dannie i ves' polu4enniy rezul'tat otpravlaetsa v brauzer.

Dalee a bolee podrobno ostanovlus' na klu4evix momentax postroenia na6ego prilojenia.

Zend_Loader

Etot klass pozvolaet ispol'zovat' odnu iz zame4atel'nix vozmojnostey php5 - avtomati4eskuu zagruzku ob&ektov, ina4e nazivaemuu autoload. Esli vi pi6ite OOP prilojenie to u vas, doljno bit', ne odin desatok razli4nix klassov, i na nekotorix stranicax nujno podklu4it' 5-10 klassov. Esli takix stranic mnogo, to eto o4en' nepriatno. S Zend_Loader vam dostato4no vsego li6' ukazat' nazvanie klassa v nujnom formate, i on sam proizvedet podklu4enie.

To est', v kode naprimer pi6em $news = new Text_News_Home();

Simvol "_" ispol'zuetsa kak razdelitel', Zend_Loader budet pitat'sa nayti ukazanniy klass po adresu Text/News/Home.php. (V rassmatrivaemom primere v index.php a ukazal otnositel'no kakix direktoriy budet proisxodit' poisk)

Dla avtomati4eskoy zagruzki mojno ispol'zovat' metod Zend_Loader::loadClass() no a rekomenduu vipolnat' Zend_Loader::registerAutoload(); 4to bi ne pisat' kajdiy raz Zend_Loader::loadClass(). Pravda registerAutoload() trebuet nali4ie modula spl_autoload.

Zend_Registry

Klass realizuet pattern singleton i takim obrazom pozvolaet nam obra6at'sa k nujnim ob&ektam iz lubogo mesta koda. Eto al'ternativa ispol'zovaniu global'nix peremennix. Klass operiruet nekim reestrom, v kotoriy zanosatsa ob&ekti. Klu4evie metodi klassa eto get i set, kotorie zanosat i polu4aut ob&ekti v reestr sootvetstvenno. V sayte-primere v reestr zanosatsa ob&ekti soedinenia s BD i ob&ekt konfiguracii. Takje vajen metod isRegistery proverau6iy su6estvovanie ob&ekta v reestre.

Zend_Config

Klass pozvolaet v OOP stile rabotat' s konfiguracionnimi faylami. Podderjivautsa konfiguracionnie fayli razli4nogo formata: php-massiv, ini - fayl, xml - fayl. Dla rassmatrivaemogo primera a vibral samiy prostoy variant - xranit' nastroyki v php massive. Vi mojete ispol'zovat' luboy. V ob&ekte Zend_Config vse dannie predstavleni v vide associativnogo massiva. Naprimer takim obrazom: $cnf->path->system polu4aem zna4enia fizi4eskogo puti papki s sistemnimi faylami.

Naprimer vot tak mojet vigladet' va6 konfiguracionniy fayl:

<?php
$config = array (
// Nastroyki soedinenia s BD
'db' => array (
'adapter' => 'PDO_MYSQL',
'params' => array(
'host' => 'localhost',
'username' => 'root',
'password' => 'xxxx',
'dbname' => 'ilovezf',
'driver_options'=> array(PDO::ATTR_EMULATE_PREPARES => true),
'profiler' => false,
),
),
);

Upravlenie mar6rutami Zend_Controller_Router_Rewrite

Mar6rutizacia - eto process prinatia URI (toy 4asti URI, kotoraa idet posle bazovogo URL) i ee razlojenia na 4asti dla opredelenia togo, kakoy kontroller i kakoe deystvie etogo kontrollera doljni polu4it' zapros i vipolnit'sa. S pomo6'u Zend_Controller_Router_Rewrite mojno zadavat' razli4nie pravila mar6rutizacii.

<?php

$router = new Zend_Controller_Router_Rewrite();

$router->addRoute('articles',
new Zend_Controller_Router_Route('articles/:articleId',
array('module' => 'default', 'controller' => 'articles', 'action' => 'view'))
);

$router->addRoute('pages',
new Zend_Controller_Router_Route('pages/:pageId',
array('module' => 'default', 'controller' => 'index', 'action' => 'page'))
);
S pomo6'u ukazannix pravil mi dobivaemsa naprimer togo 4to po zaprosu http://ilovezf/articles/1/ budet vizvan kontroller articlesController i deystvie viewAction, krome togo zna4enie identifikatora stat'i (v ukazannom zaprose eto 1) budet dostupno po parametru articleId. Krome Zend_Controller_Router_Route kotoriy ispol'zuetsa dla dinami4eskix mar6rutov, est' e6e Zend_Controller_Router_Route_Static dla postoannix neizmennix mar6rutov, naprimer dla URL tipa http://ilovezf/exit/. Takje su6estvuet Zend_Controller_Router_Route_Regex osnovanniy na regularnix virajeniax, eto samiy gibkiy sposob opredelenia mar6rutov.

Front kontroller

Zend_Controller_Front realizuet pattern Front Controller, ispol'zuemiy v prilojeniax MVC. Ego nazna4enie sostoit v inicializacii okrujenia zaprosa, prolojenii mar6ruta prixoda6ego zaprosa i posleduu6em zapuske viavlennix deystviy. On agregiruet vse otveti i vozvra6aet ix po zaver6enii processa.

// Sozdanie ob&ekta front kontrollera
$front = Zend_Controller_Front::getInstance();

// Nastroyka front kontrollera, ukazanie bazovogo URL, pravil mar6rutizacii
$front->setBaseUrl($cnf->url->base)
->setRouter($router);

// Zapusk prilojenia, v ka4estve parametra peredaetsa put' k papke s kontrollerami
Zend_Controller_Front::run($cnf->path->controllers);

Rabota s isklu4eniami i obrabot4ik o6ibok

Zend Framework predlagaet neskol'ko variantov raboti s isklu4eniami. Vo pervix eto plagin Zend_Controller_Plugins_ErrorHandler, on daet vozmojnost' perexvativat' isklu4enia vizvannie otsutstviem kontrollera ili deystvia, krome togo on perexvativaet isklu4enia vibro6ennie v kontrollerax. Nikakie drugie isklu4enia, naprimer isklu4enia mar6rutizacii, ili isklu4enia vibro6ennie v drugix plaginax on ne perexvativaet. Etot plagin xoro6 imenno dla raboti s o6ibkami tipa 404, on pozvolaet v ramkax ob6ey strukturi maketov otobrazit' stranicu 404 s neobxodimimi soob6eniami. Za plagin otve4aet kontroller ErrorController i deystvie errorAction.

Dla togo je 4to bi vse taki obrabativat' ostal'nie o6ibki v rassmatrivaemom primere ispol'zuetsa e6e odin obrabot4ik o6ibok /applications/system/Error.php.

<?php

class Error {

/**
* Upravlenie o6ibkami
*
* @param exception $exception Perexvativaemoe isklu4enie
*/

public static function catchException(Exception $exception) {

// Polu4enie teksta o6ibki
$message = $exception->getMessage();
// Polu4enie treysa o6ibki kak stroki
$trace = $exception->getTraceAsString();
$str = 'ERROR: ' . $message . "n" . $trace;

$cnf = Zend_Registry::get('cnf');

// Esli vklu4en rejim otladki otobrajaem soob6enie o o6ibke na ekran
if($cnf->debug->on) {
Zend_Debug::dump($str);
}
// Ina4e vivodim soob6enie ob o6ibke
else {
// Zdes' mojet proisxodit' logirovanie o6ibki, uvedomlenie vebmastera i t d
die('System error! Please try later');
}
}
}
V Kernel.php s pomo6'u try i catch vse o6ibki perexvativautsa i peredautsa etomu obrabot4iku. Dalee v zavisimosti ot nastroek rejima debaga v konfiguracionnom fayle, libo pokazivaetsa informacia ob o6ibke v brauzere, libo vidaetsa soob6enie o vremennix nepoladkax.

Dla togo 4to bi vse o6ibki, vklu4aa o6ibki ne naydennix kontrollerov i deystviy, perexvativat' svoim obrabot4ikom, neobxodimo pri nastroyke front kontrollera vipolnit' $front->throwexceptions(true).

Rabota s kontrollerom

Kontroller avlaetsa svazuu6im zvenom mejdu vidom i model'u. Osnovnaa zada4a kontrollera eto proverit' dannie 4to pri6li ot pol'zovatela, vipolnit' te ili inie deystvia s dannimi, ispol'zua metodi modeli, i nakonec opredelit' peremennie dla vida. Dla illustracii privoju otkomentirovanniy kod kontrollera ArticlesController

class ArticlesController extends Zend_Controller_Action {

/**
* Spisok statey
*/

public function indexAction() {

// Sozdanie ob&ekta modeli, blagodara autoload nam net neobxodimosti podklu4at' klass 4erez require
$articles = new ArticlesModel();
// Vipolnenia metoda modeli po polu4eniu spiska stattey
$articlesList = $articles->getArticles();
// Opredelenie peremennix dla vida
$this->view->articlesList = $articlesList;

}

/**
* Vibrannaa stat'a
*/

public function viewAction() {

// Polu4enie parametra pri6ed6ego ot pol'zovatela
$articleId = $this->_getParam('articleId');
// Sozdanie ob&ekta modeli
$articles = new ArticlesModel();
// Vipolnenia metoda modeli po polu4eniu informacii o stat'e
$articleInfo = $articles->getArticles($articleId);
// Opredelenie peremennix dla vida
$this->view->articleInfo = $articleInfo;

}

}

Rabota s model'u

Rabota s model'u prakti4eski ne osve6ena v manuale, v faylovoy strukture predpologaetsa papka models no ne daetsa konkretnix rekomendaciy po ee i spol'zovaniu. Krome togo mojno skazat' 4to ponatia modeli v Zend Framework kak takovogo net. Realizacia etoy 4asti MVC vozlagaetsa na ple4i razrabot4ika. A rassmatrivau model' kak nabor klassov operiruu6ix s dannimi, eto mojet bit' polu4enie dannix, izmenenia dannix, vstavka dannix v bazu dannix ili drugoe xranili6e. A ne dopuskau sostavlenia i vipolnenia sql-zaprosov v klassax kontrollerov. Nazvanie kajdogo klassa modeli sostoit iz dvux slov, samogo nazvania su6nosti dannix i slova "Model", po analogii k nazvaniam kontrollerov. V rassmatrivaemom sayte-primere su6estvuet dva klassa modeli, eto PagesModel i ArticlesModel. V pervom klasse sobrani funkcii rabotau6ie s su6nost'u "stranica", vo vtorom s su6nost'u "stat'i". Klassi modeli avlautsa naslednikami Zend_Db_Table_Abstract. Metodi raboti s bazoy i primer klassa modeli smotrite nije.

Rabota s bazoy dannix

Dla gibkoy raboti s BD Zend Framework predlagaet neskol'ko klassov. Nam ponadobatsa Zend_Db, Zend_Db_Select, Zend_Db_Table, Zend_Db_Table_Select. V Kernel.php zadaetsa soedinenie s BD, zadaetsa adapter ispol'zuemiy po umol4aniu, i ob&ekt soedinenia zanositsa v reestr.

// Podklu4enie k BD, tak kak Zend_Db "ponimaet" Zend_Config,
// nam dostato4no peredat' special'no sformirovanniy ob&ekt konfiguracii v metod factory
$db = Zend_Db::factory($cnf->db);
// Zadanie adaptera po umol4aniu dla naslednikov klassa Zend_Db_Table_Abstract
Zend_Db_Table_Abstract::setDefaultAdapter($db);
Otme4u 4to esli vi ispol'zuete Zend_Cache vam prigoditsa metod Zend_Db_Table_Abstract::setDefaultMetadataCache, s ego pomo6'u vi mojete zake6irovat' metadannie tablic. Takim obrazom zapros describe table ne budet vipolnatsa pri kajdom sozdanii ob&ekta Zend_Db_Table.

Dalee vsa rabota s bazoy dannix u nas budet sobrana v klassax modeley.
Dla primera rassmotrim kod modeli ArticlesModel

<?php

class ArticlesModel extends Zend_Db_Table_Abstract {

// Ima tablici
protected $_name = 'articles';

/**
* Polu4it' vse stat'i ili odnu
*
* @param int $articleId Identifikator stat'i
* @return array
*/

public function getArticles($articleId = NULL) {

// Sozdaem ob&ekt Zend_Db_Select
$select = $this->getAdapter()->select()
// Tablica iz kotoroy delaetsa viborka
->from($this->_name)
// Dobavlenie tablici s pomo6'u join, ukazivaetsa pole svazi
->join('users','users.id = articles.author_id',array('name'))
// Poradok sortirovki
->order('id DESC')
// Koli4estvo vozvra6aemix zapisey
->limit(2)
;

if (!is_NULL($articleId)) {

// Uslovie na viborku
$select->where("articles.id = ?",$articleId);
// Vipolnenie zaprosa
$stmt = $this->getAdapter()->query($select);
// Polu4enie dannix
$res = $stmt->fetch();


}
else {

$stmt = $this->getAdapter()->query($select);
// Polu4enie massiva dannix
$res = $stmt->fetchAll();

}

return $res;

}

}
Klass ArticlesModel nasleduet abstraktniy klass Zend_Db_Table_Abstract. Takim obrazom, mi polu4aem vozmojnost' ispol'zovat' ego funkcional po rabote s bazoy. Zend_Db_Table realizuet pattern Table Data Gateway. Idea v tom 4to dla kajdoy tablici sozdaetsa otdel'niy klass kotoriy prednazna4en dla raboti imenno s etoy tablicey. Takim obrazom, rabota s BD delitsa na logi4eskie 4asti, s kotorimi, v slu4ae bol'6ogo ob&ema proekta, rabotat' gorazdo udobnee. Naprimer, vsa rabota so stat'ami v sayte-primere sobrana v modeli ArticlesModel, a rabota so stranicami sobrana v modeli PagesModel.

Vse 4to nam nujno, eto ukazat' nazvanie tablici s kotoroy mi rabotaem: protected $_name = 'articles';

Dla razli4nix slojnix viborok iz bazi ispol'zuetsa klass Zend_Db_Select, on predostavlaet gibkiy funkcional dla vipolnenia select zaprosov. Osobenno otme4u ob&ektno-orientirovanniy podxod "pokuso4nogo" postroenia sql-zaprosov. Naprimer:

$select = $this->getAdapter()->select()
->from('articles')
->where("articles.id = ?",$articleId)
->join('users','users.id = articles.author_id',array('name'))
->order('id DESC')
->limit(2);

"Kuski" mogut raspologat'sa v proizvol'nom poradke, eto o4en' udobno kogda u vas zaprosi stroatsa dinami4eski.

Dla za6iti ot sql-in&ekciy v select zaprosax predlagaetsa mexanizm pleysxolderov where('id = ?',$pageId);
V slu4ae je update, delete zaprosov ispol'zuu6ix uslovie where c dannimi polu4ennimi ot pol'zovatela, neobxodimo postupat' nemnogo po drugomu. Dla za6iti ot sql-in&ekciy v takix slu4aax nujno ekranirovat' spec simvoli i brat' dannie v kavi4ki samomu. A ispol'zuu sleduu6iy metod:
$id = $this->getAdapter()->quote($id);

Esli zaprosi na viborku u vas dostato4no prostie i ne trebuut dannix iz drugix tablic, vi mojete ispol'zovat' metodi fetchRow, fetchAll klassa Zend_Db_Table (obratite vnimanie 4to fetchAll i fetchRow klassa Zend_Db_Table teper' rekomenduutsa k ispol'zovaniu s Zend_Db_Table_Select), primer:

<?php
/**
* Rabota s stranicami
*/

class PagesModel extends Zend_Db_Table_Abstract {

// Ima tablici
protected $_name = 'pages';

/**
* Polu4it' odnu stranicu (al'ternativoy etomu metodu mojet bit' vstroenniy metod find)
*
* @param int $pageId Identifikator stranici
* @return array
*/

public function getPage($pageId) {

// Sozdanie ob&ekta Zend_Db_Table_Select,
// Nam ne nujno ukazivat' nazvanie tablici kak v Zend_Db_Select
$select = $this->select()
// Nakladivaem uslovie
->where('id = ?', $pageId);

// Vipolnaem zapros i polu4aem ob&ekt Zend_Db_Table_Row v rezul'tate
// Nam ne nujno predvaritel'no vipolnat' zapros metodom query, kak v Zend_Db_Select
$row = $this->fetchRow($select);
// Preobrazovivaem Zend_Db_Table_Row v massiv
$res = $row->toArray();

return $res;

}

Itogo, esli vam neobxodimi zaprosi na vstavku, udalenie, izmenenie dannix - nujno ispol'zovat' Zend_Db_Table. Esli vam neobxodimi prostie zaprosi na viborku dannix rezul'tatom kotorix est' dannie tol'ko odnoy tablici - mojno ispol'zovat' Zend_Db_Table (a mojno i Zend_Db_Select). Esli je vam nujni slojnie zaprosi s polu4eniem dannix iz drugix tablic - nujno ispol'zovat' Zend_Db_Select.

Rabota s vidom Zend_View i Zend_Layout

Dla raboti s vidom Zend Framework predlagaet dva klassa, eto Zend_View i Zend_Layout.

Pri sozdanii ob&ektov etix klassov v Kernel.php a proizvel nebol'6uu nastroyku. Izmenil ras6irenie etix faylov na privi4noe tpl, i izmenil nazvanie glavnogo layout maketa. A dal emu privi4noe nazvanie "index"

Vot tak vigladit skript vida, otve4au6iy za spisok statey.

<ul>
<?php foreach ($this->articlesList as $article): ?>
<li><a href = "/articles/<?php print $article['id']; ?>/"><?php print $article['title']; ?></a></li>
<?php endforeach; ?>
</ul>

Kak vidno php kod zdes' otdelen ot html koda, krome togo ispol'zuetsa pascal-podobniy sintaksis php dla lu46ego vizual'nogo vospriatia.

Zend_Layout realizuet pattern "dvuxetapnoe predstavlenie" (Two Step View pattern). Danniy pattern prednazna4en dla maksimal'no gibkoy raboti s maketami vida. Sozdaetsa nekiy glavniy maket dizayna sayta. Obi4no on soderjit karkas html stranici

// Doctype
<html>
<head>
// Meta tegi
// Podklu4enie css i t d
</head>
<body>
...
</body>
</html>

A vot vse 4to naxoditsa mejdu <body></body> razbivaetsa na bloki, pri4em u kajdogo bloka est' svoy malen'kiy maket. Eto mojet bit' menu, novosti, blok avtorizacii i t d. Takim obrazom, esli mi xotim izmenit' html kod menu, mi menaem vsego li6' odin maket. Vot tak vigladit kod glavnogo maketa index.tpl

<?php print $this->doctype(Zend_View_Helper_Doctype::XHTML1_TRANSITIONAL); ?>
<html>
<head>
<?php print $this->headTitle('I LOVE ZEND FRAMEWORK!'); ?>
<?php print $this->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8'); ?>
<?php print $this->headLink()->appendStylesheet($this->baseUrl.'public/design/css/style.css'); ?>
<?php print $this->headScript(); ?>
</head>
<body>
<div id="menu">
<?php print $this->partial('menu.tpl'); ?>
</div>
<div id="main">
<div id="left">
<div style = "margin:5px;">Lu46ie stat'i:</div>
<?php print $this->action('index', 'articles'); ?>
<div id = "copy">(c) San <a href = "http://zendframework.ru">http://zendframework.ru</a></div>
</div>
<div id="content"><?php print $this->layout()->content; ?></div>
</div>
</body>
</html>

Krome dvuxetapnogo predstavlenia Zend_Layout daet pomo6nikov. Eto doctype, headTitle, headMeta, headLink, headScript. Eti pomo6niki viru4aut esli naprimer na kakoy to osoboy stranice vi zaxotite podklu4it' osobiy css ili js fayl.

S pomo6'u pomo6nika partial mojno podklu4at' drugie maketi - bloki, naprimer v vi6eprivedennom kode tak podklu4aetsa menu.

Krome togo mojno vizivat' razli4nie deystvia pramo iz maketa. Imenno eto daet nam vozmojnost' razbit' ves' 6ablon sayta na bloki. Takim obrazom, a podklu4au blok "Lu46ie stat'i", i kogda a zaxo4u ubrat' ego so vsex stranic, a udalu tol'ko odnu stro4ku, a esli a zaxo4u izmenit' ego format, a otredaktiruu vsego odin view skript.

Vozmojno v ka4estve 6ablonizatora vi zaxotite ispol'zovat' Smarty ili 4to nibud' v etom rode. Integracia s Zend Framework ne vizovet bol'6ogo truda. No xo4u otmetit' 4to Zend_View i Zend_Layout uje sami po sebe otli4niy 6ablonizator, pri4em ne trebuu6iy ispol'zovania novogo specifi4eskogo azika 6ablonizatora.
Zaklu4enie
Ska4at' kod bez bibliotek Zend (16 kb)
Ska4at' kod s bibliotekami Zend (368 kb)

Dla zapuska koda neobxodimo:
  1. Ne zabit' 4to Zend Framework trebuet php 5.1.4 ili vi6e
  2. Ustanovit' ras6irenie PDO s podderjkoy drayvera mysql (esli ono ne ustanovleno)
  3. Ska4at' arxiv, razarxivirovat' ego v document root virtual'nogo xosta. Sayt budet rabotat' tol'ko v document root, no ne vo vlojennoy papke.
  4. Sozdat' bazu dannix v kodirovke UTF-8
  5. Vipolnit' sql dump raspolojenniy v korne arxiva
  6. Otredaktirovat' konfiguracionniy fayl applications/settings/config.php Neobxodimo ukazat' nazvanie BD, ima pol'zovatela i parol'
Rezul'tat raboti razrabotannogo sayta primera doljen vigladet' primerno sleduu6im obrazom.

Vne6niy vid sayta na baze Zend Framework
Ris. 4. Vne6niy vid sayta-primera


P.S.
Ves' vi6eizlojenniy podxod postroenia prilojenia na baze Zend Framework est' sub&ektivnim mneniem avtora i ne pretenduet na polnuu ob&ektivnost' i optimal'nost'. Glavnoy cel'u dannoy stat'i bilo pokazat', kak mojno ispol'zovat' Zend Framework dla postroenia web prilojenia. Ne ves' kod privedenniy v stat'e prisutstvuet imenno v takom vide v arxive, v nekotorix mestax v stat'e on ne su6estvenno izmenen, dla lu46ey nagladnosti.

P.P.S.
Prino6u blagodarnost' Grisha Kostyuk aka naspeh za pomo6' v napisanii stat'i.

P.P.P.S.
Esli stat'a pokazalas' vam poleznoy, vi mojete pomo4' razvitiu russkoazi4nomu soob6estvu zend framework, postaviv ssilku na resurs http://zendframework.ru. V sleduu6iy raz a planiruu ras6irit' primer i opisat' rabotu s Zend_Auth, Zend_Acl, Zend_Session, Zend_Cache, Zend_Date a takje dobavit' rabotu s Ajax
3
Создание эксклюзивных сайтов, юзибилити анализ и бесплатный анализ под запросы основных поисковых машин
Контактная информация :
тел. +7(98I) 7608865

Написать письмо на e-mail
icq 415547094  romverрейтинг на mail.ru сайта romverinbox.ru
© 1997 - 2024 romver.ru

Полная карта сайта Display Pagerank