Laboratorium 7 Blog: dodawanie i edycja wpisów Dodawanie nowych wpisów Tworzenie formularza Za obsługę formularzy odpowiada klasa Zend_Form. Dla każdego formularza w projekcie tworzymy klasę dziedziczącą z Zend_Form. W ciele tej klasy określamy, z jakich pól ma się składać formularz, a także jakie reguły filtrowania i walidacji do nich zastosować. 1. W katalogu application stwórz nowy podkatalog o nazwie forms. 2. W katalogu forms umieść nowy plik o nazwie Wpis.php. 3. W pliku Wpis.php umieścimy klasę Blog_Form_Wpis, dziedziczącą z Zend_Form. Klasa ta będzie odpowiedzialna za obsługę formularza dodawania oraz edycji wpisu. Kod klasy Blog_Form_Wpis: <?php class Blog_Form_Wpis extends Zend_Form { public function init() { $this->setmethod('post'); $tytul = $this->createelement('text', 'tytul'); $this->addelement($tytul); $skrot = $this->createelement('textarea', 'skrot'); $this->addelement($skrot); $tresc = $this->createelement('textarea', 'tresc'); $this->addelement($tresc); $this->addelement('hidden', 'id'); $this->addelement('submit', 'Zapisz'); Akcja dodawania wpisów 1. Dodawanie wpisów będzie realizowane przez akcję dodaj w kontrolerze Index. Aby utworzyć nową akcję, wydaj komendę: zf create action dodaj Index 2. Otwórz plik IndexController.php. W metodzie dodajaction() umieść następujący kod: $form = new Blog_Form_Wpis(); Strona 1 z 6
$url = $this->getrequest()->getbaseurl(); $form->setaction($url. '/index/dodaj'); $this->view->form = $form; W pierwszej linii tworzony jest obiekt klasy Blog_Form_Wpis, czyli obiekt reprezentujący tworzony formularz. Następnie ustawiamy akcję, do której mają być przesłane dane wpisane przez użytkownika w formularzu (w wygenerowanym kodzie HTML wartość ta znajdzie się w atrybucie action elementu form). Dane mają zostać przesłane z powrotem do akcji dodaj. URL prowadzący do akcji dodaj ma postać: '/index/dodaj'. W ostatniej linii przekazujemy utworzony formularz do widoku. Wyświetlanie formularza 1. Utworzony w kontrolerze formularz należy wyświetlić w widoku. 2. Otwórz plik widoku odpowiadający akcji dodaj, czyli dodaj.phtml. Umieść w nim następujący kod: <h2>dodaj wpis</h2> <?php echo $this->form;?> Dodanie odnośnika na stronie głównej W szablonie strony umieściliśmy odnośnik o nazwie Dodaj wpis. Teraz pora uzupełnić adres, do którego ma on prowadzić. 1. Otwórz plik szablonu (layouts/scripts/layout.phtml). 2. Znajdź fragment wyświetlający odnośnik: <a href="">dodaj wpis</a> i podmień go na następujący kod: <a href="<?php echo $this->baseurl();?>/index/dodaj">dodaj wpis</a> 3. Sprawdź działanie nowej akcji otwórz stronę główną bloga, następnie kliknij na linku Dodaj wpis. Modyfikacja formularza etykiety oraz atrybuty Aby poprawić wygląd formularza, dodamy etykiety oraz ustawimy rozmiar pól tekstowych. 1. Otwórz plik z definicją formularza (forms/wpis.php). 2. Uzupełnij definicje pól formularza, dodając wywołanie metod setlabel() oraz setattribute(). Kompletny kod definiujący pola powinien wyglądać następująco: Strona 2 z 6
$this->setmethod('post'); $tytul = $this->createelement('text', 'tytul'); $tytul->setlabel('tytuł:'); $tytul->setattrib('size', 60); $this->addelement($tytul); $skrot = $this->createelement('textarea', 'skrot'); $skrot->setlabel('krótki opis:'); $skrot->setattribs(array('cols' => 60, 'rows' => 5)); $this->addelement($skrot); $tresc = $this->createelement('textarea', 'tresc'); $tresc->setlabel('pełna treść:'); $tresc->setattribs(array('cols' => 60, 'rows' => 25)); $this->addelement($tresc); $this->addelement('hidden', 'id'); $this->addelement('submit', 'Zapisz'); 3. Sprawdź wygląd formularza na stronie. Obsługa przesłanych danych i zapisanie wpisu do bazy 1. Dane wpisane w formularzu zostaną przesłane z powrotem do akcji dodaj. Należy zatem w metodzie dodajaction() sprawdzić, czy przesłano dane, a następnie zapisać je do bazy. 2. Dopisz do metody dodajaction() następujący kod: if($this->getrequest()->ispost()) { if($form->isvalid($_post)) { $dane = $form->getvalues(); unset($dane['id']); $dane['autor'] = 1; $mdl = new Blog_Model_Wpisy(); $mdl->insert($dane); $this->_redirect('index'); Poniżej wyjaśniono znaczenie poszczególnych instrukcji kodu. Sprawdzenie, czy przesłano już dane z formularza: if($this->getrequest()->ispost()) {... Strona 3 z 6
Sprawdzenie poprawności danych: if($form->isvalid($_post)) {... Wyciągnięcie danych z formularza: $dane = $form->getvalues(); Stworzenie instancji modelu i zapisanie danych do bazy: $mdl = new Blog_Model_Wpisy(); $mdl->insert($dane); Przekierowanie przeglądarki na stronę główną: $this->_redirect('index'); 3. Sprawdź działanie programu wypełnij formularz i dodaj wpis do bazy; sprawdź, czy wpis pojawi się na stronie głównej. Walidacja i filtrowanie danych W kodzie odbierającym dane z formularza użyliśmy metody isvalid(). Metoda ta sprawdza, czy dane wpisane przez użytkownika są poprawne i kompletne. Wymagania odnośnie wpisywanych danych można określić w klasie definiującej formularz. Dodamy teraz sprawdzenie, czy użytkownik wypełnił pole Tytuł, a także przefiltrujemy dane, usuwając z nich kod HTML. 1. Otwórz plik forms/wpis.php. Zaraz po utworzeniu elementu $tytul dodaj linijkę: $tytul->setrequired(true); Spowoduje to oznaczenie pola Tytuł jako wymaganego. Użytkownik nie będzie mógł zapisać danych, jeśli nie uzupełni tego pola. 2. Sprawdź działanie formularza kliknij Dodaj wpis, pozostaw pole Tytuł puste, spróbuj zapisać wpis. 3. Dane wpisane w formularzu mogą być także filtrowane. Użyjemy filtra Zend_Filter_StripTags, który usuwa znaczniki HTML z wpisanego tekstu. Dodaj do definicji pola Tytuł następującą linijkę: $tytul->addfilter(new Zend_Filter_StripTags()); 4. Sprawdź działanie filtra dodaj nowy wpis, w polu tytuł wpisując np.: Oto nowy <i>pochylony</i> <font color='red'>wpis</font> Strona 4 z 6
Edycja wpisów Do edycji wpisów użyjemy tego samego formularza Blog_Form_Wpis. Potrzebna będzie nowa akcja edytuj w kontrolerze Index. Działanie tej akcji będzie bardzo podobne do akcji dodaj, z następującymi zmianami: jako parametr przekażemy do akcji identyfikator wpisu, który chcemy edytować; wstępnie wypełnimy formularz danymi pobranymi z bazy; zamiast tworzenia nowego rekordu, zaktualizujemy już istniejący. 1. Stwórz akcję edytuj w kontrolerze Index: zf create action edytuj Index 2. Otwórz plik IndexController.php powinna tam się znaleźć automatycznie dodana metoda edytujaction(), którą wypełnimy teraz treścią. 3. Zaczniemy od pobrania parametru id, wskazującego na wpis, który chcemy edytować. Następnie pobierzemy właściwy wpis z bazy: $id = $this->getrequest()->getparam('id'); $mdl = new Blog_Model_Wpisy(); $wpis = $mdl->find($id)->current(); 4. W następnym kroku stworzymy obiekt formularza i przekażemy go do widoku: $form = new Blog_Form_Wpis(); $url = $this->getrequest()->getbaseurl(); $form->setaction($url. '/index/edytuj'); $this->view->form = $form; 5. Podobnie jak w metodzie dodajaction, sprawdzimy, czy przesłano już dane z formularza: jeśli tak, obsłużymy zapisanie wpisu do bazy, jeśli nie, wypełnimy formularz danymi wpisu pobranego z bazy. if($this->getrequest()->ispost()) { if($form->isvalid($_post)) { $dane = $form->getvalues(); $wpis->tytul = $dane['tytul']; $wpis->skrot = $dane['skrot']; $wpis->tresc = $dane['tresc']; $wpis->save(); $this->_redirect('index'); else { $form->populate($wpis->toarray()); Strona 5 z 6
W powyższym kodzie zamiast tworzyć nowy wiersz w tabeli, modyfikujemy wiersz pobrany wcześniej z bazy. Przepisujemy tytuł, skrót oraz treść wpisu z formularza do obiektu $wpis, następnie wywołujemy metodę save() metoda ta zapisze zmienione dane do bazy danych. Po zapisaniu danych przekierowujemy użytkownika na stronę główną. Metoda populate() powoduje wypełnienie formularza danymi. Jako argument przekazujemy jej tablicę z polami, które mają być wyświetlone w formularzu. W tym przypadku wyświetlamy rekord pobrany z bazy danych. 6. Utworzymy teraz widok dla akcji edytuj. Widok będzie niemal identyczny, jak w przypadku akcji dodaj wyświetli jedynie nagłówek oraz przekazany formularz. Otwórz plik edytuj.phtml i wypełnij go następującym kodem: <h2>edytuj wpis</h2> <?php echo $this->form;?> 7. Pozostało nam dodanie na stronie głównej linków do edycji wpisów. Otwórz widok index.phtml i dodaj do niego kod wyświetlający stosowny link (kod umieść po wyświetleniu skrótu wpisu, a przed wyświetleniem linka Więcej ): echo '<a href="'. $this->baseurl(). '/index/edytuj/id/'. $wpis->id. '">Edytuj</a> '; Tak utworzony link prowadzi do akcji edytuj w kontrolerze index, przekazując jej parametr id o wartości 5. 8. Sprawdź działanie programu. Przejdź na stronę główną i zmodyfikuj wybrany wpis. Zadanie. Usuwanie wpisów 1. Dodaj do aplikacji możliwość usuwania wpisów. Stwórz akcję usun w kontrolerze Index. W akcji usun wykonaj kolejno czynności: o pobierz id wpisu z parametrów żądania (jak w akcji edytuj); o Pobierz wpis o danym id z bazy (jak w akcji edytuj); o Na obiekcie reprezentującym wpis wywołaj metodą delete(): $wpis->delete(); o Przekieruj przeglądarkę na stronę główną. Na stronie głównej przy każdym wpisie umieść link Usuń. Strona 6 z 6