FuelPHP - Zaawansowane programowanie formularzy

FuelPHP zapewnia zaawansowane programowanie formularzy za pomocą klas Fieldset i Fieldset_Field. Fieldsetzapewnia obiektowy sposób tworzenia formularza. Posiada pełne wsparcie dla modeli. Posiada również wbudowaną obsługę walidacji po stronie klienta i po stronie serwera. Aby stworzyć pełnoprawny formularz, wystarczy stworzyć model z odpowiednią formą i ustawieniami walidacji. Z tego rozdziału dowiemy się o klasie Fieldset i tworzeniu formularza za jej pomocą.

Zestaw pól

Zestaw pól to zbiór Fieldset_Fieldobiekty. Fieldset_Field definiuje indywidualny wpis w formularzu, taki jak imię, nazwisko itp. Wraz z walidacjami. Klasa Fieldset zawiera metody dodawania / edycji / usuwania pól. Posiada opcje identyfikacji zmiennych zdefiniowanych w modelu i tworzenia zmiennych z danego modelu.Fieldsetużywa klas Form i Validation w tle, aby wykonać prawdziwą pracę. Zobaczmy niektóre z ważnych metod klasy Fieldset.

fałszować

forgetworzy nową instancję Fieldset. Ma następujące dwa parametry -

  • $name - identyfikator zestawu pól

  • $config- tablica konfiguracyjna. Możliwe opcje to validation_instance i form_instance. validation_instance może mieć obiekt Validation, a form_instance może mieć obiekt Form.

$employee_form = Fieldset::forge('employee');

instancja

instance zwraca poprzednio utworzoną instancję zestawu pól według identyfikatora.

$employee_form = Fieldset::instance('employee');

get_name

Pobiera identyfikator wystąpienia zestawu pól.

$employee_form = Fieldset::forge('employee'); 
$name = $employee_form->get_name();

Dodaj

addtworzy nową instancję Fieldset_Field i dodaje ją do bieżącego zestawu pól. Zawiera następujące cztery parametry,

  • $name - nazwa pola

  • $label - etykieta pola

  • $attributes - Atrybuty znaczników HTML

  • $rules - zasady walidacji

$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') 
);

Dodaj przed

add_before jest podobne do add, z wyjątkiem tego, że ma jeden dodatkowy parametr do określenia pola, przed którym zostanie dodane nowo utworzone pole.

$employee_form->add_before (
   'employee_firstname', 
   'Firstname', 
   array ('class' => 'pretty_input'), 
   array(), 
   'employee_lastname'
);

usunąć

delete usuwa określone pole z zestawu pól.

$employee_form->delete('employee_firstname');

pole

field pobiera wszystkie pola lub określony z zestawu pól.

$fields = $employee_form->field(); 
$lastname_field = $employee_form->field('employee_lastname');

budować

buildjest aliasem dla $ this-> form () -> build () . Generuje znaczniki HTML formularza.

$employee_form->build(Uri::create('employee/add'));

włączyć

enable ponownie włącza pole, które zostało wcześniej wyłączone.

$employee_form->enable('employee_firstname');

wyłączyć

disable pozwala wyłączyć budowanie pola w zestawie pól.

$employee_form->disable('employee_firstname');

Formularz

form zwraca wystąpienie Form bieżącego zestawu pól.

$form = employee_form->form();

add_model

add_model dodaje pole modelu do zestawu pól. Ma następujące trzy parametry,

  • $class - nazwa klasy

  • $instance - instancja klasy do wypełnienia pól wartością

  • $method- nazwa metody w klasie. Ta metoda służy do dodawania pól do zestawu pól. Orm \ Model ma wymaganą metodę. Domyślna nazwa metody to set_form_fields.

$employee_form = Fieldset::forge('employee'); 
$employee_form->add_model('Model_Employee');

zaludniać

populate ustawia początkową wartość pól w zestawie pól przy użyciu wystąpienia modelu.

$emp = new Model_Employee(); 
$emp->name = "Jon"; 
$employee_form->populate($emp);

zaludnij ponownie

repopulate działa tak samo jak populate, z tą różnicą, że ponownie wypełnia pola w zestawie pól.

uprawomocnienie

validation pobiera wystąpienie walidacyjne bieżącego zestawu pól.

$validation = $employee_form->validation();

zwalidowany

Alias ​​dla $ this-> validation () -> validated ().

input

Alias ​​dla $ this-> validation () -> input ().

error

Alias ​​dla $ this-> validation () -> error ().

show_errors

Alias ​​dla $ this-> validation () -> show_errors ().

Przykład roboczy

Stwórzmy zaawansowany formularz dodawania nowego pracownika w naszej przykładowej aplikacji pracowniczej przy użyciu klasy Fieldset.

Zaktualizuj model

Zaktualizuj model pracownika o niezbędne reguły walidacji i dodaj obserwatora walidacji w następujący sposób.

<?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'))); 
   }

Tutaj zdefiniowaliśmy reguły walidacji dla pól nazwiska i wieku oraz dodaliśmy nowego obserwatora do przeprowadzania walidacji po stronie serwera przed zapisaniem modelu w bazie danych. Ta sama reguła walidacji utworzy niezbędne atrybuty walidacji danych wejściowych również w formularzu.

Utwórz formularz

Utwórz nową akcję, action_advancedform w kontrolerze pracownika w następujący sposób.

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)); 
}

Tutaj utworzyliśmy formularz przy użyciu zestawu pól i wysłaliśmy formularz do widoku. Następnie dodaj widok akcji,fuel/app/views/employee/advancedform.php następująco.

<!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>

Teraz prosząc o stronę http://localhost:8080/employee/add pokaże następujący formularz.

Formularz procesu

Zaktualizuj metodę akcji, action_advancedform, aby przetworzyć formularz i dodać dane pracownika wprowadzone przez użytkownika do bazy danych w kontrolerze pracowników w następujący sposób.

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); 
}

Tutaj zostaliśmy przekierowani na stronę z listą pracowników, kiedy dane wprowadzone przez użytkownika są sprawdzane i zapisywane w bazie danych. W przeciwnym razie ponownie pojawi się formularz.

Utwórz formularz

Teraz poproś o adres URL, http://localhost:8080/employee/addwprowadź dane pracownika i wyślij formularz. Jeśli dane nie zostaną podane, formularz poprosi użytkownika o wprowadzenie danych, jak pokazano na poniższym zrzucie ekranu.

Jeśli użytkownik pominie weryfikację po stronie klienta, serwer zweryfikuje formularz i wyświetli błąd, jak pokazano na poniższym zrzucie ekranu.

Jeśli dane przeszły walidację po stronie klienta i serwera, to dane pracowników zostaną zapisane w bazie danych, a strona zostanie przekierowana na stronę listy.