Laboratorium 7 – Blog: dodawanie i edycja wpisów
Transkrypt
Laboratorium 7 – Blog: dodawanie i edycja wpisów
Technologie programowania systemów internetowych
Laboratorium 7
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
Technologie programowania systemów internetowych
Laboratorium 7
$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
Technologie programowania systemów internetowych
Laboratorium 7
$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
Technologie programowania systemów internetowych
•
Laboratorium 7
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
Technologie programowania systemów internetowych
Laboratorium 7
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
Technologie programowania systemów internetowych
Laboratorium 7
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