В статье описывается создания менеджера задач на 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 с примерно таким содержимым:
Начнем из далека, с контроллера 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 Если кому показалось данная статья интересной, просьба опубликовать статьюссылку на хабре
нет, продолжайте пожалуйста, есть не большая просьба — в следующей статье освятите также вопрос реализации MVC (в том числе Zend_Routes) средствами Zend Framework'а
Аналогичная проблема. К Зенду мне сложно подойти. А вот MVC хорошо понял с помощью CodeIgniter (http://code-igniter.ru) с русской, супер написанной документацией :)
А Zend_Routes был запланирован =)
это не перевод, это моя статья