FuelPHP-고급 양식 프로그래밍

FuelPHP는 Fieldset 및 Fieldset_Field 클래스를 통해 고급 양식 프로그래밍을 제공합니다. Fieldset양식을 만드는 객체 지향 방법을 제공합니다. 모델을 완벽하게 지원합니다. 클라이언트 측 및 서버 측 유효성 검사도 기본적으로 지원합니다. 본격적인 양식을 만들려면 적절한 양식과 유효성 검사 설정으로 모델을 만드는 것으로 충분합니다. 이 장에서 Fieldset 클래스와이를 사용하여 폼을 만드는 방법에 대해 알아 보겠습니다.

필드 셋

Fieldset은 Fieldset_Field사물. Fieldset_Field는 유효성 검사와 함께 이름, 성 등과 같은 양식의 개별 항목을 정의합니다. Fieldset 클래스에는 필드를 추가 / 편집 / 제거하는 메서드가 있습니다. 모델에 정의 된 필드를 식별하고 주어진 모델에서 필드를 생성하는 옵션이 있습니다.Fieldset실제 작업을 수행하기 위해 백그라운드에서 Form 및 Validation 클래스를 사용합니다. Fieldset 클래스의 몇 가지 중요한 메서드를 살펴 보겠습니다.

단조 공장

forge새 Fieldset 인스턴스를 만듭니다. 다음 두 가지 매개 변수가 있습니다.

  • $name − 필드 셋 식별자

  • $config− 구성 배열. 가능한 옵션은 validation_instanceform_instance입니다. validation_instanceValidation 객체를 가질 수 있고 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 인스턴스를 만들고 현재 fieldset에 추가합니다. 다음 네 가지 매개 변수가 포함됩니다.

  • $name − 필드 이름

  • $label − 필드 레이블

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

지우다

delete fieldset에서 지정된 필드를 삭제합니다.

$employee_form->delete('employee_firstname');

field 모든 필드를 가져 오거나 fieldset에서 지정된 필드를 가져옵니다.

$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 현재 fieldset의 Form 인스턴스를 반환합니다.

$form = employee_form->form();

add_model

add_model은 모델의 필드를 fieldset에 추가합니다. 다음 세 가지 매개 변수가 있습니다.

  • $class − 클래스 이름

  • $instance − 필드를 값으로 채울 클래스의 인스턴스

  • $method− 클래스의 메서드 이름. 이 메서드는 필드 세트에 필드를 추가하는 데 사용됩니다. Orm \ Model에는 필요한 방법이 있습니다. 기본 메소드 이름은 set_form_fields입니다.

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

채우다

populate 모델 인스턴스를 사용하여 fieldset에서 필드의 초기 값을 설정합니다.

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

다시 채우다

repopulate 필드 세트의 필드를 다시 채운다는 점을 제외하면 채우기와 동일합니다.

확인

validation 현재 fieldset의 유효성 검사 인스턴스를 가져옵니다.

$validation = $employee_form->validation();

검증 됨

$ this-> validation ()-> validated ()의 별칭입니다.

input

$ this-> validation ()-> input ()에 대한 별칭.

error

$ 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직원 데이터를 입력하고 양식을 제출하십시오. 데이터가 제공되지 않은 경우 양식은 다음 스크린 샷과 같이 사용자에게 데이터를 입력하라는 메시지를 표시합니다.

사용자가 클라이언트 측 유효성 검사를 우회하면 서버는 다음 스크린 샷과 같이 양식의 유효성을 검사하고 오류를 표시합니다.

데이터가 클라이언트 및 서버 측 유효성 검사를 통과하면 직원 데이터가 데이터베이스에 저장되고 페이지가 목록 페이지로 리디렉션됩니다.