2013-07-23 17 views
6

Próbowałem debugować to przez około dwa dni i przeczytałem każdą odpowiedź na to pytanie w Internecie ... i nadal nie mogę go uruchomić.Formularz CakePHP 2.3 nie pokazuje błędów sprawdzania poprawności

W mojej aplikacji CakePHP Mam obsługi formularza rejestracji, który wykorzystuje model o nazwie użytkownika i Formularz pomocnika. Jeśli sprawdzanie poprawności nie powiedzie się, formularz nie będzie wyświetlał żadnych błędów sprawdzania poprawności.

Tablica $this->User->validationErrors jest poprawnie wypełniona przed wyświetleniem widoku, zgodnie z debug(), a fakt, że model nie jest sprawdzany, jest wykrywany przez $this->User->save().

Oto mój widok:

<?php 
echo $this->Form->create('User'); 
echo $this->Form->input('soton_username', array('label' => 'Email address', 'after' => '@soton.ac.uk')); 
echo $this->Form->input('username', array('label' => 'Choose a username')); 
echo $this->Form->input('password'); 
echo $this->Form->input('password_confirm', array('label' => 'Password (again)', 'type' => 'password')); 
echo $this->Form->input('first_name'); 
echo $this->Form->input('last_name'); 
echo $this->Form->submit('Create account'); 
echo $this->Form->end(); 
?> 

Oto moje działanie:

public function create() { 
    if($this->request->is('post')) { 
     $this->User->set($this->request->data); 

     $valid = true; 
     $validationErrors = array(); 
     $password = $this->request->data('User.password'); 
     $password_confirm = $this->request->data('User.password_confirm'); 

     if(strlen($password) < 5) { 
      $validationErrors['password'][] = 'Password must be at least 5 characters long'; 
      $valid = false; 
     } 

     if($password != $password_confirm) { 
      $validationErrors['password_confirm'][] ='Passwords do not match'; 
      $valid = false; 
     } 

     $this->User->data['User']['email'] = $this->request->data('User.soton_username') . '@soton.ac.uk'; 

     $group = $this->Group->find('first', array('conditions' => array('default' => 1))); 
     if($group) { 
      $gid = $group['Group']['id']; 
     } else { 
      $gid = 1; 
     } 
     $this->User->data['User']['group_id'] = $gid; 

     if($this->User->validates() && $valid) { 
      $this->User->save(); 
      $this->Session->setFlash('<a href="https://stackoverflow.com/users/activate/' . $this->User->data['User']['activation_id'] . '">Activate</a>'); 
      return $this->redirect('/users/confirm_create'); 
     } 

     $this->User->validationErrors = array_merge($this->User->validationErrors, $validationErrors); 

     if(isset($this->User->validationErrors['email'])) { 
      $this->User->validationErrors['soton_username'] = $this->User->validationErrors['email']; 
     } 

     //debug($this->request->validationErrors);exit; 
     $this->Session->setFlash('There were errors with the form.'); 
    } 
} 

soton_username i password_confirm pola nie są w rzeczywistości częścią bazy danych, ale muszą jeszcze zostać zatwierdzone.

Moja użytkownika modelu ma $validate zmienną, która Formularz nie rozpoznaje jako wstawia required="required" w odpowiednich miejscach.

Każda pomoc zostanie doceniona.

Odpowiedz

5

Ok, więc znalazłem odpowiedź na moje pytanie.

następującą funkcję w moim AppController klasie jest culrprit:

public function beforeRender() { 
    $user_id = $this->Auth->user('id'); 
    $user = $this->User->read(null, $user_id); 
    $this->set('user', $user); 
} 

Z jakiegoś powodu wywołanie funkcji $this->Model->read() zapobiega błędy sprawdzania poprawności nie był wyświetlany, a funkcja ta była nazywając to na koniec każde działanie. Przeniesienie go do funkcji beforeFilter() rozwiązuje problem.

+0

Dzięki, poprawiono mój problem. BTW, możesz użyć AuthComponent :: user() w widokach, więc nie trzeba tego kodu w beforeFilter() – Will

+0

Naprawiono również mój problem, 8 miesięcy później. Dzięki! – harmjanr

1

Oto moja odpowiedź, ponieważ nie dzwonił przez użytkownika> read():

kopany przez rdzeń ciasto i okazało się, że pola o błędach są wypełniane automatycznie na podstawie nazwy modelu przeszedł z form-> create ('Model').

Mój model to "Użytkownik" i moim zdaniem miałem $ this-> form-> create ("Users"). Zwróć uwagę na "s". Sprawdzanie poprawności odbywa się na modelu, więc tablica błędów sprawdzania poprawności jest indeksowana według nazwy modelu: "Użytkownik". Formularz wykorzystuje nazwę przekazaną w utworze "Użytkownicy", aby wyszukać błędy.

Aby to naprawić, upewnij się, że używasz formy w liczbie pojedynczej w postaci-> create(). Dla mnie jest to "Użytkownik".

+1

Musiałem opublikować to, ponieważ wszystko, co mogłem znaleźć w Internecie, to ludzie mówiący o wywołaniu read(). Mam nadzieję, że to pomaga komuś. –

Powiązane problemy