首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单选按钮:在干草堆中没有找到输入?

单选按钮:在干草堆中没有找到输入?
EN

Stack Overflow用户
提问于 2017-12-29 02:53:21
回答 3查看 463关注 0票数 0

每当我提交表单时,我都会收到以下消息:

The input was not found in the haystack.

这是用于shipping-method元素的(单选按钮)。不知道它意味着什么,该元素的POST数据不是null。

代码语言:javascript
复制
public function getInputFilter()
{
    if (!$this->inputFilter) {
        $inputFilter = new InputFilter();

        // Some other basic filters

        $inputFilter->add(array(
                'name' => 'shipping-method',
                'required' => true,
                'filters' => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim')
                ),
                'validators' => array(
                    array(
                        'name' => 'StringLength',
                        'options' => array(
                            'encoding' => 'UTF-8',
                            'max' => 20,
                        ),
                    ),
                    array(
                        'name' => 'Db\RecordExists',
                        'options' => array(
                            'table' => 'shipping',
                            'field' => 'shipping_method',
                            'adapter' => $this->dbAdapter
                        )
                    ),
                ),
        ));

        $inputFilter->get('shipping-address-2')->setRequired(false);
        $inputFilter->get('shipping-address-3')->setRequired(false);

        $this->inputFilter = $inputFilter;
    }

    return $this->inputFilter;
}

我一直在为<select>寻找解决方案。

下面是文章的样本数据:

代码语言:javascript
复制
object(Zend\Stdlib\Parameters)#143 (1) {
  ["storage":"ArrayObject":private] => array(9) {
    ["shipping-name"] => string(4) "TEST"
    ["shipping-address-1"] => string(4) "test"
    ["shipping-address-2"] => string(0) ""
    ["shipping-address-3"] => string(0) ""
    ["shipping-city"] => string(4) "TEST"
    ["shipping-state"] => string(4) "TEST"
    ["shipping-country"] => string(4) "TEST"
    ["shipping-method"] => string(6) "Ground"
    ["submit-cart-shipping"] => string(0) ""
  }
}

更新: form.phtml

代码语言:javascript
复制
<div class="form-group">
    <?= $this->formRow($form->get('shipping-method')); ?>
    <?= $this->formRadio($form->get('shipping-method')
            ->setValueOptions(array(
                'Ground' => 'Ground',
                'Expedited' => 'Expedited'))
            ->setDisableInArrayValidator(true)); ?>
</div>

ShippingForm.php

代码语言:javascript
复制
    $this->add(array(
        'name' => 'shipping-method',
        'type' => 'Zend\Form\Element\Radio',
        'options' => array(
            'label' => 'Shipping Method',
            'label_attributes' => array(
                'class' => 'lbl-shipping-method'
            ),
        )
    ));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-30 14:22:17

问题在于何时使用setValueOptions()setDisableInArrayValidator()。您应该在代码中更早地这样做,因为在验证表单之前从未设置它,因此inputfilter仍然包含缺省值作为InArray验证器。在验证之后,即检查inputfilter,您为shipping_methods设置了不同的选项。

您应该在setValueOptions()setDisableInArrayValidator()之前移动$form->isValid()。通过在它自己的表单中设置正确的选项,或者在控制器中这样做。最好的方法是将所有选项保存在一个地方,并在form类中执行。

代码语言:javascript
复制
$this->add([
    'name' => 'shipping-method',
    'type' => 'Zend\Form\Element\Radio',
    'options' => [
        'value_options' => [
            'Ground'    => 'Ground',
            'Expedited' => 'Expedited'
        ],
        'disable_inarray_validator' => true,
        'label' => 'Shipping Method',
        'label_attributes' => [
            'class' => 'lbl-shipping-method',
        ],
    ],
]);

另一个您可能要更改的小细节是设置值选项。它们现在是硬编码的,但是您的输入过滤器正在对照数据库记录检查它们是否存在。用数据库记录填充值选项。如果代码仍然包含旧方法,但数据库中有几个新方法,则它们不同步。

代码语言:javascript
复制
class ShippingForm extends Form
{
    private $dbAdapter;

    public function __construct(AdapterInterface $dbAdapter, $name = 'shipping-form', $options = [])
    {
        parent::__construct($name, $options)
        // inject the databaseAdapter into your form
        $this->dbAdapter = $dbAdapter;
    }

    public function init()
    {
        // adding form elements to the form
        // we use the init method to add form elements as from this point
        // we also have access to custom form elements which the constructor doesn't

        $this->add([
            'name' => 'shipping-method',
            'type' => 'Zend\Form\Element\Radio',
            'options' => [
                'value_options' => $this->getDbValueOptions(),
                'disable_inarray_validator' => true,
                'label' => 'Shipping Method',
                'label_attributes' => [
                    'class' => 'lbl-shipping-method',
                ],
            ],
        ]);
    }

    private function getDbValueOptions()
    {
        $statement = $this->dbAdapter->query('SELECT shipping_method FROM shipping');
        $rows = $statement->execute();

        $valueOptions = [];

        foreach ($rows as $row) {
            $valueOptions[$row['shipping_method']] = $row['shipping_method'];
        }

        return $valueOptions;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-12-29 14:57:44

昨天才发生过这种事。

select和多重select ZF2+元素有一个内置的in_array验证器。

记住,过滤器发生在验证器之前。

您在这里可能做得太多了--在ZF2窗体中筛选或添加select和多重select表单元素的验证器是非常罕见的。内置的元素验证器是健壮的,ZF为我们做了很多工作。

尝试删除元素的筛选器和验证器,例如:

代码语言:javascript
复制
$inputFilter->add(array(
            'name' => 'shipping-method',
            'required' => true,
    ));

我还看到了另一个边缘情况:在控制器(或视图)中的某个位置更改select元素的valueOptions,导致视图中使用的valueOptions与表单验证不同(在我们的示例中,它在验证之前用一个新的元素替换元素)。

票数 0
EN

Stack Overflow用户

发布于 2017-12-30 11:39:21

我认为您的问题在于在设置了InArray验证器之后,您正在添加您的值选项,因此验证器没有草堆。

尝尝这个

代码语言:javascript
复制
$this->add(array(
    'name' => 'shipping-method',
    'type' => 'Zend\Form\Element\Radio',
    'options' => array(
        'label' => 'Shipping Method',
        'label_attributes' => array(
            'class' => 'lbl-shipping-method'
        ),
        'value_options' => array(
            'Ground' => 'Ground',
            'Expedited' => 'Expedited'
        ),
        'disable_inarray_validator' => TRUE,
    )
));

并从您的视图中删除setValueOptions和setDisableInArrayValidator。

希望这能行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48016846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档