Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony]czy robił ktoś własny formularz logowania ?Solved]
Forum PHP.pl > Forum > PHP > Frameworki
nieraczek
W Symfony po zainstalowaniu wtyczki sfGuardAuth standardowy formularz logowania wygląda tak:
http://img514.imageshack.us/my.php?image=beztytuut.jpg

A ja chciałbym go zmienić - polskie napisy itp. oraz przy okazji po zalogowaniu zrobić przekierowanie na daną stronę, bo aktualnie dziwnie to u mnie działa.

Szczątkowy opis jak to zrobić znalazłem tutaj: http://www.symfony-project.org/plugins/sfG...b=plugin_readme

I mam narazie:
action.class.php:
  1. <?php
  2.  
  3. require_once(sfConfig::get('sf_plugins_dir').'sfDoctrineGuardPluginmodulessfGuardAuthlibBasesfGuardAuthActions.class.php');
  4.  
  5.  
  6. class sfGuardAuthActions extends BasesfGuardAuthActions
  7. {
  8.  
  9.  public function executeSignin(sfWebRequest $request)
  10.  {
  11.          $this->form = new LogowanieForm();
  12.        
  13.        if ($request->isMethod('post'))
  14.        {
  15.              $this->form->bind($request->getParameter('logowanie'));
  16.              if ($this->form->isValid())
  17.              {
  18.                
  19.                
  20.                
  21.                
  22.                $this->redirect('stronka/tajne');
  23.            
  24.            }
  25.        }      
  26.  }  
  27.  
  28. }
  29. ?>



signinSuccess.php:
  1. <form action="<?php echo url_for('@sf_guard_signin') ?>" method="POST">
  2.  <table>
  3.    <?php echo $form ?>
  4.    <tr>
  5.      <td colspan="2">
  6.        <input type="submit" value="Zaloguj"/>
  7.      </td>
  8.    </tr>
  9.  </table>
  10. </form>


LogowanieForm.class.php:
  1. <?php
  2.  
  3.  
  4. class LogowanieForm extends sfForm
  5. {
  6.  public function configure()
  7.  {
  8.    $this->setWidgets(array(
  9.      'login'    => new sfWidgetFormInput(),
  10.      'haslo'   => new sfWidgetFormInput(),
  11.    ));    
  12.  
  13.    $this->widgetSchema->setLabels(array(
  14.      'login'    => 'Twój login',
  15.      'haslo'   => 'Twoje hasło',
  16.    ));    
  17.  
  18.    
  19.  
  20.    $this->setValidators(array(
  21.      'login'   => new sfValidatorString(array(), array('required' => 'Nie wpisano loginu.')),
  22.      'haslo' => new sfValidatorString(array(), array('required' => 'Nie wpisano hasła.')),
  23.    ));
  24.  
  25.     $this->validatorSchema->setPostValidator(new sfGuardValidatorUser(array(), array('invalid' => 'Login lub hasło są niepoprawne')));
  26.     $this->widgetSchema->setNameFormat('logowanie[%s]');
  27.  
  28.  }
  29. }
  30. ?>



Narazie chyba ok jest wszystko ? W jaki sposób mam w symfony zweryfikować czy login i hasło są poprawne jak te w bazie danych ?
phpion
Cytat(nieraczek @ 1.03.2009, 14:59:53 ) *
W jaki sposób mam w symfony zweryfikować czy login i hasło są poprawne jak te w bazie danych ?

Strzelam (ale mogę się mylić!): wysłać zapytanie do bazy danych?
nieraczek
Przepisałem mniej więcej to co jest w BasesfGuardAuthActions.class.php i za każdym razem mam komunikat o niepoprawnym loginie i haśle:

  1. <?php
  2.  
  3. require_once(sfConfig::get('sf_plugins_dir').'sfDoctrineGuardPluginmodulessfGuardAuthlibBasesfGuardAuthActions.class.php');
  4.  
  5.  
  6. class sfGuardAuthActions extends BasesfGuardAuthActions
  7. {
  8.  public function executeSignin(sfWebRequest $request)
  9.  {
  10.          $user = $this->getUser();
  11.         if ($user->isAuthenticated())
  12.         {
  13.               return $this->redirect('@homepage');
  14.         }
  15.  
  16.          $this->form = new LogowanieForm();
  17.        
  18.        if ($request->isMethod('post'))
  19.        {
  20.              $this->form->bind($request->getParameter('logowanie'));
  21.              if ($this->form->isValid())
  22.              {
  23.                
  24.                $values   = $this->form->getValues();
  25.  
  26.                   $this->getUser()->signin($values['user'], true);
  27.  
  28.                $signinUrl = sfConfig::get('app_sf_guard_plugin_success_signin_url', $user->getReferer($request->getReferer()));
  29.  
  30.                return $this->redirect('' != $signinUrl ? $signinUrl : '@homepage');
  31.            
  32.            }
  33.        }      
  34.  }  
  35.  
  36. }
  37. ?>
destroyerr
Nie wiem po co tworzysz sam, cały formularz od nowa.
Wystarczyło dziedziczyć po tym z pluginu (sfGuardFormSignin). Jeśli jednak nie chcesz z tego korzystać, to i tak polecam zajrzeć do tej klasy i dowiesz się jak sprawdzać poprawność loginu i hasła.
nieraczek
No ja w gruncie rzeczy też nie wiem, dobrze, że mnie uświadomiłeś. smile.gif

Więc zgodnie z Twoją radą zmodyfikowałem pliki (swoją drogą za dużo narobili tych katalogów - wystarczy spojrzeć na długość poniższy ścieżek dostępu do plików):
C:\Program Files\WebServ\httpd\sf_sandbox\plugins\sfDoctrineGuardPlugin\modules\sfGuardAuth\templates\signinSuccess.php:
  1. <?php use_helper('I18N') ?>
  2.  
  3. <form action="<?php echo url_for('@sf_guard_signin') ?>" method="post">
  4.  <table>
  5.    <?php echo $form ?>
  6.  </table>
  7.  
  8.  <input type="submit" value="<?php echo __('Zaloguj') ?>" />
  9.  <a href="<?php echo url_for('@sf_guard_password') ?>"></a>
  10. </form>


oraz C:\Program Files\WebServ\httpd\sf_sandbox\plugins\sfDoctrineGuardPlugin\lib\form\doctrine\sfGuardFormSignin.class:
  1. <?php
  2.  
  3. /**
  4.  * sfGuardFormSignin for sfGuardAuth signin action
  5.  *
  6.  * @package form
  7.  * @package sf_guard_user
  8.  */
  9. class sfGuardFormSignin extends BasesfGuardFormSignin
  10. {
  11. public function configure()
  12.  {
  13.    $this->setWidgets(array(
  14.      'username'    => new sfWidgetFormInput(),
  15.      'password'   => new sfWidgetFormInput(array('type' => 'password')),
  16.      'remember' => new sfWidgetFormInputCheckbox(),
  17.    ));    
  18.  
  19.  
  20.    $this->widgetSchema->setLabels(array(
  21.      'username'    => 'Twój login',
  22.      'password'   => 'Twoje hasło',
  23.    'remember'   => 'Pamiętać',
  24.    ));    
  25.  
  26.    
  27.  
  28.    $this->setValidators(array(
  29.      'username'   => new sfValidatorString(array(), array('required' => 'Nie wpisano loginu.')),
  30.      'password' => new sfValidatorString(array(), array('required' => 'Nie wpisano hasła.')),
  31.      'remember' => new sfValidatorBoolean(),
  32.    ));
  33.        
  34.  
  35.    $this->validatorSchema->setPostValidator(new sfGuardValidatorUser(array(), array('invalid' => 'Login lub hasło są niepoprawne')));
  36.    
  37.    $this->widgetSchema->setNameFormat('signin[%s]');
  38.  
  39.  }
  40.  
  41.  
  42. }
  43. ?>


Dobrze to zrobiłem, bo mi działa, ale to że mi działa to nie znaczy, że dobrze ? Metoda public function configure() jest także w klasie BasesfGuardFormSignin i definiuje formularz w języku angielskim więc jak rozumiem te metody są wirtualne tak jak np. w języku java i pisząc metodę w klasie pochodnej sfGuardFormSignin przykryłem tę z klasy podstawowej tak jak w c++ czy java ? Żeby potem nie było problemów.....

I jak rozumiem przy dodawaniu nowych tabel w bazie danych powyższe pliki nie zostaną nadpisane ? Tylko te z przedrostkiem 'Base' ewentualnie zostaną nadpisane ?
destroyerr
Pliki z pluginu nie powinny być zmieniane, powinieneś to robić tylko w swojej aplikacji. Dlatego napisałem, żebyś dziedziczył po tym formularzu, a nie go edytował. To samo tyczy się szablonów i akcji.
Poza tym w ogóle tego nie rozumiem dlaczego po raz kolejny tworzysz widżety i walidatory skoro są już one tworzone "w klasie wyżej". Domyślam się, że masz problemy z oo w php, doucz się.
nieraczek
No to skopiowałem do sf_sandbox\lib\form\doctrine ten plik sfGuardFormSignin.class.php z zawartością dokładnie taką samą jak w moim poprzednim poście czyli:
  1. <?php
  2. class sfGuardFormSignin extends BasesfGuardFormSignin
  3. {
  4. public function configure()
  5.  {
  6.    $this->setWidgets(array(
  7.      'username'    => new sfWidgetFormInput(),
  8.      'password'   => new sfWidgetFormInput(array('type' => 'password')),
  9.      'remember' => new sfWidgetFormInputCheckbox(),
  10.    ));    
  11.  
  12.  
  13.    $this->widgetSchema->setLabels(array(
  14.      'username'    => 'Twój login',
  15.      'password'   => 'Twoje hasło',
  16.    'remember'   => 'Pamiętać',
  17.    ));    
  18.  
  19.    
  20.  
  21.    $this->setValidators(array(
  22.      'username'   => new sfValidatorString(array(), array('required' => 'Nie wpisano loginu.')),
  23.      'password' => new sfValidatorString(array(), array('required' => 'Nie wpisano hasła.')),
  24.      'remember' => new sfValidatorBoolean(),
  25.    ));
  26.        
  27.  
  28.    $this->validatorSchema->setPostValidator(new sfGuardValidatorUser(array(), array('invalid' => 'Login lub hasło są niepoprawne')));
  29.    
  30.    $this->widgetSchema->setNameFormat('signin[%s]');
  31.  
  32.  }
  33.  
  34. }
  35. ?>



a plik sfGuardFormSignin.class.php z sf_sandbox\plugins\sfDoctrineGuardPlugin\lib\form\doctrine przywróciłem do poprzedniego stanu czyli:
  1. <?php
  2. class sfGuardFormSignin extends BasesfGuardFormSignin
  3. {
  4. }
  5. ?>


Ale jesli nie można by było modyfikowac tych plików w folderze plugina to po co by tworzyli plik sfGuardFormSignin.class.php w sf_sandbox\plugins\sfDoctrineGuardPlugin\lib\form\doctrine bez żadnych metod ? Przecież ten plik dziedziczący po BasesfGuardFormSignin bez żadnych metod sam skłania do napisania w nim metody gdy chcemy zmodyfikować formularz logowania. Ale może to co radzisz sprawia, że jest bardziej przejrzyście smile.gif

Dlaczego tworze widgety i walidatory ? Bo chcę mieć polskie nazwy w stylu: 'Twój login', 'Twoje hasło', 'Nie wpisano loginu', 'Login lub hasło są niepoprawne ...' itd.
Co w tym złego ? Moja metoda configure() z klasy pochodnej przysłania tę z klasy podstawowej - tak się robi w javie czy c++, w php nie ?

Przywróciłem też plik: C:\Program Files\WebServ\httpd\sf_sandbox\plugins\sfDoctrineGuardPlugin\modules\sfGuardAuth\templates\signinSuccess.php do poprzedniego stanu, a w httpd\sf_sandbox\apps\frontend\modules utworzyłem katalog sfGuardAuth/templates i w nim plik signinSuccess z wyświetlaniem formularza:
  1. <?php use_helper('I18N') ?>
  2.  
  3. <form action="<?php echo url_for('@sf_guard_signin') ?>" method="post">
  4.  <table>
  5.    <?php echo $form ?>
  6.  </table>
  7.  
  8.  <input type="submit" value="<?php echo __('Loguj') ?>" />
  9.  <a href="<?php echo url_for('@sf_guard_password') ?>"></a>
  10. </form>


Prosiłbym o wyjaśnienie jeśli można czemu źle robie tworząc na nowo widgety i walidatory i czy teraz zrobiłem wszystko ok ? smile.gif
destroyerr
Jeśli chodzi o plik: sf_sandbox\plugins\sfDoctrineGuardPlugin\lib\form\doctrine\BasesfGuardFormSignin.class.php
To zawiera wszystkie wymagane metody, natomiast w pliku sf_sandbox\plugins\sfDoctrineGuardPlugin\lib\form\doctrine\sfGuardFormSignin.class.php jest klasa, która jest wykorzystywana domyślnie jest ona potrzebna bo nie zawsze ktoś chce zmieniać działanie tego formularza.

W php przesłania się metody, nie ma żadnych problemów. Pytanie po co to robisz zadałbym nawet jak pisałbyś w javie czy c++. Metoda z klasy wyżej już zrobiła większość roboty, po co się wysilać winksmiley.jpg
  1. <?php
  2. class sfGuardFormSignin extends BasesfGuardFormSignin
  3. {
  4.    public function configure()
  5.    {
  6.        parent::configure();
  7.        
  8.        $this->validatorSchema['username']->setMessage('required', 'Nie wpisano loginu.');
  9.    }
  10. }
  11. ?>

Tak jest chyba prościej. Można to też zrobić korzystając z i18n, wtedy już nie musisz edytować formualrza.
nieraczek
parent::configure(); - no tak, wielkie dzięki smile.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.