Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

Praca z formularzami III

W dzisiejszej notce po raz kolejny, a zarazem ostatni będziemy mieli kontakt z formularzami. Jako ostatnie na celownik trafiły kontrolki uploadu oraz list.

SQL

Przed rozpoczęciem pracy z PHP musimy utworzyć nowe tabelki w bazie, które będą magazynowały informacje o dodawanych fotkach oraz ktegoriach.

CREATE TABLE `fotos` (
   `id` int(11) NOT NULL auto_increment,
   `user_id` int(11) unsigned NOT NULL,
   `name` varchar(50) NOT NULL,
   `desc` text NOT NULL,
   `address` varchar(70) NOT NULL,
   `file` varchar(70) NOT NULL,
   `reference` varchar(30) NOT NULL,
   `add` date NOT NULL,
   `cat_id` int(11) NOT NULL,
   PRIMARY KEY  (`id`),
   KEY `user_id` (`user_id`),
   KEY `cat_id` (`cat_id`)
);

ALTER TABLE `fotos`

ADD CONSTRAINT `fotos_ibfk_2`
FOREIGN KEY (`cat_id`) REFERENCES `cats` (`id`)
ON DELETE CASCADE,

ADD CONSTRAINT `fotos_ibfk_1`
FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
ON DELETE CASCADE;

CREATE TABLE `cats` (
   `id` int(11) NOT NULL auto_increment,
   `name` varchar(50) NOT NULL,
   PRIMARY KEY  (`id`)
);

Dodawanie fotek

Jak zwykle po dodaniu nowego modelu, z którego będzie generowany formularz musimy umieścić w nim reguły walidacji.

application/models/foto.php

protected $validate = array( 'name' => array( 'rules' => array( 'Rule_Required',
                                                         array( 'Rule_Length', array( 3, 50 ) ) ) ),
                             'file' => array( 'rules' => array( 'Rule_Upload_Required',
                                                         array( 'Rule_Upload_Allowed', array( 'gif', 'png', 'jpg', 'bmp' ) ) ,
                                                         array( 'Rule_Upload_Size', '1MB' ) ),
                                              'type' => 'upload' ),
                             'reference' => array( 'rules' => array( 'Rule_Required' ) ),
                             'cat_id'    => array( 'rules' => array( 'Rule_Digit' ) ) );

Większość powyższego kodu jest już nam znana, jedyną nowością jest pole file i trzy nowe reguły. Pierwsza z nich wymusza konieczność dodania fotki, druga określa dozwolone typy plików, trzecia zaś maksymalny rozmiar.

Dodatkowo zmodyfikujemy lekko dwie bazowe metody: __set( ) oraz save( ).

public function __set( $key, $value )
{
   if( $key == 'file' && empty( $value ) )
      return;

   if( $key == 'file' )
      $value = file :: filename( $value );

   parent :: __set( $key, $value );
}

public function save( )
{
   if( !$this -> id )
   {
      $this -> add = date( 'Y-m-d' );
      $this -> user_id = Session :: get( 'auth_user' ) -> id;
   }

   return parent :: save( );
}

Pierwsza z nich dodaje kontrolę pola file przechowującego ścieżkę do dodanego zdjęcia. Owa kontrola ma dwojakie zadanie. Po pierwsze uniemożliwia zapisanie pustej nazwy plik, dzięki temu podczas edycji danych zdjęcia (innych niż samo zdjęcie) nie tracimy nazwy pliku z bazy. Po drugie wyciąga ze ścieżki pliku samą nazwę, dzięki czemu w bazie nie trzymamy zbędnych danych.

Zadaniem modyfikacji funkcji save( ) jest dodanie daty zapisu zdjęcia oraz jej autora, jako że dane te nie przychodzą od użytkownika sami musimy je dodać. Dodatkowo zamykamy kod w warunek tak, aby był on wykonywany podczas tworzenia rekordu, a nie jego edycji.

Zajmijmy się teraz stworzeniem formularza. Zasadniczo nie będzie się on różnił od tych z poprzednich notek dlatego skoncentrujemy się na nowych rzeczach.

application/libraries/Foto_Form.php

public function __construct( $model=false,$build=true )
{
   parent :: __construct( $model, $build );

   $catsM = ORM :: factory( 'cat' ) -> find_all( );
   foreach( $catsM as $c )
   {
       $cat[ $c -> id ] = $c -> name;
   }

   $this -> add_element( 'dropdown', 'cat_id' ) -> set_screen_name( 'Kategoria: ' )
                                                -> add_rule( 'Rule_Digit' )
                                                -> set_options( $cat )
                                                -> set_order( 3 );
   // pozostały kod dodający tagi label + filtry
}

Powyższy kod pokazuje sposób wykorzystania kontrolki dropdown czyli listy rozwijanej. W pierwszym kroku pobieramy z bazy wszystkie kategorie, następnie przygotowujemy tablicę w której indeksami są id kategorii, wartościami zaś ich nazwy. Na końcu podpinamy utworzoną tablicę pod metodę set_options.

Modyfikacje ModelToForm

Tak samo jak w poprzednich notkach tak i w tej zmodyfikujemy lekko moduł ModelToForm. Tym razem zmienimy reguły walidacji plików. W katalogu application/libraries/ musimy stworzyć nowy katalogu rules, a w nim dwa pliki MY_Rule_Upload_Allowed.php oraz MY_Rule_Upload_Size.php. W obu dokonujemy tej samej modyfikacji.

public function is_valid($upload=null)
{
   if( empty( $upload[ 'name' ] ) )
      return true;

   return parent :: is_valid( $upload );
}

Nadpisanie powyższej metody umożliwi nam bezproblemową edycje danych zdjęcia. Powyższa modyfikacja sprawdza czy przesłany został plik, jeśli tak wykonywana jest walidacja w przeciwnym razie pole nie jest sprawdzane.


Tagi: , , ,
Kategoria: Kohana, Tutorial


Dodaj komentarz