Kilka miesięcy temu popełniłem wpis na temat wielostronicowych formularzy, zaprezentowałem tam m. in. mój plugin do symfony, który tą funkcjonalność automatyzuje. Udostępniłem go niedawno w zbiorze pluginów symfony, znajduje się on tutaj. Między czasie został on zrefaktorowany i zostały dodane nowe klasy.
Wprowadzenie
Główną klasą tego pluginu jest
psPageableForm
, hermetyzuje ona zarządzanie formularzami. Klasa ta ma podobny interfejs co klasa sfForm, jednakże nie rozszerza jej z tego powodu, gdyż zbyt wiele metod musiałoby być unieważnionych. Podstawowymi metodami klasy wielostronicowego formularza to:
psPageableForm::addForm(sfForm)
- dodanie formularza na koniec listy (formularz zostaje skojarzony z ostatnią stroną)
psPageableForm::setForm(sfForm, int)
- dodanie formularza na określoną stronę, formularze ze stron wyższych bądź równych stronie podanej jako argument zostają przesunięte o jedną pozycję dalej.
psPageableForm::setUseGlobalNamespace(bool)
- czy format poszczególnych formularzy składowych ma zostać spłaszczony do jednego wymiaru, czy też format wielostronicowego formularza oraz formularzy składowych mają zostać połączone ze sobą. Domyślna jest ta pierwsza opcja. Należy wywołać przed dodaniem pierwszego formularza składowego!
psPageableForm::setNameFormat(string)
- ustawia format nazw widgetów wielostronicowego formularza. Należy wywołać przed dodaniem pierwszego formularza składowego!
psPageableForm::setCurrentPageNumber(int)
- ustawienie obecnej strony formularza
psPageableForm::getCurrentPageNumber()
- pobranie obecnej strony formularza
psPageableForm::bind(array, array)
- wypełnienie formularza danymi oraz jego walidacja
psPageableForm::isValid()
- sprawdzenie czy wszystkie zwalidowane formularze są prawidłowe, nie oznacza że formularz jest w całości poprawny
psPageableForm::getCurrentForm()
- pobranie obiektu formularza składowego skojarzonego z obecną stroną
psPageableForm::setPersistanceStrategy(psPageableFormPersistanceStrategy)
- ustawienie strategii trwałości
Istnieje również interfejs strategii trwałości, który deklaruje trzy metody:
psPageableFormPersistanceStrategy::persist(psPageableForm)
- zapisanie formularza do źródła danych
psPageableFormPersistanceStrategy::getValues()
- pobranie zapisanych wartości formularza
psPageableFormPersistanceStrategy::clear()
- wyczyszczenie obiektu
Na dzień dzisiejszy są trzy implementacje tego interfejsu:
psPageableFormPostPersistanceStrategy
- przechowuje wartości w ukrytych polach formularza
psPageableFormSessionPersistanceStrategy
- przechowuje wartości w sesji
psPageableFormDatabasePersistanceStrategy
- przechowuje wartości w bazie danych (wykorzystanie Doctrine)
Ostatnią klasą jest
psPageableFormProcess
, która automatyzuje przetwarzanie formularza, dba o odpowiednie ustawianie numerów stron podczas niepoprawnej walidacji oraz o odpowiedni stan formularza. Jedyną jej metodą (oprócz konstruktora) to metoda
psPageableFormProcess::process()
, która to w odpowiedni sposób przetwarza formularz. Dzięki tej klasie kod w kontrolerze jest zredukowany do minimum.
Przykład
Utworzenie wielostronicowego formularza sprowadza się do utworzenia kilku zwykłych formularzy symfony - jeden formularz na jedną stronę. Następnie definiujemy podklasę
psPageableForm
.
[PHP]- class PageableForm extends psPageableForm
- {
- public function setup()
- {
- $this->setNameFormat('form[%s]');
- $this->setUseGlobalNamespace(false);
-
- //wyłączenie ochrony csrf dla wszystkich formularzy z wyjątkiem ostatniego
- $form1 = new Form1(array(), array(), false);
- $this->addForm($form1);
-
- $form2 = new Form2(array(), array(), false);
- $this->addForm($form2);
-
- $form3 = new Form3();
- $this->addForm($form3);
- }
- }
W kontrolerze tworzymy obiekt zdefiniowanej klasy, ustawiamy strategię trwałości, tworzymy obiekt klasy psPageableFormProcess
z odpowiednimi parametrami oraz wywołujemy metodę psPageableFormProcess::process()
.
[PHP]- public function executeProcess(sfWebRequest $request)
- {
- $form = new PageableForm();
- $form->setPersistanceStrategy(new psPageableFormSessionPersistanceStrategy($this->getUser()));
- $process = new psPageableFormProcess($form, $request, function(){
- // funkcja zwrotna wywoływana gdy formularz zostanie w całości poprawnie zwalidowany
- }, array('formParameterName' => 'form')
- );
- $process->process();
- $this->form = $form;
- }
W szablonie wyświetlamy formularz z obecnej strony.
[PHP]- <form action="<?php echo url_for('module/action?step='.($form->getCurrentPageNumber() + 1)) ?>" method="post">
- <?php echo $form->getCurrentForm() ?>
-
- <?php if($form->getCurrentPageNumber() > 1): ?>
- <a href="?step=<?php echo $form->getCurrentPageNumber() ?>">Wróć</a>
- <?php endif; ?>
- <input type="submit" value="dalej" />
- </form>
Więcej przykładów z kodem źródłowym znajdziecie tutaj.
Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Zwiń
Czytaj na blogu autora...