2012-09-10 7 views
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'); 
. 
. 
. 

이 어디에 관여 하나 개 이상의 계정 거래있을 수 있습니다. 또한 AccountTransaction에는 transaction_id 필드가 있습니다.

  1. 검사가 모든 계정 거래의 합이 거래 금액과 동일 금액 있는지 확인
  2. 저장 트랜잭션 및 해당 ID를 얻을 : 양식이 제출되면

    , 내가 할 그래서 쉽게 컨트롤러에서 그 일을 할 수 있지만, 일에서 유효성 검사를 설정하는 방법이 있는지 궁금 해요 트랜잭션 ID

를 사용

  • 저장 계정 거래 e 거래 모델을 저장하기 전에 모든 계정 거래가 합산되는지 확인합니다.

  • 답변

    2

    사용하므로, 제출 된 모든 것에 대해 유효성 확인 검사를 추가했습니다. 나는 올바른 요소에 부착 된 사용자 확인 메시지를 받고 결국 그것은 잘 작동 :

    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' 
         ) 
        ), 
    ); 
    
    1

    1 단계 - custom validation rules을 사용하십시오.

    2 단계 - 무시 -이

    3 단계는 당신의 연결이 올바른지 가정 자동으로 수행됩니다 - 나는 마침내 어쨌든 $ this-> 데이터로 모든 데이터를 볼 수 있다는 것을 깨달았다 saveAll()

    +0

    이것은 내가 아래로 시작되는 경로입니다 ,하지만 유효성 검사 메시지를 활용하고 싶었 기 때문에 저에게는 효과가 없었습니다. 마침내 $ this-> 데이터에 대한 전체 액세스 권한이 유효성 검사 기능에 있음을 알게되었으므로 대신 그 값을 사용했습니다. 내가 한 대답의 발췌 부분을 다른 대답에 넣을 것이다. – jloosli