FuelPHP - Programação de formulário avançado

FuelPHP fornece uma programação avançada de formulário por meio das classes Fieldset e Fieldset_Field. Fieldsetfornece uma maneira orientada a objetos para criar um formulário. Possui suporte completo para modelos. Ele possui suporte integrado para validação do lado do cliente e do lado do servidor também. Para criar um formulário completo, é suficiente criar um modelo com formato e configuração de validação adequados. Vamos aprender sobre a classe Fieldset e como criar um formulário usando-a neste capítulo.

Fieldset

Fieldset é uma coleção de Fieldset_Fieldobjetos. Fieldset_Field define a entrada individual de um formulário, como nome, sobrenome, etc. junto com as validações. A classe Fieldset possui métodos para adicionar / editar / remover campos. Possui opções para identificar os campos definidos em um modelo e criar os campos a partir do modelo fornecido.Fieldsetusa classes Form e Validation em segundo plano para fazer o trabalho real. Vejamos alguns dos métodos importantes da classe Fieldset.

forja

forgecria uma nova instância Fieldset. Ele tem os seguintes dois parâmetros -

  • $name - identificador para o fieldset

  • $config- array de configuração. As opções possíveis são validation_instance e form_instance. validation_instance pode ter Validação objeto e form_instance pode ter objeto Form.

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

instância

instance retorna a instância Fieldset criada anteriormente por identificador.

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

get_name

Obtém o identificador da instância fieldset.

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

adicionar

addcria uma nova instância Fieldset_Field e a adiciona ao fieldset atual. Ele contém os quatro parâmetros a seguir,

  • $name - nome do campo

  • $label - etiqueta para o campo

  • $attributes - atributos de tag HTML

  • $rules - regras de validação

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

acrescentar antes

add_before é semelhante a add, exceto por ter um parâmetro extra para especificar o campo antes do qual o campo recém-criado será adicionado.

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

excluir

delete exclui o campo especificado do fieldset.

$employee_form->delete('employee_firstname');

campo

field obtém todos os campos ou o especificado do fieldset.

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

Construir

buildé um apelido para $ this-> form () -> build () . Gera a marcação HTML do formulário.

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

habilitar

enable reativa um campo que foi desativado anteriormente.

$employee_form->enable('employee_firstname');

desabilitar

disable permite desabilitar a construção de um campo no conjunto de campos.

$employee_form->disable('employee_firstname');

Formato

form retorna a instância de Form do fieldset atual.

$form = employee_form->form();

add_model

add_model adiciona o campo do modelo ao fieldset. Ele tem os três parâmetros a seguir,

  • $class - nome da classe

  • $instance - instância da classe para preencher os campos com valor

  • $method- nome do método na classe. Este método é usado para adicionar campos ao fieldset. Orm \ Model tem o método necessário. O nome do método padrão é set_form_fields.

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

povoar

populate define o valor inicial dos campos em fieldset usando instância de modelo.

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

repovoar

repopulate é o mesmo que preencher, exceto que preenche novamente os campos no conjunto de campos.

validação

validation obtém a instância de validação do fieldset atual.

$validation = $employee_form->validation();

validado

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

input

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

error

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

show_errors

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

Exemplo de Trabalho

Vamos criar um formulário avançado para adicionar novos funcionários em nosso aplicativo de amostra de funcionários usando a classe Fieldset.

Atualizar modelo

Atualize o modelo de funcionário com as regras de validação necessárias e adicione um observador de validação como segue.

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

Aqui, definimos as regras de validação para os campos de nome e idade e adicionamos um novo observador para realizar a validação do lado do servidor antes de salvar o modelo no banco de dados. A mesma regra de validação criará atributos de validação de entrada necessários também no formulário.

Criar formulário

Crie uma nova ação, action_advancedform no controlador de funcionário como segue.

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

Aqui, criamos o formulário usando fieldset e enviamos o formulário para a visualização. Em seguida, adicione uma visão para a ação,fuel/app/views/employee/advancedform.php do seguinte modo.

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

Agora, solicitando a página http://localhost:8080/employee/add irá mostrar o seguinte formulário.

Formulário de Processo

Atualize o método de ação, action_advancedform para processar o formulário e adicionar os dados do funcionário inseridos pelo usuário no banco de dados no controlador de funcionário da seguinte maneira.

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

Aqui, fomos redirecionados para a página de lista de funcionários, uma vez que os dados inseridos pelo usuário são validados e salvos no banco de dados. Caso contrário, o formulário será mostrado novamente.

Crie o formulário

Agora, solicite o URL, http://localhost:8080/employee/adde insira alguns dados do funcionário e envie o formulário. Se os dados não forem fornecidos, o formulário solicitará que o usuário insira os dados conforme mostrado na captura de tela a seguir.

Se o usuário ignorar a validação do lado do cliente, o servidor validará o formulário e mostrará um erro, conforme mostrado na captura de tela a seguir.

Se os dados foram aprovados na validação do lado do cliente e do servidor, os dados do funcionário serão salvos no banco de dados e a página será redirecionada para a página de lista.