2013-08-22 88 views
4

我已經爲電話號碼定義了一個字段集。這包含「類型」(私人,Office移動...)和「數字」字段。對數的輸入濾波器是 「需要=>真」:ZF2:允許空字段集,但驗證是否至少填寫了一個

``

class PhoneFieldset extends BaseFieldset implements InputFilterProviderInterface 
{ 

    public function __construct() 
    { 
    parent::__construct('phones'); 

    $this->setHydrator(new DoctrineHydrator($this->getEntityManager(), 'HtsBase\Entity\Phone')) 
      ->setObject(new Phone()); 

    $this->add(array(
     'type' => 'DoctrineORMModule\Form\Element\EntitySelect', 
     'name' => 'type', 
     'options' => array(
      'label' => 'Type', 
      'empty_option' => '', 
      'object_manager' => $this->getEntityManager(), 
      'target_class' => 'HtsBase\Entity\OptionlistPhoneType', 
      'property' => 'name', 
     ), 
     'attributes' => array(
      #'id' => 'type', 
      'class' => 'input-medium', 
     ), 
    )); 

    $this->add(array(
     'name' => 'number', 
     'options' => array(
      'label' => 'Number', 
     ), 
     'attributes' => array(
      'type' => 'text', 
      #'id' => 'number', 
      'class' => 'input-medium', 
      'maxlength' => '25', 
      'autocomplete' => 'off', 
     ), 
    )); 
    } 

    public function getInputFilterSpecification() 
    { 
    return array(
     'type' => array(
      'required' => false, 
     ), 
     'number' => array(
      'required' => true, 
      'filters' => array(
       array('name' => 'StringTrim'), 
      ), 
      'validators' => array(
       array(
        'name' => 'StringLength', 
        'options' => array(
         'encoding' => 'UTF-8', 
         'max' => 25, 
        ), 
       ), 
      ), 
     ), 
    ); 
    } 

``

CAN I驗證器/過濾器附加到整個字段集?因此,如果「類型」和「數字」爲空,則該字段集是有效的,但驗證是否至少填寫了一個?

+0

你管理,使其工作setRequired(false)? –

回答

1

我發現了一個易於使用的解決方案,雖然我不再使用該表格,現在我大量使用InputFilter,仍然需要相同的東西。但發現了一個簡單的解決方案

AbstractFilterValidator,我自己的實現

abstract class AbstractFilterValidator extends AbstractValidator 
{ 
    /** 
    * Returns true if and only if $value meets the validation requirements 
    * 
    * If $value fails validation, then this method returns false, and 
    * getMessages() will return an array of messages that explain why the 
    * validation failed. 
    * 
    * @param mixed $value 
    * @return bool 
    * @throws Exception\RuntimeException If validation of $value is impossible 
    */ 
    public function isValid($value) 
    { 
     $this->setValue($value); 
     $filter = $this->buildFilter(); 
     $filter->setData($value); 

     if (!$filter->isValid()) { 
      $this->abstractOptions['messages'] = $filter->getMessages(); 
      return false; 
     } 
     return true; 
    } 

    /** 
    * @return array 
    */ 
    public function getMessages() 
    { 
     return $this->abstractOptions['messages']; 
    } 

    /** 
    * @return InputFilter\InputFilter 
    */ 
    abstract protected function buildFilter(); 
} 

老答案

雖然您正在使用InputFilterProviderInterface,我用Zend\InputFilter\InputFilter,想和你一樣。如果字段集未填寫,請驗證true

爲此,我將isValid替換爲以下內容;

public function isValid() 
{ 
    $values = array_filter($this->getRawValues()); 
    if (empty($values)) { 
     return true; 
    } 

    return parent::isValid(); 
} 

它只是簡單地過濾來自所有空數組鍵陣列,看到docs有關信息。然後檢查$values是否爲空,如果是,則返回true。否則驗證者被調用。


那麼我需要一些東西,但需要一個體面的解決方案。仍然沒有找到一個好的運氣,所以我寫了下面的代碼。

<?php 
namespace Application\InputFilter; 

use Zend\InputFilter as ZFI; 

class InputFilter extends ZFI\InputFilter 
{ 
    private $required = true; 

    /** 
    * @return boolean 
    */ 
    public function isRequired() 
    { 
     return $this->required; 
    } 

    /** 
    * @param boolean $required 
    * 
    * @return $this 
    */ 
    public function setRequired($required) 
    { 
     $this->required = (bool) $required; 
     return $this; 
    } 

    /** 
    * @return bool 
    */ 
    public function isValid() 
    { 
     if (!$this->isRequired() && empty(array_filter($this->getRawValues()))) { 
      return true; 
     } 

     return parent::isValid(); 
    } 
} 

github gist

現在,您可以簡單地調用一個InputFilter

+0

感謝您的最後一點:-)雖然您的'AbstractFilterValidator'解決方案如何抵禦'InputFilter'類?假設你將前者替換爲更好/更高效? – Nukeface

+0

我們從ZF2中選擇了一種支持其他庫的方法,因爲我們編寫的驗證是支持這種行爲和更多功能的自己的庫。所以不能告訴你哪個更好 – MKroeders

相關問題