Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Формы

Форма в Laminas — объект. В его классе перечислены поля, а шаблон выводит их готовыми помощниками. Контроллер передаёт форме присланные данные и забирает их обратно уже разобранными. За это отвечает пакет laminas-form; классы форм лежат в module/<Модуль>/src/Form.

Установка

composer require laminas/laminas-form

Установщик предложит вписать в config/modules.config.php модуль Laminas\Form и несколько связанных с ним — согласитесь на все.

Класс формы

Создайте файл вручную:

// module/Blog/src/Form/PostForm.php
namespace Blog\Form;
 
use Laminas\Form\Element;
use Laminas\Form\Form;
 
class PostForm extends Form
{
    public function __construct()
    {
        parent::__construct('post');
 
        $this->add([
            'name' => 'title',
            'type' => Element\Text::class,
            'options' => ['label' => 'Заголовок'],
        ]);
 
        $this->add([
            'name' => 'body',
            'type' => Element\Textarea::class,
            'options' => ['label' => 'Текст'],
        ]);
 
        $this->add([
            'name' => 'submit',
            'type' => Element\Submit::class,
            'attributes' => ['value' => 'Сохранить'],
        ]);
    }
}

Каждый вызов add() добавляет одно поле: name — имя поля, type — класс элемента, options.label — подпись, attributes — атрибуты HTML.

ЭлементЧто выводит
Element\TextОднострочное поле
Element\TextareaМногострочное поле
Element\Email, Element\PasswordПоля почты и пароля
Element\SelectВыпадающий список
Element\CheckboxФлажок
Element\SubmitКнопку отправки

Показ формы

Действие создаёт форму и передаёт её в шаблон:

// module/Blog/src/Controller/PostController.php
use Blog\Form\PostForm;
 
public function addAction()
{
    $form = new PostForm();
 
    return new ViewModel(['form' => $form]);
}

Шаблон выводит форму по частям:

<!-- module/Blog/view/blog/post/add.phtml -->
<h1>Новая статья</h1>
 
<?php $form = $this->form; ?>
<?php $form->prepare(); ?>
 
<?= $this->form()->openTag($form) ?>
    <?= $this->formRow($form->get('title')) ?>
    <?= $this->formRow($form->get('body')) ?>
    <?= $this->formSubmit($form->get('submit')) ?>
<?= $this->form()->closeTag() ?>

openTag() выводит открывающий тег form с методом POST, formRow() — подпись, поле и ошибки к нему. Откройте /blog/add — на странице два поля и кнопка.

Обработка

Дополните действие: при отправке форма получает данные, проверяет их и отдаёт обратно.

use Blog\Model\Post;
 
public function addAction()
{
    $form = new PostForm();
    $request = $this->getRequest();
 
    if ($request->isPost()) {
        $form->setData($request->getPost());
 
        if ($form->isValid()) {
            $post = new Post();
            $post->exchangeArray($form->getData());
            $this->posts->save($post);
 
            return $this->redirect()->toRoute('blog/view', ['id' => $post->id]);
        }
    }
 
    return new ViewModel(['form' => $form]);
}

Заполните форму и нажмите «Сохранить»: статья попадёт в таблицу posts, а браузер откроет её страницу. Пока правил проверки нет, isValid() принимает любые данные — правила добавит следующий урок.

Изменение статьи

В действии edit форму сначала заполняют значениями из базы:

$form->setData(['title' => $post->title, 'body' => $post->body]);

Поля появятся уже с текстом статьи. При отправке порядок тот же: setData(), isValid(), getData(), save().

Частая ошибка

Метод getData() можно вызывать только после isValid(). Если вызвать его раньше, Laminas выбросит исключение о том, что форма ещё не проверена. Порядок всегда один: setData(), затем isValid(), затем getData().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.