Zend Framework Tutorial
Złożenie wszystkiego w całość
Aby złożyć to wszystko w całość, utwórz plik Database.php w katalogu lib i wtedy metoda loadClass() będzie w stanie ją znaleść. Twój plik index.php powinien teraz utworzyć instancje klas $view oraz $db a następnie umieścić je w rejestrze. Możesz także utworzyć funkcję __autoload() aby automatycznie obsługiwać ładowanie wszystkich potrzebnych klas:
<?php
include 'Zend.php';
function __autoload($class)
{
Zend::loadClass($class);
}
$db = new Database('/path/to/db.sqlite');
Zend::register('db', $db);
$view = new Zend_View;
$view->setScriptPath('/path/to/views');
Zend::register('view', $view);
$controller = Zend_Controller_Front::getInstance()
->setControllerDirectory('/path/to/controllers')
->dispatch();
?>
Następnie utwórz proste szablony w katalogu views. Plik index.php możne być użyty do wyświetlania głównej strony:
<html>
<head>
<title>News</title>
</head>
<body>
<h1>News</h1>
<?php foreach ($this->news as $entry) { ?>
<p>
<a href="/view/<?php echo $this->escape($entry{{'id'}}); ?>">
<?php echo $this->escape($entry{{'title'}}); ?>
</a>
</p>
<?php } ?>
<h1>Add News</h1>
<form action="/add/news" method="POST">
<p>Title:<br /><input type="text" name="title" /></p>
<p>Content:<br /><textarea name="content"></textarea></p>
<p><input type="submit" value="Add News" /></p>
</form>
</body>
</html>
Szablon view.php może być używany do wyświetlania pojedynczego newsa:
<html>
<head>
<title>
<?php echo $this->escape($this->news{{'title'}}); ?>
</title>
</head>
<body>
<h1>
<?php echo $this->escape($this->news{{'title'}}); ?>
</h1>
<p>
<?php echo $this->escape($this->news{{'content'}}); ?>
</p>
<h1>Comments</h1>
<?php foreach ($this->comments as $comment) { ?>
<p>
<?php echo $this->escape($comment{{'name'}}); ?> writes:
</p>
<blockquote>
<?php echo $this->escape($comment{{'comment'}}); ?>
</blockquote>
<?php } ?>
<h1>Add a Comment</h1>
<form action="/add/comment" method="POST">
<input type="hidden" name="newsId"
value="<?php echo $this->escape($this->id); ?>" />
<p>Name:<br /><input type="text" name="name" /></p>
<p>Comment:<br /><textarea name="comment"></textarea></p>
<p><input type="submit" value="Add Comment" /></p>
</form>
</body>
</html>
I na koniec szablon admin.php:
<html>
<head>
<title>News Admin</title>
</head>
<body>
<form action="/admin/approve" method="POST">
<?php foreach ($this->news as $entry) { ?>
<p>
<input type="checkbox" name="ids{{}}"
value="<?php echo $this->escape($entry{{'id'}}); ?>" />
<?php echo $this->escape($entry{{'title'}}); ?>
<?php echo $this->escape($entry{{'content'}}); ?>
</p>
<?php } ?>
<p>
Password:<br /><input type="password" name="password" />
</p>
<p><input type="submit" value="Approve" /></p>
</form>
</body>
</html>
Aby było to proste formularz używa hasła jako mechanizmu kontroli dostępu.
Po utworzeniu plików szablonów możesz teraz uzupełnić akcje w kontrolerach kodem. Na przykład, IndexController.php może wyglądać tak:
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
/* List the news. */
$db = Zend::registry('db');
$view = Zend::registry('view');
$view->news = $db->getNews();
echo $view->render('index.php');
}
public function noRouteAction()
{
$this->_redirect('/');
}
}
?>
Dzięki temu, że wszystko jest dobrze zorganizowane, akcja odpowiadająca za stronę główną ma tylko cztery linie kodu. AddController.php jest trochę bardziej zaawansowany, więc wymaga więcej kodu:
<?php
class AddController extends Zend_Controller_Action
{
function indexAction()
{
$this->_redirect('/');
}
function commentAction()
{
/* Add a comment. */
$filterPost = new Zend_InputFilter($_POST);
$db = Zend::registry('db');
$name = $filterPost->getAlpha('name');
$comment = $filterPost->noTags('comment');
$newsId = $filterPost->getDigits('newsId');
$db->addComment($name, $comment, $newsId);
$this->_redirect("/view/$newsId");
}
function newsAction()
{
/* Add news. */
$filterPost = new Zend_InputFilter($_POST);
$db = Zend::registry('db');
$title = $filterPost->noTags('title');
$content = $filterPost->noTags('content');
$db->addNews($title, $content);
$this->_redirect('/');
}
function __call($action, $arguments)
{
$this->_redirect('/');
}
}
?>
Ponieważ użytkownik jest przekierowany po wysłaniu formularza, nie będzie wymagane utworzenie żadnych szablonów dla tego kontrolera.
W kontrolerze AdminController.php, musisz obsłużyć dwie akcje, wyświetlanie interfejsu administratora oraz akceptację newsa:
<?php
class AdminController extends Zend_Controller_Action
{
function indexAction()
{
/* Display admin interface. */
$db = Zend::registry('db');
$view = Zend::registry('view');
$view->news = $db->getNews('NEW');
echo $view->render('admin.php');
}
function approveAction()
{
/* Approve news. */
$filterPost = new Zend_InputFilter($_POST);
$db = Zend::registry('db');
if ($filterPost->getRaw('password') == 'mypass') {
$db->approveNews($filterPost->getRaw('ids'));
$this->_redirect('/');
} else {
echo 'The password is incorrect.';
}
}
function __call($action, $arguments)
{
$this->_redirect('/');
}
}
?>
ViewController.php wygląda tak:
<?php
class ViewController extends Zend_Controller_Action
{
function indexAction()
{
$this->_redirect('/');
}
function __call($id, $arguments)
{
/* Display news and comments for $id. */
$id = Zend_Filter::getDigits($id);
$db = Zend::registry('db');
$view = Zend::registry('view');
$view->news = $db->getNews($id);
$view->comments = $db->getComments($id);
$view->id = $id;
echo $view->render('view.php');
}
}
?>
Mamy teraz gotową w pełni funkcjonalną, ale bardzo prostą aplikację do dodawania newsów oraz komentarzy. Najlepsze jest to, że rozszerzenie jej funkcjonalności jest bardzo proste dzięki eleganckiemu projektowi, a wraz z rozwojem Zend Framework powinno to stawać się jeszcze lepsze.
Informacje
Chris Shiflett jest prezesem Brain Bulb, firmy konsultingowej, która zajmuje się tworzeniem aplikacji PHP oraz ich bezpieczeństwem. Możesz poczytać blog Chrisa lub odwiedzić stronę Brain Bulb. Tutorial w oryginalnej wersji jest dostępny na stronie php|architect. Przetłumaczyłem go oczywiście za zgodą autora. Jeśli ktoś ma uwagi co do tłumaczenia to proszę o podzielenie się nimi.



To miłe, że pofatygowałeś się z przetłumaczeniem tutoriala do Zend Framework. Czytanie tego rodzaju opracaowań jest bardziej przyjazne niż sucha lektura dokumentacji, a czytanie w rodzimym języku to wręcz luksus. Robisz fajną robotę ulatwiajac pierwszy kontakt z tym frameworkiem – mowie tu zarówno o powyższym tekscie, jak i o strone http://zf.naruniec.info/. Tak przy okazji czy to (http://framework.zend.com/developer/changeset/589) tlumaczenie tez jest Twojego autorstwa?