Создание одного из группы похожих полей формы, необходимых в CakePHP - PullRequest
0 голосов
/ 20 июля 2009

В моей форме есть несколько полей с именами / адресами электронной почты, например:

data[Friend][0][name]
data[Friend][1][name]
data[Friend][2][name]

и т.д.

и

data[Friend][0][email]
data[Friend][1][email]
data[Friend][2][email]

и т.д.

У меня есть пользовательское правило проверки, которое проверяет, заполнено ли соответствующее поле. Т.е. если данные [Друг] [2] [имя], то данные [Друзья] [2] [электронная почта] ДОЛЖНЫ быть заполнены.

К вашему сведению, вот как выглядит одно из двух правил:

Правило проверки моей формы: (У меня тоже есть подтверждение по электронной почте, но это не имеет значения)

'name' => array(
    'checkEmail' => array(
      'rule' => 'hasEmail',
      'message' => 'You must fill in the name field',
      'last' => true
    )
)

Мой код правила:

function hasEmail($data){
  $name = array_values($data);
  $name = $name[0]; 
  if(strlen($name) == 0){
    return empty($this->data['Friend']['email']);
  }
  return true;
}

Мне нужно сделать так, чтобы одна из пар была заполнена как минимум . Может быть любым, если индексы соответствуют.

Я не могу придумать, как если бы я установил правило формы как обязательное или allowEmpty false, оно завершится неудачей во ВСЕХ пустых полях. Как я могу проверить наличие 1 пары и, если она есть, продолжить?

Кроме того, мне нужно удалить все оставшиеся пустые поля [Friend], чтобы мой saveAll () не сохранял загрузку пустых строк, но я думаю, что могу обработать эту часть, используя extract в моем контроллере. Основная проблема - это проверка. Спасибо.

1 Ответ

1 голос
/ 20 июля 2009

Я бы посмотрел на обратный вызов Model :: beforeValidate ( API ).

Использование этого обратного вызова для вывода отладочной информации должно помочь вам определить, сколько раз она запускается и какие данные доступны модели при каждом вызове.

С помощью этой информации вы можете создать флаг, когда найдете первую подходящую пару, и вмешаться в массив Model :: validates или массив Model :: data, чтобы обойти последующие попытки проверки.

Что касается вашего последнего пункта, вы можете использовать Set :: filter для простого удаления пустых полей из вашего набора данных.

...