[英]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中,為您的自定義驗證器創建一個類:
<?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.