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

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
2476

Загрузка...
Loading...

Комментарии

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

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

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

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

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

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

Инструкция для аллергиков. Как бороться с аллергией в период обострения

Инструкция для аллергиков. Как бороться с аллергией в период обострения

Я аллергик с детства. Имею аллергию на пыльцу березы, липы, полыни (выяснил это благодаря кожным пробам), а также пищевую аллергию на горчицу. Свои проблемы знаю, однако это меня не спасло.
Romeo_17
вчера / 17:21
  • 38014
  • 62
Алматы предложили сделать центром секс-туризма

Алматы предложили сделать центром секс-туризма

Известный политолог России Андрей Карпов предложил сделать Алматы центром секс-туризма. Но для этого сперва нужно легализовать проституцию в стране.
tala03
13 авг. 2017 / 14:48
Балконы Алматы. Интересные экземпляры встречаются только на старых домах

Балконы Алматы. Интересные экземпляры встречаются только на старых домах

Ещё один отчёт, который очень хотел сделать. Посмотрим на старые алматинские балконы. Хоть у нас и нет шедевров, но кое-что можно снять и выставить.
Ispanec
10 авг. 2017 / 0:04
  • 2847
  • 9
Американцы хотят напасть на КНДР, но не знают, где находится эта страна

Американцы хотят напасть на КНДР, но не знают, где находится эта страна

В США 75% жителей считают, что КНДР является "критической угрозой" для их страны. Авторы популярного американского шоу Джимми Кимела решили проверить жителей США, знают ли те, где находится КНДР.
tala03
10 авг. 2017 / 16:48
  • 2642
  • 62
Ограбление года: 3 млн долларов и 50 тысяч евро украли у казахстанского экс-министра

Ограбление года: 3 млн долларов и 50 тысяч евро украли у казахстанского экс-министра

КТК: "У жителя Алматы украли… 3 миллиона долларов! В деле, которое расследует сейчас местная полиция, удивляет всё – и внушительная сумма, и фамилия пострадавшего..."
SamJamKZ
10 авг. 2017 / 11:43
  • 2387
  • 42
Учителям, владеющим английским языком, повысят зарплату на 200%

Учителям, владеющим английским языком, повысят зарплату на 200%

В Казахстане началось поэтапное внедрение трехъязычного образования. По данным МОН РК, с 2017 учебного года начнется внедрение трехъязычия в 5-х классах.
tala03
10 авг. 2017 / 15:20
  • 1963
  • 31
Приложение казахстанских школьниц признали лучшим на конкурсе в Сан-Франциско

Приложение казахстанских школьниц признали лучшим на конкурсе в Сан-Франциско

Команда алматинских школьниц выиграла главный приз международного конкурса Technovation Challenge 2017 по разработке мобильных приложений.
yviNews
11 авг. 2017 / 16:38
  • 2238
  • 5
Недоразумение с грантами в ВУЗы: «медалисты» до сих пор имеют преимущество

Недоразумение с грантами в ВУЗы: «медалисты» до сих пор имеют преимущество

Многие способные выпускники без Алтын Белги готовились к тестированию, чтобы в честной борьбе попытать счастья на гранты без ущемления со стороны якобы "золотых" выпускников.
DanaJarlygapova
14 авг. 2017 / 14:35
Кандидат в президенты Польши просит место жительства в Казахстане

Кандидат в президенты Польши просит место жительства в Казахстане

Балли Мажец, ранее Балжан Наурызбаева, уроженка Южно-Казахстанской области уже 30 лет проживает в Польше. Является гражданской активисткой и председателем ассоциации Wspolnota Kazachska.
tala03
10 авг. 2017 / 0:25
  • 1412
  • 11