1

サーバー側の検証で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'));
4

2 に答える 2

1

問題を再現するのは非常に困難だったので、それからテストケースを作成しました。

私はこの行だけを変更しました:

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

そしてここに結果があります

ここに画像の説明を入力してください

このようなフォームを送信する場合:

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

次に、model->blah内で生成された例外も適切に表示されます。

于 2012-10-12T00:30:43.883 に答える
0

私もATK4の初心者なので、あなたの質問には完全には答えられないと思いますが、

まず第一に、モデルレベルで$_GETを使用するべきではないと思います。私はそれがgrant_id=$model['grant_id']のようなものであるべきだと信じています。

第二に、私が理解した限りでは、1つの助成金に対して独自の会計年度があることを確認したいですか?その場合は、WHERE(以下を参照)などにさらに2つの条件を追加する必要があります。

結果として、クエリは次のようになるはずです(単なる擬似コード)。

$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');
}

フォームフィールドに関連付けられた例外のスローについて言えば、フォームフィールド検証フックを使用して何らかの方法で例外を追加する必要があると思います。しかし、私はそれを行う方法がわかりません。

于 2012-09-27T13:31:58.777 に答える