2012-05-10 3 views
3

короткая версияValidation проблемы с несколькими флажками (HABTM) на CakePHP форме

У меня есть некоторые HABTM флажков на форме. Валидация работает правильно (по крайней мере один флажок должен быть проверен для проверки, чтобы пройти), но деления сообщений CakePHP не генерируются, как должно быть.

Long Version

У меня есть, из которого позволяет пользователям заполнить свое имя и адрес электронной почты, а затем выбрать из списка брошюр (чекбоксы) они хотели бы получить.

форма выглядит следующим образом:

<?php 
echo $this->Form->create('Request',array('action' => 'index')); 
echo $this->Form->input('id'); 
echo $this->Form->input('name'); 
echo $this->Form->input('email'); 
echo $this->Form->input('Brochure',array(
     'label' => __('Information Required:',true), 
     'type' => 'select', 
     'multiple' => 'checkbox', 
     'options' => $list, 
     'selected' => $this->Html->value('Brochure.Brochure'), 
)); 
echo $this->Form->submit('Submit'); 
echo $this->Form->end(); 
?> 

В мой контроллер, $list устанавливается как например:

$this->Request->Brochure->find('list',array('fields'=>array('id','name'))); 

После прочтения 2-й ответ (отправленный user448164) в HABTM form validation in CakePHP на переполнение стека , Я поставил свою модель запроса следующим образом:

<?php 

class Request extends AppModel { 

var $name = 'Request'; 

function beforeValidate() { 
    foreach($this->hasAndBelongsToMany as $k=>$v) { 
     if(isset($this->data[$k][$k])) 
     { 
      $this->data[$this->alias][$k] = $this->data[$k][$k]; 
     } 
    } 
} 

var $validate = array(
    'name' => array(
     'rule' => 'notEmpty', 
     'message' => 'Please enter your full name' 
    ), 
    'email' => array(
     'rule' => 'email', 
     'message' => 'Please enter a valid email address' 
    ), 
    'Brochure' => array(
     'rule' => array('multiple', array('min' => 1)), 
     'message' => 'Please select 1' 
    ), 
); 
?> 

Это действительно работает на 99%. Если ни один из флажков не установлен, проверка завершается неудачно, как и должно быть. Однако единственная проблема заключается в том, что Cake не устанавливает класс «error» на <div>, и он не создает <div class="error-message">Please select 1</div>, как и следовало ожидать.

Для имени и электронной почты нет проблем - создаются правильные разделители ошибок.

Для уточнения, валидация является, работающих на моих HABTM флажках. Единственная проблема заключается в том, что деления ошибок не генерируются.

+0

Какая версия торта и как выглядит '$ this-> validationErrors'? – jeremyharris

+0

@jeremyharris Я использую Cake 2.1.1, но у меня была эта проблема с Cake 1.3.x. '$ this-> validationErrors' имеет значение null, но' $ this-> Request-> validationErrors' дает мне массив, содержащий сообщение об ошибке «Выберите 1», которое я установил в модели. – Joseph

+1

Да, но какой формат массива ошибок проверки? Вот как Cake определяет, должно ли поле показывать ошибку. Вам, вероятно, придется немного помассировать, что я получаю, что-то вроде ответа, заданного в вопросе, с которым вы связались. – jeremyharris

ответ

0

Я размещаю это здесь, так как на самом деле это гораздо лучший вопрос, чем the related question, который вы нашли.

Я ударил головой о стену, пытаясь справиться с той же проблемой, что и ошибка проверки на странице. Я использую CakePHP v1.2, и я сталкиваюсь с подобной проблемой, хотя я фактически разделил HABTM на отдельные таблицы, то есть Request->BrochuesRequest->Brochure. Это связано с тем, что я не могу удалить его и повторно добавить строки таблицы соединений по желанию.

Во-первых, я думаю, что accepted answer from your linked question предполагает, что вы делаете, когда save/saveAllbeforeValidate вызова срабатывает, но я делал это через validates вызов. Разница в том, что сначала нужно вызвать метод Request->set. Это была статья Джонатана Снука о Multiple Validation Sets, в которой я указал на эту проблему.

Вторая проблема заключается в том, что сообщение об ошибке появляется до значения $field, которое вы используете при вызове invalidate. На протяжении веков я включал модель, а также поле, предполагая, что это соответствует тому, как он соответствует недействительному вызову на вход, т. Е. У вас есть $form->input('BrochuresRequest.brochures_id'), поэтому вам нужно $this->BrochuresRequest->invalidate('BrochuresRequest.brochures_id').

Однако это Неверный Вы просто хотите $this->BrochuresRequest->invalidate('brochures_id').

<?php 
// requests/add view 
echo $form->input('BrochuresRequest.brochures_id', array('multiple' => true)); 

// requests_controller 
function add() { 
    if (!empty($this->data)) { 
     $this->Request->create(); 
     // critical set to have $this->data 
     // for beforeValidate when calling validates 
     $this->Request->set($this->data); 
     if ($this->Request->validates()) { 
      $this->Request->saveAll($this->data); 
     } 
    } 
} 

// request model 
function beforeValidate() { 
    if (count($this->data['BrochuresRequest']['brochures_id']) < 1) { 
     $this->invalidate('non_existent_field'); // fake validation error on Project 
     // must be brochures_id and not BrochuresRequest.brochures_id 
     $this->BrochuresRequest->invalidate('brochures_id', 'Please select 1'); 
     return false; 
    } 
    return true; 
} 
?> 

Несколько из других вещей, которые я взял на пути через:

  1. Вам не нужен separate $form->error in the view
  2. я не мог за жизнь мне получить " многократное 'правило валидации для работы в модели
  3. accepted answer проверяет наличие isset, но я считаю, что это не требуется и замаскировало проблему отсутствия $this->data.
  4. beforeValidate должен возвращать false, если вы хотите, чтобы это предотвратило действие сохранения.
+0

Ничего себе, это было давно, но код все еще используется, поэтому я вернусь к нему, когда у меня есть момент, и попробуйте то, что вы предложили. Я вернусь, чтобы отметить это как принятый ответ, если это сработает :-) – Joseph

+0

какие-либо новости по этому поводу? – Ondrej

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