Kontynuujemy temat zapytań z poprzedniej części. Punktem wyjścia będzie dla nas tablica wyników zapytania dorzuconego przeze mnie LEFT JOINA (w ramach aktualizacji wpisu na samym dole poprzedniej części). Aby nieco utrudnić dorzuciłem kolejnych dwóch powszechnie znanych idoli młodzieży: Antoniego Macierewicza i Stefana Niesiołowskiego, którzy dla odmiany nie będą mieli swoich ksywek. Ponadto dodałem drugą ksywkę towarzyszowi Tuskowi znanemu często na forach Onetu jako Rudy Oszust.
Reasumując: mamy polityka z dwoma ksywkami, jednego z jedną i dwóch bez ksywek. Dążymy do tego aby wyświetlić na liście rozwijanej formularza ich wszystkich. Zarówno oryginalne imię i nazwisko jak i ksywkę. Co jednak zrobić, skoro ksywka i oryginalne imię i nazwisko posiadają to samo id w bazie? Zamienimy je na unikatowe poprzez dodanie jakiegoś dodatku po oryginalnym id, np. 5–1, 5–2 itd.
Najpierw jednak stworzymy super prosty formularz zawierający pole wyboru typu select i przycisk zatwierdzający zmiany. Potrzebujemy klasy dziedziczącej po Zend_Form. Ja pracując w Zendzie zazwyczaj formularze wrzucam do katalogu forms równoległego do controllers, models itd.
class PolitycyForm extends Zend_Form { public function init() { $this->setMethod('post'); // gdzie ma zostac wyslany formularz $this->setAction('/index/index'); // tutaj wstawić zapytanie // z aktualizacji wpisu poprzedniej czesci $stmt = $select1->query(); $rowset = $stmt->fetchAll(); $wyniki = array(); $counter = 1; foreach ($rowset as $row) { // tymczasowo kluczami staja sie wyniki zapytania, // a wartosciami id i kolejny numer $wyniki[$row['imie_nazwisko']] = $row['id'] . '-' . $counter++; // sprawdzamy czy ten ktos ma ksywke, // jezeli tak to dorzucamy do wynikow if ($row['ksywka'] != null) { $wyniki[$row['ksywka'] . ' (' . $row['imie_nazwisko'] . ')'] = $row['id']. '-' . $counter++; } } // nastepnie wszystko to sortujemy po kluczach // do poprawnego posortowania polskich znakow // uzywamy funkcji setlocale setlocale(LC_COLLATE, 'pl_PL.utf8'); ksort($wyniki, SORT_LOCALE_STRING); // i zamieniamy miejscami klucze z wartosciami $wyniki = array_flip($wyniki); $formElement = new Zend_Form_Element_Select('politycy'); $formElement->setRequired(true) // blokujemy tworzenie domyslnego walidatora // sprawdzajacego czy wynik jest w formie tablicy ->setRegisterInArrayValidator(false) ->setLabel('Wybierz swojego ulubionego polityka') ->setMultiOptions($wyniki) // sprawdzamy czy ktos nie robi psikusa ->addValidator(new Zend_Validate_Regex('/^[0-9]+\-[0-9]+$/')); $this->addElement($formElement); // dodajemy pole typu submit $this->addElement('submit','wybierz'); } }
Po wszystkich zabiegach tablica $wyniki przekazywana do obiektu Zend_Form_Element_Select posiada następującą strukturę:
array(7) { ["3-7"] => string(18) "Antoni Macierewicz" ["1-3"] => string(11) "Donald Tusk" ["2-6"] => string(31) "Jareczek (Jarosław Kaczyński)" ["2-5"] => string(20) "Jarosław Kaczyński" ["1-4"] => string(25) "Rudy Oszust (Donald Tusk)" ["1-2"] => string(27) "Słońce Peru (Donald Tusk)" ["4-8"] => string(20) "Stefan Niesiołowski" }
Teraz pozostaje nam odebrać formularz. Żeby zbytnio nie komplikować dane odbierzemy w kontrolerze IndexController w akcji indexAction(). Na przykład tak:
$politycyForm = new PolitycyForm(); if ($this->_request->isPost()) { $dane = $this->getRequest()->getPost(); if ($politycyForm->isValid($dane)) { // wyrzucamy szmelc po wlasciwym identyfikatorze $filtr = new Zend_Filter_PregReplace( array('match' => '/\-[0-9]+/', 'replace' => '')); $przefiltrowane = $filtr->filter($dane['politycy']); // wykonujemy dzialania na bazie danych // co wykracza poza ramy tego wpisu // zakladamy, ze istenieje akcja panel-uzytkownika return $this->_redirect('/index/panel-uzytkownika'); } else { // jezeli formularz nie przechodzi walidacji // to zostaje uzupelniony o wprowadzone poprzednio dane $politycyForm->populate($dane); } } // wyswietlamy formularz $this->view->politycy = $politycyForm;
Możecie zapytać po co nam ten _redirect. Otóż zabezpiecza nas przed ponownym wyświetleniem użytkownikowi formularza i przed ewentualnym ponownym wysłaniem danych.
Jeżeli za szybko z czymś pojechałem, składać zażalenia w komentarzach :-)


O autorze