【问题标题】:CakePHP 3 Modelless form with dotted fieldsCakePHP 3 带有虚线字段的无模型表单
【发布时间】:2015-10-29 11:42:23
【问题描述】:

在我的 form.ctp 中,我有一些以点表示法命名的输入,因此它们在 POST 上连接到 $this->request->data 内的同一数组。

问题是我无法为它创建一个Modelless form,因为它不会将点符号映射到数组,并在请求-> 数据中逐字搜索consumer.name 之类的字段。有什么办法可以通过简单的$form->execute() 来验证这些数据吗?

我的 Cake 版本是 3.1.1

代码:

//Form Class
protected function _buildSchema(Schema $schema)
{
    return $schema->addField('consumer.name', 'string')
        ->addField('consumer.card_number', ['type' => 'string'])
        ->addField('consumer.expire_month', ['type' => 'string'])
        ->addField('consumer.expire_year', ['type' => 'string'])
        ->addField('type', ['type' => 'string'])
        ->addField('consumer.cvv', ['type' => 'string']);
}

protected function _buildValidator(Validator $validator)
{
    return $validator->add('consumer.name', 'length', [
            'rule' => ['minLength', 3],
            'message' => 'Consumer name too short',
        ])
        ->requirePresence('type', true)
        ->requirePresence('consumer.name', true)
        ->requirePresence('consumer.card_number', true)
        ->requirePresence('consumer.expire_month', true)
        ->requirePresence('consumer.expire_year', true)
        ->requirePresence('consumer.cvv', true)
        ->add('consumer.card_number', 'validFormat', [
            'rule' => array('custom', '/[0-9]{16}/'),
            'message' => 'A valid card number is required',
        ])
        ->add('consumer.expire_month', 'validFormat', [
            'rule' => array('custom', '/[01]?[0-9]/'),
            'message' => 'A valid expire month is required',
        ])
        ->add('consumer.expire_year', 'validFormat', [
            'rule' => array('custom', '/[0-9]{2}/'),
            'message' => 'A valid expire year is required',
        ])
        ->add('consumer.cvv', 'validFormat', [
            'rule' => array('custom', '/[0-9]{3}/'),
            'message' => 'A valid CVV is required',
        ]);
}

我的视图有几个这样的输入:

<?php echo $this->Form->input('consumer.name', [
                                'label' => false,
                                'class' => 'form-control inputbox_user',
                                'pattern' => "^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ,.'-]+$",
                                'required' => true,
                                'title' => 'Introduce el nombre del titular de la tarjeta.',
                                ]);

                                 ?>

还有我的控制器逻辑:

$form = new PaymentForm;
    if ($this->request->is(['patch', 'post', 'put'])){
        if( $form->execute($this->request->data) ){
            //ok
        }
    }
}

【问题讨论】:

    标签: php forms validation cakephp cakephp-3.0


    【解决方案1】:

    点符号将在视图中变成“HTML 数组”。调试你的请求,你会看到['consumer']['name']。这按框架的预期工作并且是正确的。 AFAIK 没有办法解决这个问题 - 也不需要。

    只需将符号更改为下划线:例如consumer_name。出于另一个原因,使用点也是一个坏主意:如果您需要通过 JS 或 CSS 访问它们,您将给自己带来麻烦。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多