![]() |
![]() |
![]()
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.
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. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 24 Dołączył: 18.01.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Albo nie do końca rozumiem albo nieprecyzyjnie przedstawiłem problem. Ja pobieram id po atrybutach użytkownika. Następnie Criteriami wyciągam jego dane i za pomocą powiedzmy $u->setName(), $u->setImie() itd ustawiam wartości poszczególnych pól. Czyli w momencie wejścia na akcję edycja, w formularzu są już wszystkie widoczne dane użytkownika które można zmieniać. I teraz chodzi o unikalność np loginów. Dopuszczam zmianę loginu jeżeli takowy nie został zajęty. I do tego walidator służy - sprawdza mi czy nie ma takiego w bazie, ale w momencie jak nie zmienię loginu ten sam walidator sprawdzi czy login nie został już zajęty i wyjdzie mu że tak bo przecież użytkownik aktualnie go posiada. Jak to obejść?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 24 Dołączył: 18.01.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Cytat za pomocą powiedzmy $u->setName(), $u->setImie() itd ustawiam wartości poszczególnych pól i w ten sposób Symfony myśli że chcesz stworzyć nowego usera o takim samych danych, gdyby nie error w login to byś dostałbyś pewnie identyczny błąd dotyczący kolumny id. To trochę tak jakbyś chciał zrobić coś w tym stylu:
Bez sensu. Aby uzyskać edycje danych należy zrobić to co napisałem w poprzednim poście. Cytat Czyli w momencie wejścia na akcję edycja, w formularzu są już wszystkie widoczne dane użytkownika które można zmieniać jeżeli dobrze rozumiem to przypisujesz dane w pliku UserForm? (IMG:style_emoticons/default/blink.gif) pokaż kod źródłowy formularza i akcji bo coś mi się wydaje że tworzysz jakiś nowy standard pisania w Symfony (IMG:style_emoticons/default/winksmiley.jpg) Ten post edytował Pr0100 19.09.2009, 22:18:28 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) ![]() ![]() |
Bez Twojego formularza zbyt wiele napisać nie mogę. Jedno jest pewne, jeśli w formularzu wyślesz wszystkie klucze główne (zazwyczaj będzie to tylko id) to walidator rozpozna, że obiekt znaleziony w bazie to jest ten sam który został wysłany formularzem. Czyli w Twoim przypadku, jeśli wyślesz formularzem id użytkownika, a on nie zmieni swojej nazwy, to nie wyrzuci błędu, bo będą te same id.
Ten post edytował destroyerr 19.09.2009, 22:19:59 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
Chyba zaczynam powoli rozumieć mój problem....bo ja tworze nowy formularz i uzupełniam go danymi z jakiegoś tam wpisu i w momencie zapisu to jest traktowane jako nowy user a nie ten sam....potestuje to co Pr0100 napisał i zobaczę czy dam rade zrobić to co chcę. Rzeczywiście symfony musi traktować formularz jako formularz z danymi do edycji a nie formularz z danymi innego użytkownika, który potem przy zapisie próbuje stworzyć nowego usera. Jestem początkujący w symfony i poprostu wiele rzeczy rzutuje mi się jeszcze z obiektowego, zwykłego php, gdzie tworzyłem obiekty, zapisywałem dane do zmiennych a potem wykonywałem zapytania z udziałem tych zmiennych. Proszę o najjaśniejsze wyjaśnienie. Ten post edytował blackroger 20.09.2009, 01:40:43 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Jak dopiero zaczynasz z symfony, to od razu przerzuć się na doctrine a nie propela. Sam kiedyś mi za to podziękujesz.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 176 Pomógł: 0 Dołączył: 8.11.2008 Ostrzeżenie: (0%) ![]() ![]() |
hmm...może spróbuje z doctrine przy następnym projekcie a teraz chciałbym dokończyć to co już zacząłem...
tutaj znalazłem praktycznie taki sam temat i rozwiązenie jak mój jakkolwiek nie wiem jak go wdrożyć u mnie. http://forum.php.pl/lofiversion/index.php/t93454.html Chodzi o walidację formularza do edycji danych użytkownika. Próbowałem już tak jak pisał Pr0100 ale dalej jest to samo. tzn. dalej walidator krzyczy o unikalność loginów. Cały czas traktuje login tak jakby miał to być inny user a nie ten sam. Wiem że walidacja wykonuje się przed akcją zaraz po wysłaniu żądań. Jak ja mamto zrobić żeby działało...? |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 24 Dołączył: 18.01.2008 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
blackroger nie rozumiesz zupełnie idei formularzy w Symfony, wynajdujesz od nowa koło. http://www.symfony-project.org/forms/1_2/e...pel-Integration
Cytat Jak dopiero zaczynasz z symfony, to od razu przerzuć się na doctrine a nie propela. Sam kiedyś mi za to podziękujesz. warto znać oba ORM'y. A z Doctrine przesiadać się do propela to trochę jak z mercedesa do malucha (IMG:style_emoticons/default/smile.gif) Ten post edytował Pr0100 20.09.2009, 14:31:32 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 3.07.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie,
mam także problem z sfValidatorPropelUnique: kody:
Komunikat błędu: You must pass an array parameter to the clean() method (this validator can only be used as a post validator). Błąd dotyczy dokładnie lini 26 oraz 49. Bez nich względnie działa wszystko poprawnie, tzn nie ma błędu. Niestety nie mogę sobie poradzić z tym problemem. Jestem początkującym w Symfony (co w ogóle mnie oczywiście nie usprawiedliwia) i niestety nie mogę znaleźć rozwiązania tego problemu. Kod żywcem przepisany z książki niejakiego Pana Karola Przytalskiego, Symfony Aplikacje internetowe. Z góry dziękuję za pomoc i pozdrawiam |
|
|
![]()
Post
#11
|
|
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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 20:43 |