Zend FrameworkСтарт вместе с ZendFramework

В статье описывается создания менеджера задач на ZendFramework.
Во-первых, скачиваем фреймворк отсюда.
Если вам, как и мне, не нужны dojo и примеры(или жалко трафик) скачиваем minimal-версию.
Разархивируйте в любую удобную для вас папку. Открываем консоль и пишем(команды для linux и win аналогичны):
zf create project todo

Копируем папку library из архива в корень проекта todo.
Далее все будем делать вручную, но некторые шаги можно было бы выполнить через консоль.
Сразу же настроим zf в файле todo\application\configs\application.ini

#устанавливаем папку для layout'ов - каркаса наших видов
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
#активируем использование видов
resources.view[] = 
#настраиваем подключение к базе
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = "pass"
resources.db.params.dbname = "todo"
resources.db.isDefaultTableAdapter = true

Создаем файл layouts\scripts\layout.phtml с примерно таким содержимым:
<?php 
// application/layouts/scripts/layout.phtml
echo $this->doctype() ?>
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head>  
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  <title>Zend Framework ToDo Application</title>
  <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
</head> 
<body>
<div id="header" style="background-color: #EEEEEE; height: 30px;">
    <div id="header-logo" style="float: left">
        <b>ZF Quickstart Application</b>
    </div>
    <div id="header-navigation" style="float: right">
        <a href="<?php echo $this->url(
            array('controller'=>'tasks'), 
            'default', 
            true) ?>">ToDo</a>
    </div>
</div>
<?php echo $this->layout()->messages; ?>
<?php echo $this->layout()->content; ?>
</body>
</html>

Вот структура нашей БД:
users:
	id: int a-i
	username: varchar 255
	password: varchar 255
	jid: varchar 255
tasks:
	id: int a-i
	task: varchar 255

Базу создаем ручками, например, через phpMyAdmin.
Для того чтобы наши формы и модели подгружались автоматически в public\index.php прописываем
\\...
\\эти 4 строки заменяем
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
	'../application/models',    get_include_path(),
)));
\\а эти добавляем
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);
/** Zend_Application */
\\...

Начнем из далека, с контроллера Users.
Создадим файл application\controllers\UsersController.php, где Users — имя контроллера с большой буквы.
<?php
//наследуемся от Zend_Controller_Action
//т.е. класс находится в файле library/Zend/Controller/Action.php
class UsersController extends Zend_Controller_Action
{
	//все что находится в этой ф-ии будет выполнено при использовании контроллера
	public function init()
	{
	//подключаем помошник для перенаправления
	$this->_redirector = $this->_helper->getHelper('Redirector');
	//подключаем Zend_Auth для работы с пользователями
	$this->auth = Zend_Auth::getInstance();
	}
	//создаем action для регистрации
	public function registerAction()
	{
		//создаем форму
		$form = new Form_Register();
		//если это Post запрос, то продолжаем
		if ($this->_request->isPost ()) {
		//проверяем правильность введенных значений из запроса
			if ($form->isValid ( $this->_getAllParams () )) {
					//создаем обьект класса Model_Users
					$table = new Model_Users ( );
					//засовываем все значения в массив...
					$data = array ('username' => $form->getValue ( 'name' ), 'password' => md5 ( $form->getValue ( 'password' ) ), 'jid' => $form->getValue ( 'jit' ) );
					//...и вставляем в таблицу
					$table->insert ( $data );
					//перенаправляем на главную, где index - действие,а tasks - контроллер
					$this->_redirector->gotoSimple ( 'index', 'tasks' );
					}
			}
		//передаем контроллер в view
		$this->view->form = $form;
	}
	//action для входа
	public function loginAction()
	{
		$form = new Form_Login ();
		if ($this->_request->isPost ()) {
			if ($form->isValid ( $this->_getAllParams () )) {
				$table = new Model_Users ( );
				$data = array ('username' => $form->getValue ( 'name' ), 'password' => md5 ( $form->getValue ( 'password' ) ) );				
				$authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
				$authAdapter->setTableName('users');
				$authAdapter->setIdentityColumn('username');
				$authAdapter->setCredentialColumn('password');
				$authAdapter->setIdentity($form->getValue('name'));
				$authAdapter->setCredential(hash('md5', $form->getValue('password')));	
				$result = $this->auth->authenticate ( $authAdapter );
				if (!$result->isValid()) { // Invalid credentials
					$form->setDescription('Invalid credentials provided');
					$this->view->form = $form;
				    $this->render('users'); // re-render the login form
				}
				$currentUser = $authAdapter->getResultRowObject ();
				$this->auth->getStorage()->write ( $currentUser ); //записали юзера в auth, теперь он везде доступен - только для чтения  
				$this->_redirector->gotoSimple ( 'index', 'tasks' );					
				}
			}
		$this->view->form = $form;
	}
	//action для выхода пользователя
	public function logoutAction()
    {
        $this->auth->clearIdentity();
        $this->_redirector->gotoSimple ( 'index', 'tasks' );
    }
}
//закрывающий тег в конце ставить _не_ надо

Теперь нам надо создать модель для пользователей. Создаем файл application\models\Model\Users.php
<?php
//наследуемся
class Model_Users extends Zend_Db_Table
{
	//$_name это название нашей таблицы
	protected $_name = 'users';
}

Осталось создать формы. Если разобраться формы регистрации и логина почти одинаковы и для того чтобы несколь раз не печатать одно и тоже, выделим общую часть в отдельный класс.
<?php
//application\models\Form\Auth.php
class Form_Auth extends Zend_Form
{
	public function init()
	{
		parent::init();
	
		$this->setMethod('post');		
		$name = new Zend_Form_Element_Text('name',array(
			'required'=> true,
			'label' => 'Имя:',
			'maxlength' => '30',
			'validators'=>array(
		array('Alnum',true,array(true)),
		array('StringLength',true,array(0,30))
		),
			'filters'=>array('StringTrim'),		
		));
		$this->addElement($name);
		$name->setName('name');
		$password = new Zend_Form_Element_Password('password',array(
			'required'=>true,
			'label'=>'Пароль:',
			'maxlength'=>'30',
		));
		$this->addElement($password);
	}
}

Теперь создадим сами формы логина и регистрации
<?php
class Form_Register extends Form_Auth
{
	public function init()
	{
		parent::init();
		$this->setAction('register');
		$about = new Zend_Form_Element_Text('about',array(
			'required'=>true,
			'label'=>'Jabber:',
			'rows'=>'5',
			'cols'=>'45',
			'validators'=>array(
				array('StringLength',true,array(0,100))),
			'filters'=>array('StringTrim'),
		));
		$this->addElement($about);
		$submit = new Zend_Form_Element_Submit('submit',array(
			'label'=>'Зарегистрироваться',
		));
		$submit->setDecorators(array('ViewHelper'));
		$this->addElement($submit);
	}
}

<?php
class Form_Login extends Form_Auth
{
	public function init()
	{
		parent::init();
		$this->setAction('login');
		$submit = new Zend_Form_Element_Submit('submit',array(
			'label'=>'Войти',
		));
		$submit->setDecorators(array('ViewHelper'));
		$this->addElement($submit);
	}
}

Ну и создадим виды views\scripts\users\register.php и login.php с одинаковым содержимым:

<?=$this->form?>

А теперь самое главное — написание самого менеджера задач будет в следующей статье ;)
PS Если кому показалось данная статья интересной, просьба опубликовать статьюссылку на хабре
  • +13
  • nuclear
  • 11 июля 2009, 19:44

Комментарии (16)

Никто не отписывается — это значит что это некому не нужно и можно не продолжать?
нет, продолжайте пожалуйста, есть не большая просьба — в следующей статье освятите также вопрос реализации MVC (в том числе Zend_Routes) средствами Zend Framework'а
Про MVC не понял, мы же использовали и Model, и View, и Controller.
А Zend_Routes был запланирован =)
Спасибо за статью. Статьи по Zend Framework полезны :)
Никто не отписывается потому что выходные )) А цикл статей я бы очень поддерживал — а то я с PHP уже много лет, а до зенда никак добраться не могу.
Аналогичная проблема. К Зенду мне сложно подойти. А вот MVC хорошо понял с помощью CodeIgniter (http://code-igniter.ru) с русской, супер написанной документацией :)
Мне кажется, что легче будет изучать Zend Framework если понять, желательно, на примерах MVC (Model-View-Controller).
спасибо за статью, для новичков вроде меня в самый раз!
Спасибо за комментарии, я в первый раз пишу подобную статью, так что отзывы очень важны =)
Ждем продолжения.
Спасибо за статью!
Исправь отступы в исходниках, и если это перевод — поставь ссылку.
отступы есть, их не видно в теге «code»
это не перевод, это моя статья
А pre тут добавлять нельзя?
спс, как оказалось можно. сейчас все исправлю
  • avatar
  • waone
  • 11 февраля 2011, 18:42
  • #
  • 0
Сразу когда читаю про зенд фреймворк, закрываю статьи, где описывается эта тупая кли nулза zf, лучше бы про зенд студио написали, как работать там.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.