我正在审核与任何模型无关的基本联系表单。我想就这种情况利用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(); ?>
目前,表单不会在输入字段旁边显示任何错误。我认为这是因为没有与表格相关的实体或类似的东西,但我不确定。
什么是最佳解决方案?验证是否可以更好的方式在视图中自动提供字段错误?
答案 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); ?>
另见