FuelPHP обеспечивает расширенное программирование форм с помощью классов Fieldset и Fieldset_Field. Fieldset предоставляет объектно-ориентированный способ создания формы. Имеет полную поддержку моделей. Он имеет встроенную поддержку для проверки на стороне клиента и на стороне сервера. Чтобы создать полноценную форму, достаточно создать модель с правильной формой и настройкой валидации. Давайте узнаем о классе Fieldset и о том, как создать форму, используя его в этой главе.
Fieldset
Fieldset — это коллекция объектов Fieldset_Field . Fieldset_Field определяет отдельную запись формы, такую как имя, фамилия и т. Д., А также проверки. В классе Fieldset есть методы для добавления / редактирования / удаления полей. У него есть опции для идентификации полей, определенных в модели, и создания полей из данной модели. Fieldset использует классы Form и Validation в фоновом режиме для выполнения реальной работы. Давайте рассмотрим некоторые важные методы класса Fieldset.
ковать
forge создает новый экземпляр Fieldset. Он имеет следующие два параметра —
-
$ name — идентификатор для набора полей
-
$ config — конфигурационный массив. Возможные варианты: validation_instance и form_instance. validation_instance может иметь объект Validation, а form_instance может иметь объект Form.
$ name — идентификатор для набора полей
$ config — конфигурационный массив. Возможные варианты: validation_instance и form_instance. validation_instance может иметь объект Validation, а form_instance может иметь объект Form.
$employee_form = Fieldset::forge('employee');
пример
instance возвращает ранее созданный экземпляр Fieldset по идентификатору.
$employee_form = Fieldset::instance('employee');
get_name
Получает идентификатор экземпляра fieldset.
$employee_form = Fieldset::forge('employee'); $name = $employee_form->get_name();
добавлять
add создает новый экземпляр Fieldset_Field и добавляет его в текущий набор полей. Он содержит следующие четыре параметра,
-
$ name — название поля
-
$ label — метка для поля
-
$ attribute — атрибуты HTML-тегов
-
$ rules — правила проверки
$ name — название поля
$ label — метка для поля
$ attribute — атрибуты HTML-тегов
$ rules — правила проверки
$employee_field = $employee_form-> add ( 'employee_lastname', 'Lastname', array ('class' => 'pretty_input') ); // with validation rules $employee_form->add ( 'email', 'E-mail', array('type' => 'email', 'class' => 'pretty_input'), array('required', 'valid_email') );
add_before
add_before аналогичен add, за исключением того, что он имеет один дополнительный параметр для указания поля, перед которым будет добавлено вновь созданное поле.
$employee_form->add_before ( 'employee_firstname', 'Firstname', array ('class' => 'pretty_input'), array(), 'employee_lastname' );
удалять
Удалить удаляет указанное поле из набора полей.
$employee_form->delete('employee_firstname');
поле
Поле получает либо все поля, либо указанное из набора полей.
$fields = $employee_form->field(); $lastname_field = $employee_form->field('employee_lastname');
строить
build это псевдоним для $ this-> form () -> build () . Создает HTML-разметку формы.
$employee_form->build(Uri::create('employee/add'));
включить
enable — повторно включает поле, которое было ранее отключено.
$employee_form->enable('employee_firstname');
запрещать
disable позволяет отключить построение поля в наборе полей.
$employee_form->disable('employee_firstname');
форма
form возвращает экземпляр Form текущего набора полей.
$form = employee_form->form();
add_model
add_model добавляет поле модели в набор полей. Он имеет следующие три параметра,
-
$ class — имя класса
-
$ instance — экземпляр класса для заполнения полей значением
-
$ method — имя метода в классе. Этот метод используется для добавления полей в fieldset. Orm \ Model имеет требуемый метод. Имя метода по умолчанию — set_form_fields.
$ class — имя класса
$ instance — экземпляр класса для заполнения полей значением
$ method — имя метода в классе. Этот метод используется для добавления полей в fieldset. Orm \ Model имеет требуемый метод. Имя метода по умолчанию — set_form_fields.
$employee_form = Fieldset::forge('employee'); $employee_form->add_model('Model_Employee');
населять
Заполняет устанавливает начальное значение полей в fieldset, используя экземпляр модели.
$emp = new Model_Employee(); $emp->name = "Jon"; $employee_form->populate($emp);
населить
repopulate — то же самое, что и заполнить, за исключением того, что он повторно заполняет поля в наборе полей.
Проверка
validation получает экземпляр проверки текущего набора полей.
$validation = $employee_form->validation();
подтверждено
Псевдоним для $ this-> validation () -> validated ().
вход
Псевдоним для $ this-> validation () -> input ().
ошибка
Псевдоним для $ this-> validation () -> error ().
show_errors
Псевдоним для $ this-> validation () -> show_errors ().
Рабочий пример
Давайте создадим расширенную форму для добавления нового сотрудника в нашем примере приложения для сотрудников с помощью класса Fieldset.
Обновить модель
Обновите модель сотрудника с необходимыми правилами проверки и добавьте наблюдателя проверки следующим образом.
<?php class Model_Employee extends Orm\Model { protected static $_connection = 'production'; protected static $_table_name = 'employee'; protected static $_primary_key = array('id'); protected static $_properties = array ( 'id', 'name' => array ( 'data_type' => 'varchar', 'label' => 'Employee Name', 'validation' => array ( 'required', 'min_length' => array(3), 'max_length' => array(80) ), 'form' => array ( 'type' => 'text' ), ), 'age' => array ( 'data_type' => 'int', 'label' => 'Employee Age', 'validation' => array ( 'required', ), 'form' => array ('type' => 'text' ), ), ); // Just add the Observer, and define the required event protected static $_observers = array('Orm\\Observer_Validation' => array ( 'events' => array('before_save'))); }
Здесь мы определили правила проверки для полей имени и возраста и добавили нового наблюдателя для выполнения проверки на стороне сервера перед сохранением модели в базе данных. Это же правило проверки создаст необходимые входные атрибуты проверки также в форме.
Создать форму
Создайте новое действие action_advancedform в контроллере сотрудника следующим образом.
public function action_advancedform() { // create a new fieldset and add employee model $fieldset = Fieldset::forge('employee')->add_model('Model_Employee'); // get form from fieldset $form = $fieldset->form(); // add submit button to the form $form->add('Submit', '', array('type' => 'submit', 'value' => 'Submit')); // build the form and set the current page as action $formHtml = $fieldset->build(Uri::create('employee/advancedform')); // set form in data $data = array(); $data['form'] = $formHtml; return Response::forge(View::forge('employee/advancedform', $data, false)); }
Здесь мы создали форму с использованием fieldset и отправили форму в представление. Затем добавьте представление для действия fuel / app / views / employee / advancedform.php следующим образом.
<!DOCTYPE html> <html lang = "en"> <head> <title>Employee :: add page</title> <meta charset = "utf-8"> <meta name = "viewport" content = "width = device-width, initial-scale = 1"> <?php echo Asset::css('bootstrap.css'); ?> <style> table { width: 90%; } table tr { width: 90% } table tr td { width: 50% } input[type = text], select { width: 100%; padding: 12px 20px; margin: 8px 0; display: inline-block; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } input[type = submit] { width: 100%; background-color: #3c3c3c; color: white; padding: 14px 20px; margin: 8px 0; border: none; border-radius: 4px; cursor: pointer; } div { border-radius: 5px; background-color: #f2f2f2; padding: 20px; } </style> </head> <body> <div class = "container"> <?php if(isset($errors)) { echo $errors; } echo $form; ?> </div> </body> </html>
Теперь при запросе страницы http: // localhost: 8080 / employee / add отобразится следующая форма.
Форма процесса
Обновите метод действия action_advancedform, чтобы обработать форму и добавить данные сотрудника, введенные пользователем, в базу данных в контроллере сотрудника следующим образом.
public function action_advancedform() { // create a new fieldset and add employee model $fieldset = Fieldset::forge('employee')->add_model('Model_Employee'); // get form from fieldset $form = $fieldset->form(); // add submit button to the form $form->add('Submit', '', array('type' => 'submit', 'value' => 'Submit')); // build the form and set the current page as action $formHtml = $fieldset->build(Uri::create('employee/advancedform')); if (Input::param() != array()) { try { $article = Model_Employee::forge(); $article->name = Input::param('name'); $article->url = Input::param('age'); $article->save(); Response::redirect('employee/list'); } catch (Orm\ValidationFailed $e) { $view = View::forge('employee/advancedform'); $view->set('form', $formHtml, false); $view->set('errors', $e->getMessage(), false); } } return Response::forge($view); }
Здесь мы были перенаправлены на страницу со списком сотрудников, когда введенные пользователем данные проверены и сохранены в базе данных. В противном случае нам снова будет показана форма.
Создать форму
Теперь запросите URL, http: // localhost: 8080 / employee / add, введите некоторые данные о сотрудниках и отправьте форму. Если данные не предоставлены, то форма предложит пользователю ввести данные, как показано на следующем снимке экрана.
Если пользователь обходит проверку на стороне клиента, сервер проверяет форму и показывает ошибку, как показано на следующем снимке экрана.
Если данные прошли проверку на стороне клиента и на сервере, то данные сотрудника будут сохранены в базе данных, и страница будет перенаправлена на страницу списка.