【问题标题】:Field not showing error in Agile Toolkit敏捷工具包中的字段未显示错误
【发布时间】:2012-09-27 03:27:14
【问题描述】:

尝试使用 beforeSave 钩子进行一些服务器端验证并引发字段错误 - 它正在工作......有点......

由于未按要求保存而导致异常,如果未定义任何字段,则可以使用正确的消息查看基本异常。如果我定义字段,那么我看不到错误弹出窗口或 crud 表单上的错误信息。

需要明确的是,它不会让我保存并抛出异常。当我使用setField('fiscal_year') 时,它仍然没有根据异常保存,只是没有显示异常。

代码如下:

class Model_Finances extends Model_Table {
    public $table='finances';

    function init() {
        parent::init();

        $this->hasOne('Grant');

        $this->addField('fiscal_year')->datatype('int');
        $this->addField('requested')->datatype('money');
        $this->addField('committed')->datatype('money');
        $this->addField('spent')->datatype('money');

        $this->getField('grant')->hidden(true);

        $this->addHook('beforeSave',$this);
    }

    function beforeSave($model){
        $exist = $this->api->db->dsql()
                      ->table($this->table)
                      ->field('count(1)')
                      ->where('grant_id', 2) //manually set ID for testing.
                      ->where('fiscal_year', $model['fiscal_year'])
                      ->do_getOne();
        // Validate fiscal year before saving
        if($exist[0]) {
            throw $this->exception('Fiscal year for this grant already exists')->setField('fiscal_year');
        }
    }
}

如何使用:

    $finances = $grant->ref('Finances');
    $finances->getField('fiscal_year')->setValueList($this->fiscalYears)->mandatory(true);
    $crud=$tabs->addTab('Finances')->add('CRUD');
    $crud->setModel($finances);
    if($crud->grid)$crud->grid->addTotals(array('requested', 'committed', 'spent'));

【问题讨论】:

  • 您是否保存在表单中?尝试使用$form->onSubmit(function($f){ $f->update()->js()->univ()->successMessage('All ok')->execute; });
  • 嗨 @romaninsh 它是从 CRUD 元素中保存的。
  • 添加了更多代码以显示用法@romaninsh

标签: atk4 php


【解决方案1】:

重现该问题非常困难,因此我创建了一个测试用例。

我只更改了这一行:

throw $this->exception('Fiscal year for this grant already exists','ValidityCheck')
    ->setField('fiscal_year');

这是结果

如果您提交这样的表单:

$form->onSubmit(function($f){
    $f->model->blah();
});

那么model->blah内部产生的异常也会很好的显示出来。

【讨论】:

  • 成功了! - 我不记得在任何地方读过有关“ValidityCheck”的信息,奇怪。
  • ValidityCheck 确实有效!这很棒——因此,我们通常可以将所有重要的验证移到它们实际所属的模型级别。在这种特殊情况下(也可能在测试套件中),可能需要添加更多 where 子句,正如我在上面的评论中提到的那样: id!=$model->id AND grant_id=$model[grant_id] AND finance_year=$model[$财政年度] 或类似的东西。否则,不可能编辑现有的赠款,而且您不能在一年内添加超过一项(不同的)赠款。 +1
  • 还有一点需要注意的是,model -> exception('...','ValidityCheck') 仅在 beforeSave 钩子中有效,而在 model 的其他函数中无效。
  • 是的,或者你可以从$form->onSubmit(function($f){ $f->model->blah(); });内部调用它们,然后它也会捕获异常。
【解决方案2】:

我想我不会完全回答你的问题,因为我也是 ATK4 的初学者,但是

首先我猜你不应该在模型级别使用 $_GET 。我认为它应该类似于 grant_id=$model['grant_id']。

第二,据我了解,您想检查一个补助金是否有唯一的财政年度?如果是这样,那么您应该在 WHERE 中再添加两个条件(见下文)或类似的条件。

结果我相信你的查询应该是这样的(只是一个伪代码):

$exist = $this->api->db->dsql()
                   ->table($this->table)
                   ->field('count(*)') // I guess it can be written as ->count() too
                   ->where('grant_id',$model['grant_id'])
                   ->where('id','!=',$model->id)
                   ->where('fiscal_year',$model['fiscal_year'])
                   ->do_getOne();
if($exist[0]) {
    throw $this->exception('Fiscal year for this grant already exists')
               ->setField('fiscal_year');
}

谈到与表单字段相关联的抛出异常,我想您应该以某种方式使用表单字段验证钩子添加它。但我不知道该怎么做。

【讨论】:

  • 还是不行。这会根据需要停止保存,只是不会在字段上显示错误。
  • 正如我之前所说:谈到与表单字段关联的抛出异常,我想您应该以某种方式使用表单字段验证钩子添加它。但我不知道该怎么做。
  • 也许你应该看看这个问题。也许它已在 Github 的最新 ATK4 版本中修复。上周有一个针对 atk4_form.js 的修复。也许这对您的情况也有帮助 - 看看吧!
  • 感谢@DarkSide 获得了最新版本,但仍然没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多