CakePHP 3 - 如何在没有模型的表单中自动显示验证错误

时间:2016-06-10 16:23:25

标签: php cakephp cakephp-3.0

我正在审核与任何模型无关的基本联系表单。我想就这种情况利用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(); ?>

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

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

1 个答案:

答案 0 :(得分:1)

无模型表格

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

以下是文档中的示例,根据您的情况进行了一些修改:

<强> SRC /形式/ 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); ?>

另见