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 эс , Если пользователь заполняет хотя бы один из адресов, он должен быть проверен. Однако, если он не заполняет какой-либо файл, должна отображаться ошибка.

Я считаю, что я должен добавить код по методу beforeSave, но у меня нет идеи о том, что должно быть там для этого.

Update:

теперь у меня есть это в модели 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, поэтому я не знаю, сколько их будет. –

1

Почему бы не взять под контроль проверку вдали от Модели и не закодировать ее самостоятельно? Вы можете сделать проверку в методе BeforeSave или в методе, который вызывается перед вызовом метода сохранения, а именно:

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

Это на самом деле трудно сделать это в BeforeSave, поскольку каждый 'address' проверяется один раз. Было сложно отслеживать, какой «адрес» следует отменить и проверить другие «адреса». +1 достаточно близко. –

1

я бы не сделать проверку в beforeSave, потому что вы потеряете много Торт встроен в магию проверки с формами и т. Д.

В вашей модели вы можете создать метод custom validation, который вернет boolean, чтобы указать успешность проверки. Там вы получите доступ к данным для модели через $this->data, и вы можете проверить наличие хотя бы одного адреса.

+0

Да. Это был мой другой вариант. –

Смежные вопросы