簡體   English   中英

ZF2過濾選擇除空選項以外的其他設置

[英]ZF2 Filtering Select for setting other than empty option

我的目的地是過濾選擇框是否具有空選項以外的其他選項。 如果將Filter'required'設置為true,則在每種情況下都會出現錯誤,即選擇框不必為空。 通過將'required'設置為false,我得到了有效的表單,但是即使我沒有在Select Element中選擇。 除了空選項,還有其他方法可以檢查其他選擇嗎?

//class for creating a Fieldset
class FieldsetCreate extends Fieldset implements InputFilterProviderInterface
{
...
  public function getRoofProductsElement()
  {
     $element = new Select(ProductFormInterface::FIELD_ROOFPRODUCT);
     $element->setLabel('Set roof products');
     $element->setAttribute('id', ProductFormInterface::FIELD_ROOFPRODUCT);
     $element->setEmptyOption('Select...');
     $element->setValueOptions(array('1'=>'None', '2' => 'Is Roof'));
     $element->setAttribute('onchange', 'setRoofProductSelection(this);');

     return $element;
  }
...
   public function getInputFilterSpecification()
   {
     return array(
         array(
             'name' => ProductFormInterface::FIELD_TYPESELECTION,
             'required' => false,

         ),
         array(
             'name' => ProductFormInterface::FIELD_ROOFPRODUCT,
             'required' => false,
            'validators' => array(
                new \Zend\Validator\GreaterThan(array('min' => 0)),
             )
          ),
          array(
             'name' => ProductFormInterface::FIELD_MANUFACTURERS,
             'required' => false,
          )
       );
  }
}

//Form Factory to Set Fieldset To Form and return the form
class ProductTypeFormFactory extends ProductAbstractFormFactory 
implements FactoryInterface
{

   public function createService(ServiceLocatorInterface $serviceLocator)
   {
       $form = new ProductForm('productForm');
       $form->addCsrfElement();

       $service = $serviceLocator->get('Product\Service\Product');
       $form->
           add($this->createFieldsetCreate($service->fetchAllProductTypes()));
       $form->setInputFilter(new InputFilter());
       $form->setValidationGroup($this->createValidationGroup());
       return $form;
   }
}

//The Service with Method createProduct
class ProductService
   implements EventManagerAwareInterface, ProductServiceInterface
{
   public function createProduct($typeId, $manufacturerId, $isRoof, $form)
   {
      $formArray = array(
          ProductFormInterface::FIELD_TYPESELECTION => $typeId,
          ProductFormInterface::FIELD_MANUFACTURERS => $manufacturerId,
          ProductFormInterface::FIELD_ROOFPRODUCT => $isRoof

      );

      $form->setData($formArray); 
      if ($form->isValid()) {
          var_dump('VALID');
      } else {
          var_dump($form->getMessages());
      }
   }

那就是我能給出的最短的代碼。 盡管我使用GreaterThan Validator表單通過在RoofProduct Element上保留為0的空選項有效

創建您自己的自定義驗證器,並在其中設置邏輯。 在module / YourModule / src / YourModule / Form / Validator中,為您的自定義驗證器創建一個類:

CustomValidator.php

<?php
/**
 * Class CustomValidator
 *
 * filename:   CustomValidator.php
 */ 
namespace YourModule\Form\Validator;

use Zend\Validator\AbstractValidator;

class CustomValidator extends AbstractValidator
{
    const INVALID  = 'invalid';
    const WRONG    = 'WRONG';

    protected $messageTemplates     =   array
                                    (
                                        self::INVALID  => "This is invalid."
                                        self::WRONG    => "This is wrong."
                                    );

    public function isValid($value)
    {
        // your logic //

        return $isValid;

    }

    public function isWrong($value)
    {
        // your logic //

        return $isWrong;

    }
}

然后,在表單getInputFilter()中,對於要創建的特定輸入,添加新的自定義驗證器:

'validators' => array
                (
                    array
                    (
                        'name'    => 'YourModule\Form\Validator\CustomValidator',
                        'options' => array
                                     (
                                         'messages' => array
                                                       (
                                                           YourModule\Form\Validator\CustomValidator::INVALID => 'This is just invalid.',
                                                           YourModule\Form\Validator\CustomValidator::WRONG   => 'This is just wrong.',
                                                       )
                                     ),
                        'break_chain_on_failure' => true,
                    ),
                ),

您可以在此處閱讀自定義驗證器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM