【问题标题】:CakePHP 3 - How to automatically show validation errors in view for form without modelCakePHP 3 - 如何在没有模型的表单的视图中自动显示验证错误
【发布时间】:2016-06-10 16:23:25
【问题描述】:

我正在查看与任何模型无关的基本联系表单。对于这种情况,我想要一些关于利用 Cake 的字段错误自动视图呈现的最佳方法的建议。

控制器

通过自定义验证器执行验证。

public function index()
{
    if ($this->request->is('post')) {               

        // Validate the form
        $validator = new EnquiryValidator();
        $data = $this->request->data();
        $errors = $validator->errors($data);                    

        if (empty($errors)) {

            // Send email, etc.
            // ...
            // Refresh page on success

        }       
        // Show error
        $this->Flash->error('Unable to send email');
    }
}

查看

<?= $this->Form->create(); ?>

    <?= $this->Form->input('name', [
            'autofocus' => 'autofocus',
            'placeholder' => 'Your name',
            'required'
        ]);
    ?>

    <?= $this->Form->input('email', [
            'placeholder' => 'Your email address',
            'required'
        ]);
    ?>

    <?= $this->Form->input('subject', [
            'placeholder' => 'What would you like to discuss?',
            'required'
        ]);
    ?>

    <?= $this->Form->input('message', [
            'label' => 'Query',
            'placeholder' => 'How can we help?',
            'cols' => '30',
            'rows' => '10',
            'required'
        ]);
    ?>

    <div class="text-right">
        <?= $this->Form->button('Send'); ?>
    </div>

<?= $this->Form->end(); ?>

目前表单不会在输入字段旁边显示任何错误。我认为这是因为没有实体与表单或类似的东西相关联,但我不确定。

什么是最好的解决方案?是否可以以更好的方式执行验证以在视图中自动提供字段错误?

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    无模型形式

    使用无模型形式。它可用于验证数据和执行操作,类似于表和实体,并且表单助手支持它就像实体一样,即您只需将无模型表单实例传递给FormHelper::create() 调用。

    这是文档中的示例,稍作修改以匹配您的情况:

    src/Form/EnquiryForm.php

    namespace App\Form;
    
    use App\...\EnquiryValidator;
    use Cake\Form\Form;
    use Cake\Form\Schema;
    use Cake\Validation\Validator;
    
    class EnquiryForm extends Form
    {
    
        protected function _buildSchema(Schema $schema)
        {
            return $schema
                ->addField('name', 'string')
                ->addField('email', ['type' => 'string'])
                ->addField('subject', ['type' => 'string'])
                ->addField('message', ['type' => 'text']);
        }
    
        protected function _buildValidator(Validator $validator)
        {
            return new EnquiryValidator();
        }
    
        protected function _execute(array $data)
        {
            // Send email, etc.
            return true;
        }
    }
    

    在您的控制器中

    use App\Form\EnquiryForm;
    
    // ...
    
    public function index()
    {
        $enquiry = new EnquiryForm();
        if ($this->request->is('post')) {
            if ($enquiry->execute($this->request->data)) {
                $this->Flash->success('Everything is fine.');
                // ...
            } else {
                $this->Flash->error('Unable to send email.');
            }
        }
        $this->set('enquiry', $enquiry);
    }
    

    在您的视图模板中

    <?= $this->Form->create($enquiry); ?>
    

    另见

    【讨论】:

    • 是的,忘了这个。谢谢,仍然是第一次在 Cake 3 中做所有事情。
    猜你喜欢
    • 2017-10-04
    • 2016-05-10
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2016-01-01
    • 2017-01-21
    相关资源
    最近更新 更多