Praca z formularzami II
W poprzedniej notce pokazałem jak zapisywać dane przy pomocy modułu Formation, dziś będziemy kontynuować poznawanie tego jakże przydatnego, a zarazem bardzo bluzgotwórczego modułu.
Modyfikacja frameworka
Przed rozpoczęciem pisania właściwej edycji danych musimy zmienić kilka rzeczy w frameworku. Po pierwsze musimy zmienić metodę __set modelu User. Odpowiada ona za automatyczna zamianę wprowadzonego hasła na hash.
application/models/user.php public function __set($key, $value) { if ($key === 'password' && !$value) return; parent::__set($key, $value); }
Dzięki powyższej zmianie Kohana nie będzie generowała hasha dla pustego hasła.
Kolejna zmiana dotyczy sposobu zapisu danych z formularza do bazy. Dzięki niej pola zdefiniowane w tablicy $disabled nie są brane pod uwagę podczas tworzenia zapytania UPDATE.
application/libraries/MY_Model_Formation.php <?php class Model_Formation extends Model_Formation_Core { public function save( $commit = true, $values = array( ) ) { if($values == array()) { $values = $_POST; } if($this->validate($values)) { //mod $fields = $this->as_array(); foreach( $this -> disabled as $field) { unset( $fields[ $field ] ); } $this->_model->populate($fields); //end mod if($commit==true) { return $this->_model->save(); } return $this->_model; } return false; } } ?>
Jak się okazało mimo umieszczania „wyłączonych” pól w zapytaniu, ich wartości pobierane są z modelu, a nie z tablicy POST tak więc nie ma możliwości ich zmiany.
Edycja danych
Teraz możemy się zając tworzeniem formularza edycji danych. Będzie on bazował na formularzu rejestracji – zmodyfikujemy w nim tylko reguły walidacji.
application/libraries/User_Form.php <?php class User_Form_Core extends Register_Form_Core { public function __construct( $model=false,$build=true ) { parent :: __construct( $model, $build ); $this[ 'Rejestruj' ] -> set_text( 'Zapisz' ); $this[ 'username' ] -> remove_callback( array( User_Model, '_unique_username' ) ); $this[ 'password' ] -> remove_rule( 'Rule_Required' ); $this[ 'password2' ] -> add_callback( array( $this, '_confirmPass' ) ); } public function _confirmPass( $field ) { if( $this[ 'password' ] -> get_value( ) != $this[ 'password2' ] -> get_value( ) ) $field -> add_error( 'Callback', Kohana :: lang( 'validation.rule_matches' ) ); } } ?>
Jak widać usunęliśmy reguły walidacji pola login, powodem tego jest brak możliwości zmiany nazwy użytkownika. Dodatkowo usunięta została konieczność podania hasła, dzięki czemu będziemy mogli zmienić sam adres e-mail bez konieczności podawania hasła. Dodany został również callback dla pola password2 sprawdzający czy hasła są identyczne – z jakiś dziwnych powodów reguła Rule_Matches nie chce działać.
Przejdźmy teraz do stworzenia kontrolera.
application/controllers/user.php <?php class User_Controller extends Home_Controller { public function __construct() { parent :: __construct( ); if( !$this -> auth -> logged_in( ) ) url :: redirect( '/' ); } public function edit( ) { $form = new User_Form( Session :: get( 'auth_user' ) ); if( !(bool)$this -> input -> post( ) ) $form[ 'password' ] -> set_value( '' ); if( $form -> save( ) ) Session :: instance( ) -> set_flash( 'flash', Kohana :: lang( 'user.edited' ) ); $this -> template -> content = View :: factory( 'user_edit', array( 'form' => $form ) ); } } ?>
Jedyną różnicą w stosunku do poprzedniej notki to przekazanie parametru podczas tworzenia formularza. Owy parametr to model, którego dane będziemy modyfikować. Dodatkowo kasujemy wartość pola password w chwili gdy nie przesłano do skryptu danych metoda post. Dzięki temu w formularzu nie będzie wyświetlany hash hasła.
Zobacz także:
- Dokumentacja modułu Formation
- Dokumentacja modułu ModelToForm
- Aktualny kod
Tagi: formation, formularze, Kohana, modeltoform
Kategoria: Kohana, Tutorial
1) „Przed rozpoczęciem pisanie” => Przed rozpoczęciem pisania
2) Ogólnie to fajnie. Pozdro!
thx :-)