Reklama: Wysokie zyski z Twojej strony www , DOŁĄCZ DO NAS

Stwórz profil

Musisz wpisać swoje imię
Musisz wpisać swoje nazwisko
Musisz wpisać poprawny e-mail
Musisz wpisać hasło (min. 8 znaków)
Musisz zaakceptować regulamin

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.
14.06.2010, 06:51

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.
14.06.2010, 08:17

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.
14.06.2010, 10:10

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.
14.06.2010, 13:34

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
15.06.2010, 14:51

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?
17.06.2010, 20:34

Temat: Formularze

U mnie zawsze warunek
if (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)?
17.07.2010, 12:04

Damian Ślimak Asani.pl - Systemy
informatyczne

Temat: Formularze

Napewno w $post masz ustawione zmienne username i password ?
17.07.2010, 12:44

Temat: Formularze

Jest ustawione, sprawdzałem. Hasło oczywiście niezahaszowane.
17.07.2010, 12:55

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');
}
}
17.07.2010, 13:53

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...
18.07.2010, 11:59

Temat: Formularze

Problem chyba właśnie w haszowaniu leży, bo podczas logowania
Auth::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
18.07.2010, 12:11

Damian Ślimak Asani.pl - Systemy
informatyczne

Temat: Formularze

Pokaz kod dodawania usera może przez przypadek podwójnie hashujesz hasło ?
18.07.2010, 19:22

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.
18.07.2010, 20:03

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
18.07.2010, 20:31

Michał Baniowski Programista PHP

Temat: Formularze

Zapraszam do przetestowania mojego modulu formularzy do Kohana3

http://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
19.07.2010, 02:09



Wyślij zaproszenie do