Продолжаем изучать Zend Framework на примере разработки блога. Сегодня мы займемся комментариями, а именно их добавлением.
Давайте как всегда начнем с модели. Нам нужен метод для вставки данных в БД. Напишем его:
<?php class Application_Model_DbTable_Comments extends Zend_Db_Table_Abstract { // Тут всякая фигня из предыдущих шагов /** * Add comment * * @param int $postId ID of post * @param string $name Name of commenter * @param string $email Email of commenter * @param string $url URL of commenter * @param string $comment Comment * @return bool */ public function add($postId, $name, $email, $url, $comment) { 'post_id' => $postId, 'name' => $name, 'email' => $email, 'url' => $url, 'blog_comment' => $comment, ); $this->insert($data); } }
Метод add() принимает данные комментатора и вставляет их в БД. Теперь нам нужно вывести саму форму и затем ее обработать. За формы отвечает компонент Zend_Form. Давайте сгенерируем при помощи Zend_Tool нашу форму:
zf create form Comment
Эта команда создаст каталог application/forms и файл Comment.php в нем. Приведу как всегда готовый код и после поясню:
<?php class Application_Form_Comment extends Zend_Form { public function init() { // Создаем элемент скрытый элемент формы () $postId = new Zend_Form_Element_Hidden('postId'); // Устанавливаем фильтр integer $postId->addFilter('Int'); // Создаем новое текстовое поле для имени $name = new Zend_Form_Element_Text('name'); $name->setLabel('Имя') // label для текстового поля ->setRequired(true) // Поле обязательное ->addFilter('StripTags') // Удаляем HTML-теги ->addFilter('StringTrim') // Удаляем лишние пробелы ->addValidator('NotEmpty'); // Поле не должно быть пустым // Мыло $email = new Zend_Form_Element_Text('email'); $email->setLabel('Мыло') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); // URL $url = new Zend_Form_Element_Text('url'); $url->setLabel('URL') ->setRequired(false) ->addFilter('StripTags') ->addFilter('StringTrim'); // Коммент $comment = new Zend_Form_Element_Textarea('blogComment'); $comment->setLabel('Коммент') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); // Кнопка сабмита $submit = new Zend_Form_Element_Submit('submit'); $submit->setLabel('Откомментить'); // Добавдение всех элементов в форму } }
Как видите наш класс наследуется от Zend_Form. Метод init() уже был сгенерирован, код нашей формы мы пишем внутри него. Здесь мы создаем элементы формы. Первый элемент - скрытое поле, где будет храниться идентификатор поста. Ему мы добавляем фильтр, который гарантирует, что значение будет типа integer. Далее текстовое поле для имени комментатора. Его мы делаем обязательным, экранируем теги и удаляем лишние пробелы. Также добавляем фильтр NotEmpty, т.е. поле не должно быть пустым. Для поля e-mail'а устанавливаем проверку почтового адреса с помощью регулярного выражения. Второй параметр true обозначает, что если проверка не пройдена, дальше ничего не проверять. Поле URL делаем не обязательным. Затем инициализируем кнопку сабмита и наконец добавляем все созданные элементы в форму.
Теперь обработаем форму. Делать это мы будем в методе postAction() нашего контроллера indexController.
<?php class IndexController extends Zend_Controller_Action { // Всякие полезные методы /** * View post * * @return void */ public function postAction() { // Берем ID'шник из параметра if ($id > 0) { // Создаем экземпляр модели постов и выбираем посты по ID $post = new Application_Model_DbTable_Posts(); $this->view->post = $post->getById($id); // Устанавливаем заголовок для поста в тег title $this->view->postTitle = $this->view->post['title']; $this->view->headTitle($this->view->postTitle); // Получаем комменты к посту $comments = new Application_Model_DbTable_Comments(); $this->view->comments = $comments->getByPostId($id); // Форма $form = new Application_Form_Comment(); // Устанавливаем value для скрытого элемента postId $form->postId->setValue($id); // Передаем форму во вьюшку $this->view->form = $form; // Если произведен запрос методом POST, т.е. форма отправлена if ($this->getRequest()->isPost()) { // Получаем данные и проверяем на валидность $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { // Берем значения из формы $name = $form->getValue('name'); $email = $form->getValue('email'); $url = $form->getValue('url'); $comment = $form->getValue('blogComment'); // Вставляем в БД $comments->add($postId, $name, $email, $url, $comment); // Редирект } else { // Если валидация не пройдена, заполняем форму введенными данными $form->populate($formData); } } } } }
здесь мы создаем экземпляр класса Application_Form_Comment(), устанавливаем значение для скрытого элемента postId и передаем форму во вью. Затем проверяем была ли отправлена форма. Если да, то получаем данные и проверяем на валидность. Если все ОК - вставляем данные в БД и редиректим юзверя. А если нет, то возвращаемся назад и вставляем введенные данные снова в форму.
И наконец выведем форму. Для этого в файл application/views/scripts/index/post.phtml после блока комментариев добавляем:
<section id="comment_form"> <header> <h3>Оставить коммент:</h3> </header> <?php echo $this->form ?> </section> <!-- comment_form -->
На этом сегодняшний урок подошел к концу. Сделано не мало, но впереди еще много всего. В следующий раз наверное немного украсим нашу форму с помощью декораторов и может быть напишем свой хелпер. Исходники лежат здесь. Пока :).
Оригинал Zend Framework: создаем блог. Шаг 3