Łączenie zapytań Zend_Db_Select w Zend Framework [cz. 2/2]

Konty­nu­ujemy temat zapy­tań z poprzed­niej części. Punk­tem wyjścia będzie dla nas tablica wyni­ków zapy­ta­nia dorzu­co­nego przeze mnie LEFT JOINA (w ramach aktu­ali­za­cji wpisu na samym dole poprzed­niej części). Aby nieco utrud­nić dorzu­ci­łem kolej­nych dwóch powszech­nie znanych idoli młodzieży: Anto­niego Macie­re­wi­cza i Stefana Niesio­łow­skiego, którzy dla odmiany nie będą mieli swoich ksywek. Ponadto doda­łem drugą ksywkę towa­rzy­szowi Tuskowi znanemu często na forach Onetu jako Rudy Oszust.

Reasu­mu­jąc: mamy poli­tyka z dwoma ksyw­kami, jednego z jedną i dwóch bez ksywek. Dążymy do tego aby wyświe­tlić na liście rozwi­ja­nej formu­la­rza ich wszyst­kich. Zarówno orygi­nalne imię i nazwi­sko jak i ksywkę. Co jednak zrobić, skoro ksywka i orygi­nalne imię i nazwi­sko posia­dają to samo id w bazie? Zamie­nimy je na unika­towe poprzez doda­nie jakie­goś dodatku po orygi­nal­nym id, np. 5–1, 5–2 itd.

Najpierw jednak stwo­rzymy super prosty formu­larz zawie­ra­jący pole wyboru typu select i przy­cisk zatwier­dza­jący zmiany. Potrze­bu­jemy klasy dzie­dzi­czą­cej po Zend_Form. Ja pracu­jąc w Zendzie zazwy­czaj formu­la­rze wrzu­cam do kata­logu forms równo­le­głego do control­lers, 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 wszyst­kich zabie­gach tablica $wyniki prze­ka­zy­wana do obiektu Zend_Form_Element_Select posiada nastę­pu­ją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 pozo­staje nam odebrać formu­larz. Żeby zbyt­nio nie kompli­ko­wać dane odbie­rzemy w kontro­le­rze IndexController w akcji indexAction(). Na przy­kł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że­cie zapy­tać po co nam ten _redirect. Otóż zabez­pie­cza nas przed ponow­nym wyświe­tle­niem użyt­kow­ni­kowi formu­la­rza i przed ewen­tu­al­nym ponow­nym wysła­niem danych.

Jeżeli za szybko z czymś poje­cha­łem, skła­dać zaża­le­nia w komentarzach :-)

Podobne wpisy:

  1. Łącze­nie zapy­tań Zend_Db_Select w Zend Frame­work [cz. 1/2]
  2. Zend Frame­work i podświe­tla­nie wybra­nego elementu menu
  3. Własny wali­da­tor w Zend Framework
  4. Zend_Date i Zend_Config w Zend Framework

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <p> <pre lang="" line="" escaped=""> <q cite=""> <strike> <strong>