место в рейтинге
  • 70940
  • 224
  • 37
Нравится блог?
Подписывайтесь!

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

Канат Гайлимов KanatGailimov
Мальчик-красавчик
18 февраля 2011, 14:26
2515

Loading...

Комментарии

похоже, на этот раз без ошибок в путях:)
после того как все сделал оч удивился, потом как не увидел поля формы:)
из-за
* {
margin: 0;
padding: 0;
border: 0
}
залез в твои исходники и сравнил css-файлы. ты забыл упомянуть в посте про то, что ты добавил туда кое-что)
еще раз спасибо!
Хм, я вроде ниче в CSS не добавлял... хотя может быть добавил и забыл :)

ЗЫ. Странно, на мыло не пришло уведомление о новом комменте...
там строчка про бордер как раз новая появилась.
зы. мне тоже об ответе не сказали
а чпу будут?)
мне бы их...)
почему не используешь стандартный валидатор е-почты? Zend_Validate_EmailAddress
ты второй кто мне это говорит :). Тупо не знал :) Спасибо за замечание

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Самый большой провайдер в стране: методы работы с клиентами от «Казахтелеком»

Самый большой провайдер в стране: методы работы с клиентами от «Казахтелеком»

История о том, как Народный провайдер наваривается на своих клиентах, намерено не отключая услуги, и беря лишние деньги за ненужные и не оказываемые услуги.
ligaspravedlivosti
17 нояб. 2017 / 19:12
  • 34150
  • 195
Бесспорные доказательства – путь к упрощенному судопроизводству

Бесспорные доказательства – путь к упрощенному судопроизводству

В Казахстане введен институт упрощенного (письменного) судопроизводства, который позволяет повысить доступность правосудия и сократить сроки рассмотрения дел.
mark_iceberg
20 нояб. 2017 / 15:49
  • 15562
  • 3
Новшества на орбите уголовного правосудия

Новшества на орбите уголовного правосудия

Недавно я приняла участие в международной конференции по модернизации уголовного процесса, прошедшей в Бурабае. В чем значимость данных реформ для обычного казахстанца?
mirabeisenova
20 нояб. 2017 / 16:22
  • 12395
  • 3
Почему катастрофический отток интеллектуальной элиты не тревожит Астану?

Почему катастрофический отток интеллектуальной элиты не тревожит Астану?

Как сообщает телеканал КТК, только за последние девять месяцев Казахстан покинули 28200 человек, из них почти пять тысяч инженеров, около 2700 экономистов и 1700 учителей.
openqazaqstan
17 нояб. 2017 / 11:00
  • 12156
  • 61
О «топ-30», «топ-50» и прочих понтах можно пока забыть

О «топ-30», «топ-50» и прочих понтах можно пока забыть

В объективности выводов швейцарского банка Credit Suisse усомниться трудно – его экономические рейтинги относятся к самым авторитетным и их явно трудно упрекнуть в предвзятости
openqazaqstan
18 нояб. 2017 / 17:21
  • 7891
  • 87
Атамбаев под занавес президентства сделал всё, чтобы сжечь мосты

Атамбаев под занавес президентства сделал всё, чтобы сжечь мосты

На своей итоговой пресс-конференции в понедельник уходящий кыргызский президент говорил не об итогах своей деятельности, а о «плохом» Казахстане.
openqazaqstan
21 нояб. 2017 / 18:36
«Смех сквозь слезы», или 7 причин не любить Алматы

«Смех сквозь слезы», или 7 причин не любить Алматы

Жизнь в Алматы не всегда сладкая, как сахарная вата и мультики субботним утром. В этой ироничной статье автор блога «Almaty — My First Love» расскажет о семи причинах не любить Алматы.
AlmatyMyLove
20 нояб. 2017 / 13:12
  • 2795
  • 70
В Кызылорде нет Детского дома: мы построили 8 коттеджей для детей

В Кызылорде нет Детского дома: мы построили 8 коттеджей для детей

Тут живут будущие повара, актрисы, журналисты, боксеры, баскетболисты, певцы, поэты и многие другие талантливые дети!
socium_kzo
вчера / 14:49
  • 1781
  • 0
«Полет ради полета»: знакомство с калужской авиацией изнутри

«Полет ради полета»: знакомство с калужской авиацией изнутри

В прошлом году на мероприятии "Слет Авиатора" я выиграла подарок - экскурсию на командно-диспетчерский пункт (КДП). Но тогда я даже не ожидала, что эта экскурсия выльется в такое интересное...
Aleksandra747
20 нояб. 2017 / 9:00
  • 1573
  • 6