Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] pobranie wartości pola w formularzu
Forum PHP.pl > Forum > PHP > Frameworki
blackroger
Dzień dobry. Jak pobrać wartość pola w formularzu.
Kod formularza:
  1.  
  2. class ChangeUserDataForm extends BaseUzytkownicyForm {
  3.  
  4. public function configure() {
  5. $this->setWidgets(array('usid'=>new sfWidgetFormInputHidden(),
  6. 'login'=>new sfWidgetFormInput(),
  7. 'stare_haslo'=>new sfWidgetFormInputPassword(),
  8. 'nowe_haslo'=>new sfWidgetFormInputPassword(),
  9. 'nowe_powtorz'=>new sfWidgetFormInputPassword(),
  10. 'imie'=>new sfWidgetFormInput(),
  11. 'nazwisko'=>new sfWidgetFormInput(),
  12. 'miasto'=>new sfWidgetFormInput(),
  13. 'mail'=>new sfWidgetFormInput(),
  14. 'osobie'=> new sfWidgetFormTextarea()
  15. ));
  16.  
  17. $this->widgetSchema->setNameFormat('change_user[%s]');
  18. ....
  19. .
  20. .
  21. .
  22. .
  23. $sqlo = new Criteria();//tworzymy obiekt do zapytania
  24. $sqlo->add(UzytkownicyPeer::LOGIN, 'xxxxxxxxxxxxxxx-co ja mam tu wpisać');
  25. $uzytkr = UzytkownicyPeer::doSelectOne($sqlo);//szukamy wpisu w uzytkownicy
  26. $zmienna_ze_starym_hasłem = $uzytkr->getHaslo();
  27.  
  28. $this->validatorSchema->setPostValidator(
  29.  
  30. new sfValidatorSchemaCompare(
  31. $zmienna_ze_starym_hasłem, sfValidatorSchemaCompare::EQUAL, 'stare_haslo',
  32. array(),
  33. array('invalid'=>'Błędne hasło!'))
  34.  
  35. );


potrzebuje tej wartości, bo chcę wyciągnąć hasło i władować je do walidatora compare. Jest wogóle taka możliwość w formularzu? Wiem że można to przenieść do akcji i porównać ale chciałbym spróbować tak jeżeli się da...
Berg
  1. if(!$this->isNew) { // Obiekt był już zapisany w bazie danych więc pobranie starego hasła jest możliwe
  2.  
  3. $stare_haslo = $this->getObject()->getHaslo(); // Pobieram stare hasło
  4.  
  5. // Ustawiam walidator
  6. $this->validatorSchema->setPostValidator(new sfValidatorSchemaCompare(
  7. $stare_haslo, sfValidatorSchemaCompare::EQUAL, 'haslo',
  8. array(),
  9. array('invalid'=>'Błędne hasło!'))
  10. );
  11. }
blackroger
Ok....wielkie dzięki....a jakbyś mógł mi jeszcze powiedzieć jak po prostu pobrać wartość widgeta do zmiennej, bo muszę to hasło podane w formularzu potraktować md5?
destroyerr
Zacznijmy od tego, że sfValidatorSchemaCompare nie przyjmuje wartości, a nazwy pól formularza. Poza tym chcesz porównywać hasło z bazy z tym wpisanym przez użytkownika? Chcesz powiedzieć, że hasła przechowujesz w czystej postaci? Zmień to jak najszybciej.
Jako postValidator zastosowałbym albo własny walidator, albo callback. Oczywiście nie musi to być postValidator, może być po prostu walidator na polu stare_haslo

Jeśli chcesz pobrać login użytkownika, w formularzu, to wystarczy przecież:
  1. $this->getObject()->getLogin();


Pytanie mam jeszcze dlaczego na nowo ustawiasz wszystkie widżety. Na pewno jest to konieczne?
Jeszcze porada odnośnie pobierania danych w różnych miejscach (czy to w akcji, czy to w formularzu), korzystaj raczej z klas *Peer i to w nich twórz zapytania i zwracaj gotowe dane. Unikaj tworzenie obiektu Criteria poza modelem.
blackroger
Zapomniałem wcześniej wspomnieć, że właśnie problem leży w kodowaniu hasła. Bo samo porównanie nie jest problemem tak jak napisał Berg, ale właśnie zakodowanie wartości pola i dopiero porównanie go stanowi....czyli jak najlepiej to zrobić? napisać własny validator, w którym będę porównywał wartości tak jakbym to robił w akcji?


Odnośnie widgetów potrzebuje tylko zmian w kilku ale nie mogę przecież w klasie dziedziczącej dać setValidators i ustawić powiedzmy dwóch bo będą tylko dwa walidatory, tym bardziej że do każdego mam walidację...
Berg
Faktycznie, zapomniałem że postValidator nie uznaje przesłanych zmiennych. To może rzucę kodem jak napisać własny walidator:

  1. public function configure() {
  2.  
  3. $this->getValidatorSchema()->setPostValidator(new sfValidatorCallback(array( 'callback' => array($this, 'checkPassword'))));
  4. }
  5.  
  6. public function checkPassword($validator, $values) {
  7.  
  8. $haslo = md5($values['haslo']); // Pobieram nowe hasło i traktuje je md5
  9. $stare_haslo = $this->getObject()->getHaslo(); // Pobieram stare hasło
  10. if($haslo == $stare_haslo) {
  11. $error = new sfValidatorError($validator, 'Błędne hasło');
  12. throw new sfValidatorErrorSchema($validator, array('haslo' => $error));
  13. }
  14. return $values;
  15. }
  16.  


Cytat(blackroger @ 24.09.2009, 13:50:48 ) *
Odnośnie widgetów potrzebuje tylko zmian w kilku ale nie mogę przecież w klasie dziedziczącej dać setValidators i ustawić powiedzmy dwóch bo będą tylko dwa walidatory, tym bardziej że do każdego mam walidację...


Radziłbym zacząć dokładnie czytać dokumentację Symfony, od tego masz chociażby widgetSchema winksmiley.jpg
  1. $this->widgetSchema['haslo'] = new sfWidgetFormInputPassword();

blackroger
Dzięki wielkie tylko zamiast:
  1. if($haslo == $stare_haslo)


to
  1. if($haslo <> $stare_haslo)


bo nie zauważyłem i nie chodziło tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.