Zend 2 Form Validator' InArray' - 复杂的数组返回无效

时间:2016-04-20 05:28:42

标签: php zend-framework2

我正在尝试实施' InArray' Zend 2中的验证器在表单上并且它一直返回无效。这是代码:

表单元素设置:

    $enquiryType = new Element\Select('enquiryType');
    $enquiryType->setLabel('* What is your enquiry about?')
                    ->setLabelAttributes(array('class' => 'sq-form-question-title'))
                    ->setAttribute('class', 'sq-form-field required')
                    ->setValueOptions($enquiryTypes);

过滤器/验证器设置:

    $enquiryType = new Input('enquiryType');
    $enquiryType->getValidatorChain()
             ->addByName('InArray', array('haystack' => $enquiryTypes));

这是通过module.config.php文件传递到$ enquiryTypes的数组

        'enquiryCategories' => array(
                                'empty_option' => 'Please select an option',
                                array(
                                    'label' => 'General enquiries', 
                                    'options' => array( 
                                        'skype' => 'Skype with your library feedback',
                                        'question' => 'Ask a question',
                                        'feedback' => 'Library feedback',
                                        'eresource' => 'Electronic resources (e.g. e-book, e-journal, database)',
                                        'webbridge' => 'WebBridge Problems',
                                        'dro' => 'DRO'
                                    )
                                ),
                                array(
                                    'label' => 'Application to review',
                                    'options' => array(
                                        '10400' => 'I\'ve returned the item',
                                        '10401' => 'I didn\'t know about overdue points but now I have some',
                                        '10402' => 'Why did I get this invoice?',
                                        '10403' => 'The item I borrowed is lost',
                                        '10404' => 'The item I borrowed has been damaged',
                                        '10405' => 'I never got/had the book',
                                        '10406' => 'Other'
                                    )
                                )
                            ),

我尝试了不同的变体(也使用了递归验证),但还是无法解决这个问题。

2 个答案:

答案 0 :(得分:1)

我尝试过的一件事如下:

$enquiryType = new Input('enquiryType');
    $enquiryType->getValidatorChain()
             ->addByName('InArray', array('haystack' => $enquiryTypes['enquiryCategories']));

我之所以这么说,看起来你可能正在创建数组内部的数组。除非我误解了描述。

如果这对您不起作用,那么您可能需要探索以下问题中指出的爆炸选项

ZF2: How do I use InArray validator to validate Multiselect form element?

祝你好运。

答案 1 :(得分:0)

我终于得到了一个有效的解决方案。我觉得应该有一个更好的解决方案,但我找不到一个。

以下是我使用的过滤器:

$enquiryType = new Input('enquiryType');
$enquiryType->getValidatorChain()
        ->addByName('InArray', array('haystack' => array_keys(
                                    $enquiryTypes[0]['options']+$enquiryTypes[1]['options']
                                )));
$enquiryType->getFilterChain()
         ->attach(new Filter\StringToLower())
         ->attachByName('StripTags');

基本上我必须将数组选项转换为直接关联数组。由于数组在这种情况下保持静态,因此效果很好。

如果数据变为动态,则需要更多内容(循环查找'option'键,将子项添加到过滤器数组等...)