Wspomniałem wcześniej że do rozpoczęcia pracy najpierw uczę się opanować obsługę frameworka. Wybranym frameworkiem jak pisałem wcześniej jest symfony. W wcześniejszym poście podałem również link do idealnego i chyba najlepszego kursu jaki jest dostępny o symfony czyli kursie joobet. Kurs jest bardzo klarowny i dobrze skonstruowany jednak chciałem poruszyć pewną kwestie w kursie a dokładnie chodzi o tworzenie formularzy.
Formularze w symfony składają się z trzech części:
- validation (walidatora) jest to zbiór klas przeznaczonych do sprawdzania wejścia czyli do sprawdzania poprawności danych wpisywanych do formularza.
- widget : jest to zbór klas których zadaniem jest umieszczenie odpowiednich pól formularza np ( textareea, select czy input).
- forms: klasa form reprezentuje formularz stworzony z widgetow i walidatorów oraz metod pomagających zarządzać formularzem. Każde pole formularza ma swój własny widget i validator.
W symfony formularz jest klasa zrobioną z pól. Każde z tych pól ma nazwe , walidator, widgeta. Przykładem prostego formularza może być następująca klasa.
class ContactForm extends sfForm
{
public function configure()
{
$this->setWidgets(array(
'email' => new sfWidgetFormInputText(),
'message' => new sfWidgetFormTextarea(),
));
$this->setValidators(array(
'email' => new sfValidatorEmail(),
'message' => new sfValidatorString(array('max_length' => 255)),
));
}
}
Pola formularza są konfigurowane w metodzie configore() poprzez używanie metod setValidators() oraz setWidgets().
Na przykładzie pola email wiać iż jest ono tworzone widgetem (sfWidgetFormInputText) oraz poprawność tego pola jest przeprowadzana poprzez validator (sfValidatorEmail).
Ponieważ symfony "wie" dokładnie wszytko na temat naszej bazy danych bazując na modelu bazy, moze on automatycznie stworzyć formularz na podstawie tego jakie pola znajdują się w naszej bazie danych. W symfony służy do tego polecenie php symfony doctrine:build --forms. Jednak większość użytkowników korzystających z tego frameworka użyła polecenie php symfony doctrine:build -all które zawiera poprzednie polecenie w sobie.
Polecenie to tworzy klase w katalogu lib/form. Każdy model klasy ma swój odpowiedni formularz. Znaczy to tyle iż dla instancji np mojprojekt zostanie utworzony formularz mojprojektForm który domyślnie jest pusty i dziedziczy z klasy bazowej.
Oczywiście możemy wyłączyć generowanie formularzy jeżeli nie potrzebujemy takiej możliwości. Należy w tym celu przejść do pliku yaml z schematem naszej bazy i dopisać następujące właściwości.
SomeModel:
options:
symfony:
form: false
filter: false
Jeżeli zdecydujemy się na wykorzystanie jednak automatycznie generowanych formularzy a chyba po to między innymi praujemy z frameworkami to może się okazać że nie chcemy aby wszystkie pola bazy danych były zawarte w formularzu. Np nie potrzebujemy pól takich jak "id" przynajmniej nie w formularzu.
Wiemy już ze aby konfigurować formularze musimy przejść do metody configure() zatem przejdźmy tam i dla przykładu pokaże tu kod usuwający z formularza 4 pola ( kod pobrany jest z kursu joobet).
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
unset(
$this['created_at'], $this['updated_at'],
$this['expires_at'], $this['is_activated']
);
}
}
Jest to wygodna i czytelna metoda usuwania pól w formularzu. Istnieje również możliwość podania po prostu które pola nas interesują i te pola zostaną tylko wyświetlone w formularzu. Możliwość taka przedstawiona zostanie poniżej.
class JobeetJobForm extends BaseJobeetJobForm
{
public function configure()
{
$this->useFields(array('category_id', 'type', 'company', 'logo', 'url', 'position', 'location', 'description', 'how_to_apply', 'token', 'is_public', 'email'));
}
}
Pola zawarte w tablicy to nazwy pół z bazy danych które mają zostać prze generowane na pola formularza.
Kolejną przydatną rzeczą jest ustawiania sprawdzania pól. Przykładowo jeżeli w schemacie pole email jest oznaczone jako varchar a my chcemy aby kolumna byla sprawdzana jako email to musimy w metodzie configure() dodać nastepująca linie.
public function configure()
{
// ...
$this->validatorSchema['email'] = new sfValidatorEmail();
}
Kto się zna na symfony to na pewno zauważy że jest tu jednak coś nie tak. No pewnie skoro ustawiamy nowy validator do pola email jako validator sfValidatorEmail() to tracimy te validatory ustawione domyślnie przez generator. Lepszym sposobem jest dodanie nowego walidatora do już istniejących. Aby to uczynić do metody configure dopisujemy np taki fragment kodu.
public function configure()
{
// ...
$this->validatorSchema['email'] = new sfValidatorAnd(array(
$this->validatorSchema['email'],
new sfValidatorEmail(),
));
}
Jeżeli pole w schemacie jest oznaczone jako varchar i chcemy ograniczyć to pole do listy wyborów przygotowanej przez nas to należny się posłużyć przykładem poniżej:
najpierw ustawiamy możliwe wartości w pliku xxxxxxTable.class. Przykład tu pobrany z kursu joobet.
class JobeetJobTable extends Doctrine_Table
{
static public $types = array(
'full-time' => 'Full time',
'part-time' => 'Part time',
'freelance' => 'Freelance',
);
public function getTypes()
{
return self::$types;
}
// ...
}
Następnie ustawiamy widgeta
$this->widgetSchema['type'] = new sfWidgetFormChoice(array(
'choices' => Doctrine_Core::getTable('JobeetJob')->getTypes(),
'expanded' => true,
));
To tyle. W wolnej chwili przygotuje jeszcze dalszy opis pracy z formularzami. Wybrałem ten temat ponieważ wydał mi się interesujący pyzatym na pewno wykorzystam te możliwości w swoim projekcie. W następnym Poście powrócę jeszcze do tej tematyki.