2013-02-25 3 views
0

У меня есть две таблицы:Cake PHP Multiple модель проверки

senderinfos:

 

    id | Name | email_add | Address | 
============================================ 
    1 | Amit  | [email protected] | park Street| 

receiverinfos:

 

    id | Name | email_add| Address | 
======================================= 
    1 | SOS | [email protected]  | park1 

Я даю модель, вид и контроллер Код:

Модель

Senderinfo:

<?php 
App::uses('AppModel', 'Model'); 
/** 
* Admin Login Model 
* 
*/ 
class Senderinfo extends AppModel 
{ 
    public $name='Senderinfo'; 
    public $usetables='senderinfos'; 

    public $validate = array(


     'contact' => 
     array(
     'rule'  => 'notEmpty', // or: array('ruleName', 'param1', 'param2' ...) 
     'allowEmpty' => false, 
     'message' => 'Please Enter Contact.' 
    ), 

    'name' => 
     array(
     'rule'  => 'notEmpty', // or: array('ruleName', 'param1', 'param2' ...) 
     'allowEmpty' => false, 
     'message' => 'Please Enter Sender Name.' 
    ), 


    'email_add' => array(

      'email_add' => array(
      'rule' => 'email', 
      'allowEmpty' => true, 
      'message' => 'Please Enter Valid Email', 
      'last' => true 
    )), 


    ); 

} 
?> 

Receiveinfo:

<?php 
App::uses('AppModel', 'Model'); 
/** 
* Admin Login Model 
* 
*/ 
class Receiverinfo extends AppModel 
{ 
    public $name='Receiverinfo'; 
    public $usetables='receiverinfos'; 

    public $validate = array(


     'contact' => 
     array(
     'rule'  => 'notEmpty', // or: array('ruleName', 'param1', 'param2' ...) 
     'allowEmpty' => false, 
     'message' => 'Please Enter Contact.' 
    ), 

    'name' => 
     array(
     'rule'  => 'notEmpty', // or: array('ruleName', 'param1', 'param2' ...) 
     'allowEmpty' => false, 
     'message' => 'Please Enter Sender Name.' 
    ), 


    'email_add' => array(

      'email_add' => array(
      'rule' => 'email', 
      'allowEmpty' => true, 
      'message' => 'Please Enter Valid Email', 
      'last' => true 
    )), 


    ); 

} 
?> 

Посмотреть

send_money.ctp

<content> 
      <div class="pg_title txtLeft">Send Money</div> 
       <?php echo $this->Form->create('Agents', array('action' => 'send_money'));?> 

        <div style="display:none;"><input type="hidden" value="POST" name="_method"></div> 
        <fieldset title="SENDER'S INFORMATION"><legend>SENDER'S INFORMATION</legend> 
        <table> 
         <tbody> 
          <tr> 
           <td><label>Contact No.<span class="red">*</span></label></td> 
           <td><?php echo $this->Form->input('Senderinfo.contact',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Sender's Name<span class="red">*</span></label></td> 
           <td><?php echo $this->Form->input('Senderinfo.name',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Email Address</label></td> 
           <td><?php echo $this->Form->input('Senderinfo.email_add',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Mailing Address</label></td> 
           <td><?php echo $this->Form->input('Senderinfo.address',array('label'=>false,'div'=>false,'type'=>'textarea','cols'=>39,'rows'=>3,'class'=>'textarea','style'=>'width:330px')); ?></td> 
          </tr> 
          </tbody> 
        </table> 
        </fieldset> 
        <fieldset title=""><legend>RECEIVER'S INFORMATION</legend> 
        <table> 
         <tbody> 
          <tr> 
           <td><label>Contact No.<span class="red">*</span></label></td> 
           <td><?php echo $this->Form->input('Receiverinfo.contact',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Receiver's Name<span class="red">*</span></label></td> 
           <td><?php echo $this->Form->input('Receiverinfo.name',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Email Address</label></td> 
           <td><?php echo $this->Form->input('Receiverinfo.email_add',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Mailing Address</label></td> 
           <td><?php echo $this->Form->input('Receiverinfo.address',array('label'=>false,'div'=>false,'type'=>'textarea','cols'=>39,'rows'=>3,'class'=>'textarea','style'=>'width:330px')); ?></td> 
          </tr> 

          </tbody> 
        </table> 
        </fieldset> 

        <fieldset><legend>MONEY TRANSFER</legend> 
        <table> 
         <tbody> 
          <tr> 
           <td><label>Amount(tk)<span class="red">*</span></label></td> 
           <td><?php echo $this->Form->input('Transaction.sending_amount',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 
          <tr> 
           <td><label>Charge(tk)<span class="red">*</span></label></td> 
           <td><?php echo $this->Form->input('Transaction.charge',array('label'=>false,'div'=>false,'size'=>50,'style'=>'width:330px')); ?></td> 
          </tr> 

          <tr> 
          <?php 
          $foo = ""; 
          $options = array('1' => 'Paid','0' => ' Due'); 
          $attributes = array(
           'legend' => false, 
           'value' => true, 
           'checked'=> ($foo == "Paid"), 
          ); 
          ?> 
          <td> 
          <?php echo $this->Form->radio('transaction.status',$options, $attributes);?> 
          </td> 
          </tr> 


         </tbody> 
        </table> 
        </fieldset> 
        <fieldset><legend>CUSTOM MESSAGE</legend> 
        <table> 
         <tbody> 
          <tr> 
           <td style="width: 158px;"><label>Message</label></td> 
           <td><?php echo $this->Form->input('transaction.message',array('label'=>false,'div'=>false,'type'=>'textarea','cols'=>39,'rows'=>3,'class'=>'textarea','style'=>'width:330px')); ?></td> 
          </tr> 
         </tbody> 
        </table> 
        </fieldset> 
        <table> 
         <tbody> 
          <tr> 
           <td colspan="2" align="right"><input type="reset" value="Reset"> | <?php echo $this->Form->submit('SEND', array('div' => false,'formnovalidate' => true));?></td> 
          </tr> 
         </tbody> 
        </table> 
       <?php print $this->Form->end();?> 
    </content> 
    <div class="clear"></div> 



Controller : 

    public function send_money() 
      { 
        $this->layout='agent'; 
        if(empty($this->data) == false) 
        { 
          if($this->Senderinfo->save($this->data)) 
          { 

           $this->Receiverinfo->save($this->data); 
           //$this->Session->setFlash('Data inserted successfully.'); 
           //$this->redirect('send_money'); 
          } 

          /*if($this->Receiverinfo->save($this->data)) 
          { 
           //$this->Session->setFlash('Data inserted successfully.'); 
           $this->redirect('send_money'); 
          } 
          */ 
        } 
        else 
        { 
         //$this->set('errors', $this->Senderinfo->invalidFields()); 
         //$this->set('errors', $this->Receiverinfo->invalidFields());  
        } 

      } 

Я хочу, чтобы вставить записи в два стола с совершенным validation.But мой часть проверки не работает отлично. Это означает, что когда вы увидите мою страницу просмотра, информацию отправителя, информацию получателя, деньги, которые обертываются html legend.I хочу сделать обязательное поле для проверки после нажатия кнопки отправки. В этом коде происходит то, что когда я нажимаю кнопку подтверждения, отправитель уведомляет информацию, но часть информации получателя валидация не работает. Когда я добавляю какое-либо значение в часть отправителя, эта проверка только части данных приемника работает только. Что мне нужно делать?

ответ

0

Прежде всего; видимо, существует «отношение» между «отправителем» и «получателем» в вашем приложении, но НЕ в определении модели/базы данных. Опираясь на идентификатор «автоматической инкреции» вашей базы данных (например, приемник 1 и отправитель 1 принадлежат вместе), не является надежным. Автоинкрементные идентификаторы будет «не синхронизированы» между обеими таблицами, и в итоге вы столкнетесь с ситуацией, когда 'receiver 123' действительно должен быть «подключен» к 'sender 125'.

Если я правильно понимаю, что делает эта форма, создается «денежная транзакция» в базе данных. Отправитель и получатель должны (в этом случае), вероятно, не быть сохранены в отдельных базах данных, если только вы не предложите вариант «выбрать» существующего отправителя/получателя из списка.

В обеих ситуациях в вашем приложении должна быть таблица/модель, которая «соединяет» две, иначе у вас будет только случайный список людей, отправляющих »и« получающие »деньги, но никак не знать который людей хочет отправить деньги , которые получателя

Если вы не собираетесь «повторное использование» отправители/приемников, чем правильная БД-дизайн должен быть чем-то вроде:

id| sender_name | sender_email | sender_address | receiver_name | receiver_email | receiver_address 
1 | Amid  | [email protected]  | Parkstreet  | SOS   | [email protected]  | park 1 

I назвал бы эту таблицу «денежными переводами» и модель «Moneytransfer»

Наличие в одной модели упростит валидацию и гарантирует, что информация отправителя и получателя будет присутствовать и исправляться.

Если вы действительно хотите, чтобы вручную сохранить две отдельные записи (На основании моих объяснений выше, я настоятельно советую вам не сделать это), вы должны сделать это;

  • Validate обе записи вручную через $this->Mymodel->validates($data)
  • заключите как сохраняет в транзакции и отката, если один из них не удается

Больше информации вручную проверки внутри контроллера можно найти здесь: http://book.cakephp.org/2.0/en/models/data-validation/validating-data-from-the-controller.html

Дополнительную информацию об использовании транзакций в CakePHP можно найти здесь: http://book.cakephp.org/2.0/en/models/transactions.html

[обновление]

Просмотр далее через «форму», там «кажется», чтобы быть моделью «сделки», а? Если это так и модель-отношения правильно определены в CakePHP, вы сможете сохранить все связанные записи с помощью модели :: saveAssociated(). Это будет также приложить все сохраняет в транзакции (атомарного)

Смотрите здесь: http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-saveassociated-array-data-null-array-options-array