2011-02-09 3 views
1

내 HotelAddress 모델 :조건부 검증

<?php 

class HotelAddress extends AppModel { 
    var $name = 'HotelAddress'; 
    var $belongsTo = array(
     'Hotel' => array(
      'className' => 'Hotel' 
     ) 
    ); 

    var $validate = array(
     'address' => array(
      'rule' => 'notEmpty', 
     ) 
    ); 

내 HotelModel

<?php 

class Hotel extends AppModel { 
    var $name = 'Hotel'; 
    var $hasAndBelongsToMany = array(
     'HotelCategory' => array(
      'className' => 'HotelCategory' 
     ) 
    ); 
    var $belongsTo = array(
     'Page' => array(
      'className' => 'Page' 
     ) 
    ); 
    var $hasMany = array(
     'HotelAddress' => array(
      'className' => 'HotelAddress', 
      'dependent' => TRUE 
     ), 
     'HotelPhone' => array(
      'className' => 'HotelPhone', 
      'dependent' => TRUE 
     ) 
    ); 

내보기 :

<div id="main"> 
     <h2>Add Hotel</h2> 
     <?php echo $this->Session->flash();?> 
     <div> 
     <?php 
     echo $this->Form->create('Hotel'); 
     echo $this->Form->input('Hotel.name'); 
     echo $this->Form->input('HotelCategory', array('options' => $hotel_categories, 'multiple' => 'checkbox')); 
     echo $this->Form->input('HotelAddress.0.address'); 
     echo $this->Form->input('HotelAddress.1.address'); 
     echo $this->Form->input('HotelAddress.2.address'); 
     echo $this->Form->input('HotelPhone.0.phone'); 
     echo $this->Form->input('Page.meta_keywords'); 
     echo $this->Form->input('Page.meta_description'); 

     echo $this->Form->end('Save Hotel'); 
     ?> 
     </div> 
<!-- main ends --> 
</div> 

내 문제는 내가 다른 HotelAddress ES를 검증 할 필요가 없다는 것입니다 . 사용자가 주소 중 하나 이상을 채우면 유효성을 검사해야합니다. 그러나 그가 어떤 것을 채우지 않으면 오류가 나타나야합니다.

나는 코드를 beforeSave 메서드에 추가해야한다고 생각하지만,이 작업을 수행하기 위해 무엇이 있어야하는지에 대한 아이디어가 없습니다.

업데이트 :

지금은 가능한 경우 다른 주소의 존재를 검증하지 않음으로써 작동 HotelAddress 모델이 있습니다. 그러나 여전히 절약 할 수 있습니다.

var $existing_address = FALSE; 
var $validate = array(
    'address' => array(
     'rule' => 'checkOnce', 
    ) 
); 

function checkOnce($check) { 
    if (isset($this->data['HotelAddress']['address'])) { 
     if (! empty($this->data['HotelAddress']['address'])) { 
      return $this->existing_address = TRUE; 
     } else { 
      unset($this->data['HotelAddress']['address']); 
      return $this->existing_address; 
     } 
    } 
    return $this->existing_address; 
} 

답변

1

단순히 save를 호출하기 전에 컨트롤러에두고 갈 것 : 각`address` 한 번 검증되기 때문에

if (empty($this->data['HotelAddress'][1]['address'])) { 
    unset($this->data['HotelAddress'][1]['address']); 
} 
if (empty($this->data['HotelAddress'][2]['address'])) { 
    unset($this->data['HotelAddress'][2]['address']); 
} 
+0

이것은 거의 내가 한 일입니다. 주소가 자바 스크립트에 의해 생성 될 것이므로 루프를 만들었지 만 얼마나 많은 것들이 있는지 알지 못합니다. –

1

유효성 검사를 모델에서 제외하고 코드를 작성하면 어떨까요? 당신이 많이 잃을 것이기 때문에

if($this->validateForm($this->data)) 
{ 
    $this->Hotel->saveAll($this->data); 
} 
+0

그것은를 BeforeSave에 그것을 실제로 어렵다. 설정을 해제하고 다른 주소를 확인하는 '주소'를 추적하는 것은 어려웠습니다. +1 충분히 가깝습니다. –

1

내가 beforeSave에 검사를하지 것입니다 : 당신이 저장 방법, 즉를 호출하기 전에 호출되는 방법 A를 BeforeSave 방법 또는에서 검증을 할 수 케이크는 양식 등으로 검증 마법을 만들었습니다.

모델에 custom validation 메서드를 만들면 boolean이 반환되어 검사 성공을 나타낼 수 있습니다. 거기에서 $this->data을 통해 모델 데이터에 액세스 할 수 있으며 하나 이상의 주소가 있는지 확인할 수 있습니다.

+0

예. 이것은 나의 다른 옵션이었다. –