Yvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
0
02:26, 18 февраля 2011

Zend Framework: создаем блог. Шаг 3

Продолжаем изучать Zend Framework на примере разработки блога. Сегодня мы займемся комментариями, а именно их добавлением.

 

Давайте как всегда начнем с модели. Нам нужен метод для вставки данных в БД. Напишем его:

 

 

  1. <?php
  2.  
  3. class Application_Model_DbTable_Comments extends Zend_Db_Table_Abstract
  4. {
  5. // Тут всякая фигня из предыдущих шагов
  6.  
  7. /**
  8.   * Add comment
  9.   *
  10.   * @param int $postId ID of post
  11.   * @param string $name Name of commenter
  12.   * @param string $email Email of commenter
  13.   * @param string $url URL of commenter
  14.   * @param string $comment Comment
  15.   * @return bool
  16.   */
  17. public function add($postId, $name, $email, $url, $comment)
  18. {
  19. $postId = intval($postId);
  20. $data = array(
  21. 'post_id' => $postId,
  22. 'name' => $name,
  23. 'email' => $email,
  24. 'url' => $url,
  25. 'blog_comment' => $comment,
  26. );
  27. $this->insert($data);
  28. }
  29. }

 

Метод add() принимает данные комментатора и вставляет их в БД. Теперь нам нужно вывести саму форму и затем ее обработать. За формы отвечает компонент Zend_Form. Давайте сгенерируем при помощи Zend_Tool нашу форму:

 

  1. zf create form Comment

 

Эта команда создаст каталог application/forms и файл Comment.php в нем. Приведу как всегда готовый код и после поясню:

 

  1. <?php
  2.  
  3. class Application_Form_Comment extends Zend_Form
  4. {
  5.  
  6. public function init()
  7. {
  8. // Создаем элемент скрытый элемент формы ()
  9. $postId = new Zend_Form_Element_Hidden('postId');
  10. // Устанавливаем фильтр integer
  11. $postId->addFilter('Int');
  12.  
  13. // Создаем новое текстовое поле для имени
  14. $name = new Zend_Form_Element_Text('name');
  15. $name->setLabel('Имя') // label для текстового поля
  16. ->setRequired(true) // Поле обязательное
  17. ->addFilter('StripTags') // Удаляем HTML-теги
  18. ->addFilter('StringTrim') // Удаляем лишние пробелы
  19. ->addValidator('NotEmpty'); // Поле не должно быть пустым
  20.  
  21. // Мыло
  22. $email = new Zend_Form_Element_Text('email');
  23. $email->setLabel('Мыло')
  24. ->setRequired(true)
  25. ->addFilter('StripTags')
  26. ->addFilter('StringTrim')
  27. ->addValidator('regex', true, array('/^[a-z0-9]+@[a-z0-9]+\.[a-z0-9]{2,4}$/'))
  28. ->addValidator('NotEmpty');
  29.  
  30. // URL
  31. $url = new Zend_Form_Element_Text('url');
  32. $url->setLabel('URL')
  33. ->setRequired(false)
  34. ->addFilter('StripTags')
  35. ->addFilter('StringTrim');
  36.  
  37. // Коммент
  38. $comment = new Zend_Form_Element_Textarea('blogComment');
  39. $comment->setLabel('Коммент')
  40. ->setRequired(true)
  41. ->addFilter('StripTags')
  42. ->addFilter('StringTrim')
  43. ->addValidator('NotEmpty');
  44.  
  45. // Кнопка сабмита
  46. $submit = new Zend_Form_Element_Submit('submit');
  47. $submit->setLabel('Откомментить');
  48.  
  49. // Добавдение всех элементов в форму
  50. $this->addElements(array($postId, $name, $email, $url, $comment, $submit));
  51. }
  52.  
  53. }

 

Как видите наш класс наследуется от Zend_Form. Метод init() уже был сгенерирован, код нашей формы мы пишем внутри него. Здесь мы создаем элементы формы. Первый элемент - скрытое поле, где будет храниться идентификатор поста. Ему мы добавляем фильтр, который гарантирует, что значение будет типа integer. Далее текстовое поле для имени комментатора. Его мы делаем обязательным, экранируем теги и удаляем лишние пробелы. Также добавляем фильтр NotEmpty, т.е. поле не должно быть пустым. Для поля e-mail'а устанавливаем проверку почтового адреса с помощью регулярного выражения. Второй параметр true обозначает, что если проверка не пройдена, дальше ничего не проверять. Поле URL делаем не обязательным. Затем инициализируем кнопку сабмита и наконец добавляем все созданные элементы в форму.

Теперь обработаем форму. Делать это мы будем в методе postAction() нашего контроллера indexController.

 

 

  1. <?php
  2.  
  3. class IndexController extends Zend_Controller_Action
  4. {
  5. // Всякие полезные методы
  6.  
  7. /**
  8.   * View post
  9.   *
  10.   * @return void
  11.   */
  12. public function postAction()
  13. {
  14. // Берем ID'шник из параметра
  15. $id = intval($this->_getParam('id', 0));
  16. if ($id > 0) {
  17. // Создаем экземпляр модели постов и выбираем посты по ID
  18. $post = new Application_Model_DbTable_Posts();
  19. $this->view->post = $post->getById($id);
  20. // Устанавливаем заголовок для поста в тег title
  21. $this->view->postTitle = $this->view->post['title'];
  22. $this->view->headTitle($this->view->postTitle);
  23. // Получаем комменты к посту
  24. $comments = new Application_Model_DbTable_Comments();
  25. $this->view->comments = $comments->getByPostId($id);
  26.  
  27. // Форма
  28. $form = new Application_Form_Comment();
  29. // Устанавливаем value для скрытого элемента postId
  30. $form->postId->setValue($id);
  31. // Передаем форму во вьюшку
  32. $this->view->form = $form;
  33.  
  34. // Если произведен запрос методом POST, т.е. форма отправлена
  35. if ($this->getRequest()->isPost()) {
  36. // Получаем данные и проверяем на валидность
  37. $formData = $this->getRequest()->getPost();
  38. if ($form->isValid($formData)) {
  39. // Берем значения из формы
  40. $postId = intval($form->getValue('postId'));
  41. $name = $form->getValue('name');
  42. $email = $form->getValue('email');
  43. $url = $form->getValue('url');
  44. $comment = $form->getValue('blogComment');
  45. // Вставляем в БД
  46. $comments->add($postId, $name, $email, $url, $comment);
  47.  
  48. // Редирект
  49. $this->_helper->redirector('post', 'index', null, array('id' => $postId));
  50. } else {
  51. // Если валидация не пройдена, заполняем форму введенными данными
  52. $form->populate($formData);
  53. }
  54. }
  55. }
  56. }
  57. }

 

здесь мы создаем экземпляр класса Application_Form_Comment(), устанавливаем значение для скрытого элемента postId и передаем форму во вью. Затем проверяем была ли отправлена форма. Если да, то получаем данные и проверяем на валидность. Если все ОК - вставляем данные в БД и редиректим юзверя. А если нет, то возвращаемся назад и вставляем введенные данные снова в форму.

И наконец выведем форму. Для этого в файл application/views/scripts/index/post.phtml после блока комментариев добавляем:

 

  1. <section id="comment_form">
  2. <header>
  3. <h3>Оставить коммент:</h3>
  4. </header>
  5. <?php echo $this->form ?>
  6. </section> <!-- comment_form -->

 

На этом сегодняшний урок подошел к концу. Сделано не мало, но впереди еще много всего. В следующий раз наверное немного украсим нашу форму с помощью декораторов и может быть напишем свой хелпер. Исходники лежат здесь. Пока :).

Оригинал Zend Framework: создаем блог. Шаг 3

0
738
8