Marek Bednarczuk Freelancer
Temat: Formularze
Cześć,słuchajcie, walczę z formularzami w KO3 i powiem wam, że tragedia. Może czegoś nie wiem, ale jak dla mnie to brakuje tutaj czegoś podobnego do Formo z dwójki.
Dodałem sobie do formy pole input i submit, ale po wysłaniu formularza i jego walidacji (błędnej) nie dość, że nie umiem się dobrać do błędów, to jeszcze mi nie zachowuje wartości wcześniej wysłanych.
public function action_zaloguj()
{
// Ustawienie widoku
$this->template->content = View::factory('public/konto/zaloguj');
// Sprawdzenie czy użytkownik jest już zalogowany
if (Auth::instance()->logged_in() != 0)
{
// użytkownik jest zalogowany
echo 'zalogowany';
}
// Instancja nowego użytkownika
$user = ORM::factory('user');
// sprawdzenie poprawności przesłanych danych
$post = $user->validate_create($_POST);
$post = $post->as_array();
// Sprawdzenie autentykacji
$status = $user->login($post);
// sprawdzenie czy dane z formularza są poprawne
if ($status)
{
echo 'poprawne';
}
else
{
echo 'złe';
// Pobranie błędów do wyświetlenia w widoku
$errors = $post->errors();
}
// Formularz logowania
$form = form::open();
$form .= form::label('username', 'Login:');
$form .= form::input('username', $post['username']);
$form .= form::label('password', 'Hasło:');
$form .= form::input('password');
$form .= form::submit('login', 'Zaloguj');
$form .= form::close();
$this->template->content->form = $form;
}
A tak mam to zrobione.
Michał
Płonka
Właściciel
Notifero,
programista PHP
Temat: Formularze
Niestety nie miałem kontaktu z KO3 więc nie pomogę. Chciałbym jednak zwrócić uwagę, iż korzystanie z helpera form powinno odbywać się w widoku, a nie w kontrolerze.Co do Formo dla KO3 - obiło mi się o oczy, że takowa wersja już jest (nie wiem w jakiej fazie, możliwe, że beta). Poszukaj więc.
Jeszcze wracając do problemu: podaj może kod metody login() w modelu użytkownika, możliwe, że tam leży problem.
Bartek B. PHP, SQL
Temat: Formularze
Kolega wyżej ma rację oczywiście co do umieszczenia - powinno być w widoku.Z kontrolera możesz np wysłać w postaci tablicy (obiektów) jakie pola mają się pojawić.
W kontrolerze walidujesz formularz a efekt przekazujesz do widoku i tam już komunikat.
Ideą MVC jest całkowite oddzielenie bazy kontrolerów i widoków.
Możesz stworzyć osobną funkcję, która zostanie wywołana przy walidacji, zwraca boola który przekazywany jest do widoku a tam już prosty if()
No i taka mała rada, jak nie możesz wychwycić błędu to proponuję na poszczególnych etapach dawać print_r lub var_dump potrafi to sporo pomóc.
Marek Bednarczuk Freelancer
Temat: Formularze
Funkcja Login jest funkcją z modułu Auth w KO3, tak więc tam jest ok.Zaś błędu nie umiem wyłapać nie w kodzie (xdebuga mam) ale nie umiem odczytać za bardzo tego co mi zwraca walidacja formularza np. za krótkie hasło, bo mi się wykrzacza kohana. Zgłosiłem dziś buga.
Damian
Ślimak
Asani.pl - Systemy
informatyczne
Temat: Formularze
Funkcja logowania ma budowępublic function login($username, $password, $remember = FALSE)
a ty podajesz tablice $post jako jej parametry dodatkowo używasz validate_create($_POST); co raczej odnosi się do walidacji formularza podczas rejestracji użytkownika a nie jego logowania.
P.S Znalazłem w moim pierwszym projekcie kod odpowiedzialny za logowanie i modyfikacje użytkownika
public function action_signin() {
$this->template->content = View::factory('admin/user/signin')
->bind('errors', $errors)
->bind('post', $post);
if ($_POST) {
$auth = Auth::instance();
if ($auth->login($_POST['username'], $_POST['password'])) {
Request::instance()->redirect('admin/show/index');
} else {
$errors = array('login error');
}
}
}
public function action_profil() {
$this->template->content = View::factory('admin/user/profil')
->bind('errors', $errors)
->bind('post', $post);
if ($_POST) {
$user = Auth::instance()->get_user();
$post = $user->validate_change($_POST);
if ($post->check()) {
if ($post['email'] != '')
$user->email = $post['email'];
if ($post['password'] != '')
$user->password = $post['password'];
$user->save();
}else {
$errors = $post->errors('ee');
}
}
}
Damian Ślimak edytował(a) ten post dnia 15.06.10 o godzinie 14:51
Marek Bednarczuk Freelancer
Temat: Formularze
Przepasowałem trochę kod. Ale powiedzcie mi może, czy macie napisany dla własnych potrzeb jakieś funkcje generujące formularze czy pracujecie na czystym zapisie form::input() itp?Czy możecie się pochwalić plikami widoków, jak w nich wyświetlacie formularze i błędy ich obsługi?
Ja właśnie się zastanawiam jakby tutaj napisać jakieś proste funkcje odwalające za mnie robotę. Wysłał bym funkcję pokaz_formularz(array $konfiguracja) i byłoby po sprawie, ale po co to pisać, jeśli ktoś może ma i się podzieli?
Krzysztof Kozłowski na web na shyje
Temat: Formularze
U mnie zawsze warunekif (ORM::factory('user')->login($post)) {...} jest niespełniony, a $post to oczywiście $_POST. W czym może leżeć problem w takim logowaniu (rejestracja działa bez zarzutu i userów z rolami do bazy dodaje)?
Damian
Ślimak
Asani.pl - Systemy
informatyczne
Temat: Formularze
Napewno w $post masz ustawione zmienne username i password ?
Krzysztof Kozłowski na web na shyje
Temat: Formularze
Jest ustawione, sprawdzałem. Hasło oczywiście niezahaszowane.
Damian
Ślimak
Asani.pl - Systemy
informatyczne
Temat: Formularze
W sumie to nie wiem czemu oparłeś się przez logowanie przez usera jak to bardzo łatwo robi się przez auth. Spróbuj tak
if ($_POST) {
$auth = Auth::instance();
if ($auth->login($_POST['username'], $_POST['password'])) {
Request::instance()->redirect('admin/user/index');
} else {
//Helper_Asn_Flasher::add('Login error', 'error', 'user');
}
}
Krzysztof Kozłowski na web na shyje
Temat: Formularze
Damian Ślimak:
W sumie to nie wiem czemu oparłeś się przez logowanie przez usera jak to bardzo łatwo robi się przez auth. Spróbuj tak
if ($_POST) {
$auth = Auth::instance();
if ($auth->login($_POST['username'], $_POST['password'])) {
Request::instance()->redirect('admin/user/index');
} else {
//Helper_Asn_Flasher::add('Login error', 'error', 'user');
}
}
to samo, zawsze do else'a wędruje - tak jakby rzeczywiście za każdym razem login lub hasło było błędne. wygląda na to, że problem jest gdzie indziej: porównywanie wpisanych danych w tym co w bazie? haszowanie? na razie szukam...
Krzysztof Kozłowski na web na shyje
Temat: Formularze
Problem chyba właśnie w haszowaniu leży, bo podczas logowaniaAuth::instance()->hash_password($_POST['password'])zwraca innego hasha, niż ten który jest w bazie. Pytanie więc jak się do tego ma konfig z /modules/auth/config/auth.php? Dlaczego
ORM::factory('user')->save() generuje innego hasha, niż ten, którego spodziewa się podczas logowania?Po ręcznej edycji bazy i wpisaniu takiego hasha jakiego generuje Auth::instance()->hash_password($_POST['password']) logowanie przebiega oczywiście bez problemu.Krzysztof Kozłowski edytował(a) ten post dnia 18.07.10 o godzinie 12:14
Damian
Ślimak
Asani.pl - Systemy
informatyczne
Temat: Formularze
Pokaz kod dodawania usera może przez przypadek podwójnie hashujesz hasło ?
Krzysztof Kozłowski na web na shyje
Temat: Formularze
Damian Ślimak:
Pokaz kod dodawania usera może przez przypadek podwójnie hashujesz hasło ?
Też o tym myślałem i faktycznie w gąszczu kolejno wykonywanych skryptów pojawiło się haszowanie hasła przed dodaniem usera, które stosuje swoje haszowanie. Tak więc problem rozwiązany i zmagam się już jedynie z tym dlaczego po dodaniu usera kodem:
if ($user->save() AND $user->add('roles', ORM::factory('role', array('name'=>'login')))) {
Auth::instance()->login($username, $password);
$this->request->redirect('index');
}użytkownik dodaje się i loguje prawidłowo, natomiast jeżeli dodawany jest użytkownik w innej roli:
if ($user->save() AND $user->add('roles', ORM::factory('role', array('name'=>'admin')))) {
Auth::instance()->login($username, $password);
$this->request->redirect('index');
}to jest on dodawany do bazy, ale nie sposób się nim zalogować.
Dzięki za podsuwanie wcześniej kolejnych pomysłów.
Krzysztof Kozłowski na web na shyje
Temat: Formularze
Przyczynę ostatniego też już chyba właśnie znalazłem, w pliku /modules/auth/classes/kohana/auth/orm.php, funkcja _login():if ($user->has('roles', ORM::factory('role', array('name' => 'login'))) AND $user->password === $password) {...}Czyli tylko użytkownicy w roli "login" mogą się logować. Swoją drogą dlaczego admin nie może się tym samym sposobem zalogować?Krzysztof Kozłowski edytował(a) ten post dnia 18.07.10 o godzinie 20:35
Michał Baniowski Programista PHP
Temat: Formularze
Zapraszam do przetestowania mojego modulu formularzy do Kohana3http://michalbaniowski.pl/2010/02/14/modul-formularzy-...
notka jest stara, w miedzyczasie dodalem funkcje add_group(), dokumentacji narazie nie ma wiec trzeba kod poczytac...Michał Baniowski edytował(a) ten post dnia 19.07.10 o godzinie 02:14
