大家。几个星期前我开始在个人项目中使用atk4,从那以后一直面临着一些困难。我想问的这个具体问题是关于如何在使用atk4框架附带的CRUD组件时进行表单验证。
我已经尝试了几种不同的解决方案,但都没有解决我的问题。
我觉得这里的问题可能是表单验证在方法$form->isSubmitted()
的调用中发生(我是否正确?)。由于在页面中使用CRUD组件时我们不使用这种方式处理表单提交,因此我们必须找到它的替代方法。例如,假设我有一个带有以下init()函数的页面:
function init() {
parent::init();
// create a CRUD and set a model to it
$crud = $this->add('CRUD');
$m = $crud->setModel('Person');
if ($crud->form) {
$fn = $crud->form->getField('first_name');
$fn->validateNotNull('The first name must not be empty.');
}
}
即使我已将验证添加到名字字段,也不会验证它。我尝试了几件事,但没有成功。我试图扩展CRUD类并重新实现formSubmit($form)
函数,在那里添加验证。即使我这样做,它也行不通。
最初(在CRUD类中),有函数:
function formSubmit($form){
$form->update();
$this->api->addHook('pre-render',array($this,'formSubmitSuccess'));
}
我尝试遍历表单的字段并调用其validate()
方法,但它不起作用。另外,如果我尝试改变功能(在MyCRUD类中,让我们说),如下所示,
function formSubmit($form){
if ($form->isSubmitted()) {
$form->update();
$this->api->addHook('pre-render',array($this,'formSubmitSuccess'));
}
}
发生了无限循环......有人可以帮助我吗?
[编辑]
最后一个与此问题密切相关的问题。我刚刚尝试进行下面罗马语提出的完全相同的验证,但是,我只是添加一个表单,而不是添加一个表单,它不起作用 - 虽然CRUD确实有效。相反,发生了“AJAX响应中的错误:SyntaxError:意外的令牌
答案 0 :(得分:1)
CRUD组件尊重您在模型中进行的验证。当数据输入表单并单击按钮时,将调用$model->update()
。
继续执行beforeUpdate()钩子,这是你需要拦截的那个。
http://agiletoolkit.org/learn/understand/model/actions
class Model_Book extends Model_Table {
function init(){
parent::init();
// .... more definitions ...
$this->addHook('beforeSave',$this);
}
function beforeSave(){
if(strlen($this['book_name']<10))
throw $this->exception('Name of the book is too short')
->setField('book_name');
}
如果模型无法保存并且会产生异常,Form会自动将其显示为字段错误。