1

そのため、1つ以上のアカウントで構成されるトランザクションを処理するアプリケーションを開発しています。たとえば、ウォルマートで100ドル購入す​​ると、食料品のアカウントから40ドル、家庭のアカウントから60ドルが支払われる場合があります。

フォームは大まかに:

echo $this->Form->input('Transaction.user_id');
echo $this->Form->input('Transaction.description');
echo $this->Form->input('Transaction.amount');
echo $this->Form->input('AccountTransaction.0.account_id');
echo $this->Form->input('AccountTransaction.0.amount');
.
.
.

1つ以上のアカウントトランザクションが関係する可能性がある場合。また、AccountTransactionにはtransaction_idフィールドがあります。

フォームが送信されたら、次のことを行います。

  1. すべてのアカウントトランザクション金額の合計がトランザクション金額と等しいことを確認してください。
  2. トランザクションを保存し、そのIDを取得します
  3. トランザクションIDを使用してアカウントトランザクションを保存します

したがって、コントローラーでこれらのことを簡単に行うことができますが、トランザクションモデルで検証を設定して、保存する前にすべてのアカウントトランザクションが加算されることを確認する方法があるかどうか疑問に思っています。

4

2 に答える 2

2

とにかく$this->dataですべてのデータを表示できることにようやく気づいたので、送信されたすべてのものに対して検証チェックを行うカスタムを追加しました。カスタマイズされた検証メッセージが適切な要素に添付されることになり、それはうまく機能します。

public function accountsBalance($check) {
    $check = (float) $check['amount'];
    $sum = 0;
    foreach($this->data['AccountTransaction'] as $account) {
        $sum += $account['amount'];
    }
    if ($sum==$check)
        return true;
    $diff = $check-$sum ;
    $message = sprintf("This doesn't match what you entered in your accounts. The total for the accounts is $%0.2f. You're too %s by $%0.2f",
        $sum, $diff > 0 ? "high": "low", abs($diff));
    $this->validator()->getField('amount')
        ->getRule('balance')->message = $message;
    return false;
}

次に、私が持っているルールについて:

    public $validate = array(
    'amount' => array(
        'notempty' => array(
            'rule' => array('notempty'),
        ),
        'balance' => array(
            'rule' => array('accountsBalance'),
            'message' => 'The total needs to match your account entries'
        )
    ),
);
于 2012-09-11T18:46:23.833 に答える
1

ステップ1-カスタム検証ルールを使用します。

ステップ2-無視-これは、関連付けが正しいことを前提として自動的に実行されます

ステップ3- saveAll()を使用する

于 2012-09-10T19:00:22.423 に答える