Учебники

FuelPHP — Расширенное программирование форм

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, введите некоторые данные о сотрудниках и отправьте форму. Если данные не предоставлены, то форма предложит пользователю ввести данные, как показано на следующем снимке экрана.

Данные отсутствуют

Если пользователь обходит проверку на стороне клиента, сервер проверяет форму и показывает ошибку, как показано на следующем снимке экрана.

Счастье клиента

Если данные прошли проверку на стороне клиента и на сервере, то данные сотрудника будут сохранены в базе данных, и страница будет перенаправлена ​​на страницу списка.