Форма для создания и редактирования записи
Как правильно реализовать добавление и редактирование записи в Nette, используя одну и ту же форму для обеих?
Во многих случаях формы для добавления и редактирования записи одинаковы, различаясь только меткой на кнопке. Мы покажем примеры простых презентеров, где мы используем форму сначала для добавления записи, затем для её`редактирования, и, наконец, объединяем эти два решения.
Добавление записи
Пример презентера, используемого для добавления записи. Мы оставим
работу с базой данных классу Facade
, код которого не имеет
отношения к данному примеру.
Редактирование записи
Теперь давайте посмотрим, как будет выглядеть презентер, используемый для редактирования записей:
В методе action, который вызывается в самом начале жизненного цикла презентера, мы проверяем существование записи и разрешение пользователя на её редактирование.
Мы храним запись в свойстве $record
, чтобы она была доступна в
методе createComponentRecordForm()
для установки значений по умолчанию и
recordFormSucceeded()
для идентификатора. Альтернативным решением может
быть установка значений по умолчанию непосредственно в actionEdit()
и значения ID, который является частью URL и извлекается с помощью
getParameter('id')
:
Однако, и это должно быть самым важным выводом из всего кода, нам
нужно убедиться, что действие действительно edit
, когда мы
создаем форму. Потому что иначе валидация в методе actionEdit()
вообще не произойдет!
Одна и та же форма для добавления и редактирования
А сейчас мы объединим оба презентера в один. Либо мы можем отличить,
какое действие задействовано в методе createComponentRecordForm()
и
настроить форму соответствующим образом, либо мы можем оставить это
непосредственно action-методам и избавиться от условия: