Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony] Problem z sfValidatorPropelUnique
blackroger
post
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


Witam. Mam problem dotyczący sfValidatorPropelUnique. Wszystko działa jak należy przy rejestracji tylko chcę go wykorzystać do zmiany danych użytkownika. Problem pojawia w momencie próby zmiany powiedzmy loginu który jest unikalny.
  1. $this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
  2. new sfValidatorPropelUnique(
  3. array('model'=>'Uzytkownicy',
  4. 'column'=>'login'),
  5. array('invalid'=>'Podany login już istnieje'))
  6. ..........
  7. ....
  8. ...
  9. )));


Jak zrobić żeby ten walidator szukał unikalności tylko i wyłącznie dla wszystkich loginów różnych od loginu który jest aktualnie używany przez tego użytkownika. Powiedzmy że login jest Jasiu i użytkownik pozostawia przy zmianie login taki sam, to postwalidator poinformuje ze taki w bazie istnieje, a nie powinien. Natomiast jak użytkownik zmieni login z Jasiu na Janek, a taki login bedzie już przydzielony do innego id to ma poinformowac o zajętości. Wiem że można to zrobić poprzez bezpośrednie zapytania sqlowe i redukcją danego loginu ale chciałbym to zrobić za pomocą sfValidatorPropelUnique. CZy jest taka możliwość? A jeżeli nie ma to proszę o jak najlepsze rozwiązanie.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
blackroger
post
Post #2





Grupa: Zarejestrowani
Postów: 176
Pomógł: 0
Dołączył: 8.11.2008

Ostrzeżenie: (0%)
-----


Korzystam z tej samej książki i przechodzę niestety przez to samo i przez te same niejasne kody....
'login' => new sfValidatorPropelUnique jest post walidatorem i dlatego wyświetla błąd. Zobacz jak jest u mnie... Powracając do mojego problemu. Pr0100 pisząc mi że nie rozumiem zupełnie idei formularzy nie pomogło mi za wiele....Link który mi przesłałeś odnosi się bezpośrednio do klas propela generowanych automatycznie. A ja dziedziczę po sfForm...

Dobra problem rozwiązałem sam. Siedziałem nad tym 2 dni więc chcę to opisać. Piszę dla potomnych:

Jeżeli ktoś chce edytować dane i chce dać użytkownikowi możliwość zmiany np. loginu przy zachowaniu unikalności tego loginu w bazie z pominięciem wystąpienia błędu w przypadku braku zmiany unikalnego elementu, należy postąpić tak:

Można dziedziczyć zarówno po sfForm jak i BaseFormPropel. Po sfForm jest trochę uciążliwiej bo nie można ładować całego obiektu (np. UzytkownicyPeer::receiveByPk(2)) do konstruktora.

Cały problem leży w walidatorze który trzeba przypisać do klucza głównego.
Oto on:

'usid' => new sfValidatorPropelChoice(
array('model'=>'Uzytkownicy',
'column' => 'usid',
'required' => false))

Dzięki temu walidatorowi użytkownik jako obiekt łączy się z elementami i jest rozpoznawany przez propela jako całość.

Następną rzeczą, o której należy pamiętać jest umieszczenie widgeta 'usid' w templacie edycji w formularzu - najlepiej przy pomocy zdefiniowanego w Formie jako 'usid' => new sfWidgetFormInputHidden()
W ten sposób zapewnimy przesyłanie numeru obiektu użytkownika na naszą stronę.

Problemu nie ma się z tym w momencie korzystania z klas generowanych automatycznie, ponieważ tam ten walidator jest już automatycznie. W przypadku gdy dziedziczy się np. po sfForm problem jest.
Przy takim sposobie można do woli korzystać z sfValidatorPropelUnique np. dla loginu i będzie działał jak trzeba.
Zrozumiałem problem, dziękuję wszystkim za udział i próby pomocy.

Ten post edytował blackroger 22.09.2009, 06:24:38
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 11.10.2025 - 00:04