2011-02-09 122 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前:

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

這幾乎是我所做的。雖然我做了一個循環,因爲地址將由JavaScript生成,所以我不知道會有多少。 – 2011-02-10 06:51:00

1

爲什麼不從Model控制驗證,並自己編碼?你可以做驗證的beforeSave方法或在一個名爲方法調用保存方法,即前:

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

它實際上是很難做到這一點的beforeSave因爲每個`address`驗證一個時間。跟蹤哪個地址未被設置並檢查其他地址是很困難的。 +1足夠接近。 – 2011-02-10 06:49:36

1

我不會做檢查的beforeSave,因爲你會失去很多的Cake的內置驗證魔法和表單等。

您可以在您的模型中創建一個custom validation方法,該方法將返回boolean以指示檢查成功。在那裏你可以通過$this->data訪問模型的數據,你可以檢查是否存在至少一個地址。

+0

是的。這是我的另一種選擇。 – 2011-02-09 20:42:43