Zend Framework - Formlar ve Doğrulama

Zend Framework ayrı bir bileşen sağlar, zend-formform oluşturma ve doğrulama sürecini hızlandırmak. Modeli ve görünüm katmanını birbirine bağlar. Önceden tanımlanmış modellerden tam teşekküllü html formu oluşturmak için bir dizi form öğesi sağlar.InputFilter modeli forma göre doğrulamak için sınıf ve verileri formdan modele bağlama seçenekleri ve bunun tersi de geçerlidir.

Form Bileşenini Kurun

Zend form bileşeni, Composer aşağıda belirtildiği gibi komut -

composer require zendframework/zend-form

Bir Zend form çerçevesinin, formları yönetmek için üç alt bileşeni vardır. Aşağıda ayrıntılı olarak açıklandığı gibidir -

  • Elements - Modeldeki bir özelliğe eşlenmiş tek bir html giriş denetimi tanımlamak için kullanılır.

  • Fieldset - Öğeleri ve diğerlerini gruplamak için kullanılır fieldset iç içe bir şekilde.

  • Form - Bir html formu oluşturmak için kullanılır ve öğelerden ve alan kümelerinden oluşur.

Zend Formları genellikle module//src/Form dizin.

Misal

Şimdi eklemek için basit bir form oluşturalım bookveritabanına. Bunu yapmak için aşağıdaki adımlara uymalıyız -

Adım 1: BookForm Oluşturun

* Myapp / module / Tutorial / src / Form ”dizini altında“ BookForm.php ”dosyasını oluşturun. Dosyaya aşağıdaki değişiklikleri ekleyin -

<?php  
namespace Tutorial\Form;  
use Zend\Form\Form;  

class BookForm extends Form {
   
   public function __construct($name = null) { parent::__construct('book'); $this->add(array( 
         'name' => 'id', 
         'type' => 'Hidden', 
      ));  
      $this->add(array( 'name' => 'author', 'type' => 'Text', 'options' => array( 'label' => 'Author', ), )); $this->add(array( 
         'name' => 'title', 
         'type' => 'Text', 
         'options' => array( 
            'label' => 'Title', 
         ), 
      ));  
      $this->add(array( 
         'name' => 'submit', 
         'type' => 'Submit', 
         'attributes' => array( 
            'value' => 'Go', 
            'id' => 'submitbutton', 
         ), 
      )); 
   } 
}

Form sınıf bir add methodModeli ve ilgili form ayrıntılarını eşlemek için. biz yarattıkBookForm genişleterek Form sınıf ve form ayrıntılarını ekledi Book model.

Adım 2: Kitap modelini güncelleyin, Book.php

Modeli güncelleyin, ‘Book’ aşağıda belirtildiği gibi filtre ve doğrulama ile -

<?php 
namespace Tutorial\Model;  
use Zend\InputFilter\InputFilterInterface; 
use Zend\InputFilter\InputFilterAwareInterface; 
use Zend\InputFilter\InputFilter;  

class Book implements InputFilterAwareInterface { 
   public $id; 
   public $author; public $title;  
   protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) { 
      throw new \Exception("Not used"); 
   }  
   public function getInputFilter() { 
      if (!$this->inputFilter) { $inputFilter = new InputFilter(); 
         $inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array( 
            'name' => 'author', 
            'required' => true, 
            'filters' => array( 
               array('name' => 'StripTags'), 
               array('name' => 'StringTrim'), 
            ), 
            'validators' => array( 
               array( 
                  'name' => 'StringLength', 
                  'options' => array( 
                     'encoding' => 'UTF-8', 
                     'min' => 1, 
                     'max' => 100, 
                  ), 
               ), 
            ), 
         )); 
         $inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter; 
   }  
   public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null; 
      $this->author = (!empty($data['author'])) ? $data['author'] : null; $this->title = (!empty($data['title'])) ? $data['title'] : null; 
   } 
}

Her model, InputFilterAwareInterface. InputFilterAwareInterface iki yöntem sağlar,setInputFilter() ve getInputFilter().

GetInputFilter, modelin doğrulama ayrıntılarını almak için kullanılır. Zend çerçevesi, formu doğrulamak için zengin bir filtre ve doğrulayıcı seti sağlar. Kitap modelinde kullanılan filtrelerden ve doğrulayıcılardan bazıları aşağıdaki gibidir -

  • StripTags - İstenmeyen HTML'yi kaldırın.

  • StringTrim - Gereksiz beyaz alanı kaldırın.

  • StringLength validator - Kullanıcının belirtilen sınırdan daha fazla karakter girmediğinden emin olun.

3. Adım: BookTable sınıfını güncelleyin

Dahil et saveBook veritabanına kitap ekleme yöntemi.

BookTable.php

<?php  
namespace Tutorial\Model;  
use Zend\Db\TableGateway\TableGatewayInterface;  

class BookTable {
   protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) { 
      $this->tableGateway = $tableGateway; 
   }  
   public function fetchAll() { 
      $resultSet = $this->tableGateway->select(); 
      return $resultSet; } public function getBook($id) { 
      $id = (int) $id; 
      $rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) { 
         throw new \Exception("Could not find row $id"); } return $row; 
   }  
   public function saveBook(Book $book) { $data = array ( 
         'author' => $book->author, 'title' => $book->title, 
      );  
      $id = (int) $book->id; 
      if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id));  
         } else { 
            throw new \Exception('Book id does not exist'); 
         } 
      } 
   } 
}

4. Adım: TutorialController sınıfını güncelleyin

Eğitim denetleyicisine yeni bir eylem addAction ekleyin - myapp / module / Tutorial / src / Controller / TutorialController.php.

public function addAction() { 
   $form = new BookForm(); $form->get('submit')->setValue('Add');  
   $request = $this->getRequest(); 
   if ($request->isPost()) { $book = new Book(); 
      $form->setInputFilter($book->getInputFilter()); 
      $form->setData($request->getPost());  
      if ($form->isValid()) { $book->exchangeArray($form->getData()); $this->bookTable->saveBook($book); // Redirect to list of Tutorial return $this->redirect()->toRoute('tutorial'); 
      } 
   }  
   return array('form' => $form); 
}

addAction yöntem aşağıdaki işlemleri yapar -

  • İstek nesnesini alır.

  • İsteğin http yönteminin bir post yöntem.

  • İsteğin http yöntemi değilse post, sadece şablonu oluşturur, add.phtml

  • İsteğin http yöntemi değilse post, sonra ayarlar inputfilter, istek verisini alır ve onu inputfiler'e ayarlar.

  • Formun geçerli olup olmadığını kontrol eder. isValid() Form sınıfının yöntemi.

  • Form geçerli değilse, şablonu tekrar oluşturur, add.phtml

  • Form geçerliyse, kitabı veri tabanına kaydeder ve ana sayfaya yönlendirir.

5. Adım: add.phtml şablonunu ekleyin

Bir şablon oluşturun - myapp / module / Tutorial / view / tutorial / tutorial / add.phtml altında add.phtml

Add.phtml

<?php  
$title = 'Add new Book'; 
$this->headTitle($title);  
?>  
<h1><?php echo $this->escapeHtml($title); ?></h1>  
<?php  
if(!empty($form)) { $form->setAttribute('action', $this->url('tutorial', array('action' => 'add'))); $form->prepare();  
   echo $this->form()->openTag($form); 
   echo $this->formHidden($form->get('id')); 
   echo $this->formRow($form->get('author'))."<br>"; 
   echo $this->formRow($form->get('title'))."<br>"; 
   echo $this->formSubmit($form->get('submit')); 
   echo $this->form()->closeTag(); 
}

Burada kitap formunu kullanarak Form örnek $form.

Adım 6: Uygulamayı Çalıştırın

Şimdi uygulamayı çalıştırabiliriz - http://localhost:8080/tutorial/add.

Form Page

Validate Error Page