A free and open-source book on ZF3 for beginners


7.5. Извлечение данных формы в действии контроллера

Пользователь сайта обычно работает с формой в следующем порядке:

Как правило, эти две веб-страницы обрабатываются одним и тем же действием контроллера.

В примере ниже мы покажем, как создать действие контроллера для отображения формы обратной связи (feedback form) и извлечения данных, отправленных пользователем. Для начала добавьте шаблон представления contact-us.phtml в каталог application/index/ под каталогом модуля view/ (см. рисунок 7.6).

Рисунок 7.6. Создание файла contact-us.phtml Рисунок 7.6. Создание файла contact-us.phtml

Поместите код HTML-разметки формы обратной связи из предыдущего раздела в файл шаблона представления.

Затем добавьте метод действия contactUsAction() в класс IndexController. В этом методе мы хотим извлечь необработанные данные из формы обратной связи, отправленной пользователем.

<?php
namespace Application\Controller;

// ...

class IndexController extends AbstractActionController 
{
    // Это действие отображает форму обратной связи
    public function contactUsAction() 
    {
        // Проверяем, отправил ли пользователь форму
        if($this->getRequest()->isPost()) {
      
	        // Извлекаем данные формы из переменных POST
	        $data = $this->params()->fromPost();     
	  
	        // ... Какие-то действия с данными ...
	        var_dump($data);	  
        } 
        
        // Передаем переменную формы представлению
        return new ViewModel([
            'form' => $form
        ]);
    }
}

В этом фрагменте мы определяем метод действия contactUsAction() в классе IndexController (строка 9).

Затем в строке 12 мы проверяем, является ли запрос POST-запросом (проверяем первую строку HTTP-запроса). Как правило, формы используют метод POST для отправки данных формы. Поэтому мы можем выявить, отправлена форма или нет, проверив первую строку HTTP-запроса.

<?php
return [
    // ...
    'router' => [
       'routes' => [
            // Add the following routing rule for the "Contact Us" page 
            'contactus' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/contactus',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'contactUs',
                    ],
                ],
            ],
        ],
    ],  
    // ...
];

Теперь, набрав URL "http://localhost/contactus" в адресной строке браузера, вы должны будете увидеть страницу как на рисунке 7.7.

Рисунок 7.7. Форма обратной связи Рисунок 7.7. Форма обратной связи

Введите e-mail, тему и основной текст и нажмите кнопку отправки формы. Данные будут отправлены серверу, а затем извлечены методом IndexController::contactUsAction().

Ниже показан пример массива $data (выведенный на веб-страницу с помощью функции PHP var_dump()). Как видите, массив содержит ключ для каждого поля формы, включая поле "submit".

array (size=4)
    'email' => string 'name@example.com' (length=16)
    'subject' => string 'С Новым Годом!' (length=15)
    'body' => string 'Уважаемая служба поддержки, я хотел бы поблагодарить вас 
              за превосходное качество ваших услуг и поздравить вас 
              с Новым Годом!' (length=118)
    'submit' => string 'Submit' (length=6)

Top