1. Parametry widoku i klasy abstrakcyjne
  2. Metody używane w widoku
  3. Zagnieżdżanie widoków

Na poprzedniej lekcji, przy omawianiu kontrolerów wspomnieliśmy o widokach, a w szczególności o widoku natywnym kontrolera. Na dzisiejszej lekcji przybliżymy sobie dokładniej pojęcie widoku, jego działanie i sposób definiowania. Jak już wiemy, framework APEL generuje strony html w oparciu o mechanizm szablonów smarty. Nie będziemy go tutaj opisywać - dokładny opis tego mechanizmu możemy znaleźć na stronie http://www.smarty.net/. Definicje szablonów (co też już omawialiśmy) znajdują się w katalogu front/skin/default/templates/. Co więc trzeba do napisania własnego widoku?

Parametry widoku i klasy abstrakcyjne

Do poprawnego zdefiniowania widoku potrzebny jest nam tylko jeden parametr. Nazywa się on $template i jest to nazwa szablonu smarty który dany widok będzie generował. Jeśli szablon nie jest zdefiniowany bezpośrednio w katalogu templates tylko po drodze są jakieś podkatalogi, musimy podać do niego ścieżkę. Przy nazwie szablonu pomijamy rozszerzenie pliku (.tpl).

Potrzebna jest nam jeszcze definicja funkcji init(). W niej umieszczamy kod potrzebny do przygotowania danego fragmentu strony. Nie będzie błędem pozostawienie tej metody pustej, i powierzenie przygotowania kontrolerowi, ale może to prowadzić do nadmiernej rozbudowy kontrolera, jak również konieczności wielokrotnego powtarzania kodu, zwłaszcza gdy widoku używamy więcej niż raz. Najprościej ten problem wyjaśnić na przykładzie:

Załóżmy że widok zawiera element <select> w postaci listy rozwijanej. Wybrany element jest przekazywany przez parametr selectedOption i selectedOption2. Możemy więc zostawić metodę init() w widoku pustą i wszystko przerzucić do kontrolera, wtedy kod kontrolera i widoku będzie wyglądał tak: (przyjmujemy że widok będzie użyty w dwóch metodach kontrolera: show_1() i show_2()

/**
  * kontroler
  */
	....
  public function show() {
	$options = array (
		'1' => 'jeden',
		'2' => 'dwa',
		'3' => 'trzy'
	);
	$show = $this->addShow('show_main');
	$opt = $this->get('selectedOption');
	$show->assign('options',$options);
	$show->assign('selectedOptions',$opt);
  }
	.....
  public function show_2() {
	$options = array (
		'1' => 'jeden',
		'2' => 'dwa',
		'3' => 'trzy'
	);
	$show = $this->addShow('show_main');
	$opt = $this->get('selectedOption2');
	$show->assign('options',$options);
	$show->assign('selectedOptions',$opt);
  }
	.........	 /**
  * widok
  */	
  public function init() {
  }

Jak widzimy cały kod musieliśmy powtórzyć dwukrotnie. Teraz to co jest niezmienne przerzućmy do widoku. Wtedy kod będzie wyglądał tak:

/**
  * kontroler
  */
	....
  public function show() {
	$show = $this->addShow('show_main');
	$opt = $this->get('selectedOption');
	$show->assign('selectedOptions',$opt);
  }
	.....
  public function show_2() {
	$show = $this->addShow('show_main');
	$opt = $this->get('selectedOption2');
	$show->assign('selectedOptions',$opt);
  }
	.........	 /**
  * widok
  */	
  public function init() {
	$options = array (
		'1' => 'jeden',
		'2' => 'dwa',
		'3' => 'trzy'
	);
	$this->assign('options',$options);
  }

Jak widać można zaoszczędzić sobie sporo pisania.

Metody używane w widoku

Predefiniowane metody używane w widoku to:

  • assign(param_name,param_value)
  • addMngr('mngr_name')
  • addShow('show_name','position')
  • initPosition('position')

assign jest to tak naprawdę metoda z mechanizmu smarty, nie wymaga więc opisu; addMngr i addShow działają identycznie jak w przypadku kontrolera, natomiast metoda initPosition jest odpowiedzialna za inicjalizację pozycji position. O co chodzi z tą inicjalizacją dowiemy się za chwilę.

Zagnieżdżanie widoków

Jak już wiemy, kontroler ma za zadanie poskładać z widoków kompletną stronę html. Polega to na tym, że “zbiera” od różnych widoków fragmenty wygenerowanego kodu i umieszcza w swym widoku natywnym. Aby mógł to zrobić w szablonie widoku natywnego musimy określić pozycje na których będą się znajdować te fragmenty kodu. Nie są one niczym innym jak zmiennymi smarty. Dodając do widoku, bądź kontrolera kolejny widok musimy określić jego pozycję. W przypadku gdy tego nie zrobimy system automatycznie przypisuje mu pozycję “main”. Gdy będziemy chcieli na jednej pozycji dodać kilka widoków, będą one “sklejone” w kolejności dodawania. Może się zdarzyć że mamy zdefiniowaną w szablonie pozycję, ale żaden widok nie zostanie jej przypisany. Nie jest to dużym problemem dla PHP, ale z uwagi na bardzo rygorystyczną kontrolę błędów we frameworku, otrzymamy wyjątek. Aby się on nie pokazał należy użyć wspomnianej wcześniej metody initPosition. Spowoduje ona zainicjowanie pozycji na pustą wartość i dzięki temu nie otrzymamy komunikatu o błędzie. Ponieważ kolejne widoki można dodawać bezpośrednio w innym widoku, można je w sobie zagnieżdżać praktycznie do dowolnej głębokości.

Ponieważ wiemy już jak tworzyć widoki możemy rozwinąć naszą testową aplikację. Poprzednio stanęliśmy na definicji kontrolera. Teraz zdefiniujmy jego widok natywny. W kontrolerze zapisaliśmy, że nazywa się on show_main. Tworzymy więc plik front/system/show/main.php i wypełniamy go treścią. Od razu zakładamy że szablon będzie znajdował się w pliku front/skin/default/templates/main.tpl

/**
 * widok natywny dla kontrolera ctrl_main
 */
class show_main extends ap_show implements iface_show {

	protected $template = 'main';

	public function init() {

	}
}

Pozostało nam wypełnić szablon main.tpl. Zróbmy to np. w taki sposób:

<html>
<head>
<title>
Moja pierwsza strona APEL
</title>
</head>
<body>
{$main}
</body>
</html>

Jak widać zdefiniowaliśmy jedną pozycję o nazwie main. Szablon nie wymaga żadnych dodatkowych danych więc funkcję init() możemy pozostawić pustą.

W tym momencie umiemy już definiować kontrolery i widoki, co jest wystarczającą wiedzą do stworzenia strony powitalnej naszego systemu. Co trzeba więc zrobić?

  • po pierwsze: stworzyć widok z tekstem strony powitalnej
  • po drugie: dodać ten widok w kontrolerze

A więc do dzieła: zaczynamy od widoku:

/**
 * widok z tekstem strony powitalnej
 */
class show_welcome extends ap_show implements iface_show {

	protected $template = 'welcome';

	public function init() {

	}
}
 

Zapisujemy go w pliku front/system/show/welcome.php

Teraz tworzymy plik front/skin/default/templates/welcome.tpl i zapisujemy w nim tekst powitania. W naszym wypadku wystarczy

Witam w mojej pierwszej aplikacji napisanej przy użyciu frameworka APEL
 

Teraz dodajemy widok w kontrolerze ctrl_main. Robimy to w ten sposób

....
public function show() {
	$show = $this->addShow('show_welcome','main');
}
 

Jeśli niczego nie zepsuliśmy po wejściu na stronę główną naszego serwisu powinna ukazać się nam nasza strona powitalna.

<<< Kontroler - Baza danych >>>

Widok

Etc..

All Wiki Pages

Widok is a public wiki page

This wiki page is a public wiki page. It can be read by anyone including users that have not logged in and web crawlers such as Google.

Entry has no comments

You do not have sufficient permissions to comment

1 year ago
psiwik picture
psiwik updated Wiki Widok

Text: {toc} p. Na poprzedniej lekcji, przy omawianiu kontrolerów wspomnieliśmy o widokach, a w szczególności o widoku natywnym kontrolera. Na dzisiejszej lekcji przybliżymy sobie dokładniej pojęcie widoku, jego działanie i sposób definiowania. Jak już wiemy, framework APEL generuje strony html w oparciu o mechanizm szablonów smarty. Nie będziemy go tutaj opisywać - dokładny opis tego mechanizmu możemy znaleźć na stronie http://www.smarty.net/. Definicje szablonów (co też już omawialiśmy) znajdują się w katalogu front/skin/default/templates/. Co więc trzeba do napisania własnego widoku? h3. Parametry widoku i klasy abstrakcyjne p. Do poprawnego zdefiniowania widoku potrzebny jest nam tylko jeden parametr. Nazywa się on @$template@ i jest to nazwa szablonu smarty który dany widok będzie generował. Jeśli szablon nie jest zdefiniowany bezpośrednio w katalogu templates tylko po drodze są jakieś podkatalogi, musimy podać do niego ścieżkę. Przy nazwie szablonu pomijamy rozszerzenie pliku (.tpl). p. Potrzebna jest nam jeszcze definicja funkcji @init()@. W niej umieszczamy kod potrzebny do przygotowania danego fragmentu strony. Nie będzie błędem pozostawienie tej metody pustej, i powierzenie przygotowania kontrolerowi, ale może to prowadzić do nadmiernej rozbudowy kontrolera, jak również konieczności wielokrotnego powtarzania kodu, zwłaszcza gdy widoku używamy więcej niż raz. Najprościej ten problem wyjaśnić na przykładzie: p. Załóżmy że widok zawiera element <select> w postaci listy rozwijanej. Wybrany element jest przekazywany przez parametr @selectedOption@ i @selectedOption2@. Możemy więc zostawić metodę init() w widoku pustą i wszystko przerzucić do kontrolera, wtedy kod kontrolera i widoku będzie wyglądał tak: (przyjmujemy że widok będzie użyty w dwóch metodach kontrolera: @show_1()@ i @show_2()@ pre.. /** * kontroler */ .... public function show() { $options = array ( '1' => 'jeden', '2' => 'dwa', '3' => 'trzy' ); $show = $this->addShow('show_main'); $opt = $this->get('selectedOption'); $show->assign('options',$options); $show->assign('selectedOptions',$opt); } ..... public function show_2() { $options = array ( '1' => 'jeden', '2' => 'dwa', '3' => 'trzy' ); $show = $this->addShow('show_main'); $opt = $this->get('selectedOption2'); $show->assign('options',$options); $show->assign('selectedOptions',$opt); } ......... /** * widok */ public function init() { } p. Jak widzimy cały kod musieliśmy powtórzyć dwukrotnie. Teraz to co jest niezmienne przerzućmy do widoku. Wtedy kod będzie wyglądał tak: pre.. /** * kontroler */ .... public function show() { $show = $this->addShow('show_main'); $opt = $this->get('selectedOption'); $show->assign('selectedOptions',$opt); } ..... public function show_2() { $show = $this->addShow('show_main'); $opt = $this->get('selectedOption2'); $show->assign('selectedOptions',$opt); } ......... /** * widok */ public function init() { $options = array ( '1' => 'jeden', '2' => 'dwa', '3' => 'trzy' ); $this->assign('options',$options); } p. Jak widać można zaoszczędzić sobie sporo pisania. h3. Metody używane w widoku p. Predefiniowane metody używane w widoku to: * @assign(param_name,param_value)@ * @addMngr('mngr_name')@ * @addShow('show_name','position')@ * @initPosition('position')@ p. @assign@ jest to tak naprawdę metoda z mechanizmu smarty, nie wymaga więc opisu; @addMngr@ i @addShow@ działają identycznie jak w przypadku kontrolera, natomiast metoda @initPosition@ jest odpowiedzialna za inicjalizację pozycji @position@. O co chodzi z tą inicjalizacją dowiemy się za chwilę. h3. Zagnieżdżanie widoków p. Jak już wiemy, kontroler ma za zadanie poskładać z widoków kompletną stronę html. Polega to na tym, że "zbiera" od różnych widoków fragmenty wygenerowanego kodu i umieszcza w swym widoku natywnym. Aby mógł to zrobić w szablonie widoku natywnego musimy określić pozycje na których będą się znajdować te fragmenty kodu. Nie są one niczym innym jak zmiennymi smarty. Dodając do widoku, bądź kontrolera kolejny widok musimy określić jego pozycję. W przypadku gdy tego nie zrobimy system automatycznie przypisuje mu pozycję "main". Gdy będziemy chcieli na jednej pozycji dodać kilka widoków, będą one "sklejone" w kolejności dodawania. Może się zdarzyć że mamy zdefiniowaną w szablonie pozycję, ale żaden widok nie zostanie jej przypisany. Nie jest to dużym problemem dla PHP, ale z uwagi na bardzo rygorystyczną kontrolę błędów we frameworku, otrzymamy wyjątek. Aby się on nie pokazał należy użyć wspomnianej wcześniej metody @initPosition@. Spowoduje ona zainicjowanie pozycji na pustą wartość i dzięki temu nie otrzymamy komunikatu o błędzie. Ponieważ kolejne widoki można dodawać bezpośrednio w innym widoku, można je w sobie zagnieżdżać praktycznie do dowolnej głębokości. p. Ponieważ wiemy już jak tworzyć widoki możemy rozwinąć naszą testową aplikację. Poprzednio stanęliśmy na definicji kontrolera. Teraz zdefiniujmy jego widok natywny. W kontrolerze zapisaliśmy, że nazywa się on show_main. Tworzymy więc plik @front/system/show/main.php@ i wypełniamy go treścią. Od razu zakładamy że szablon będzie znajdował się w pliku @front/skin/default/templates/main.tpl@ pre.. /** * widok natywny dla kontrolera ctrl_main */ class show_main extends ap_show implements iface_show { protected $template = 'main'; public function init() { } } p. Pozostało nam wypełnić szablon @main.tpl@. Zróbmy to np. w taki sposób: pre.. <html> <head> <title> Moja pierwsza strona APEL </title> </head> <body> {$main} </body> </html> p. Jak widać zdefiniowaliśmy jedną pozycję o nazwie *main*. Szablon nie wymaga żadnych dodatkowych danych więc funkcję @init()@ możemy pozostawić pustą. p. W tym momencie umiemy już definiować kontrolery i widoki, co jest wystarczającą wiedzą do stworzenia strony powitalnej naszego systemu. Co trzeba więc zrobić? * po pierwsze: stworzyć widok z tekstem strony powitalnej * po drugie: dodać ten widok w kontrolerze p. A więc do dzieła: zaczynamy od widoku: pre.. /** * widok z tekstem strony powitalnej */ class show_welcome extends ap_show implements iface_show { protected $template = 'welcome'; public function init() { } } p. Zapisujemy go w pliku @front/system/show/welcome.php@ p. Teraz tworzymy plik @front/skin/default/templates/welcome.tpl@ i zapisujemy w nim tekst powitania. W naszym wypadku wystarczy pre.. Witam w mojej pierwszej aplikacji napisanej przy użyciu frameworka APEL p. Teraz dodajemy widok w kontrolerze @ctrl_main@. Robimy to w ten sposób pre.. .... public function show() { $show = $this->addShow('show_welcome','main'); } p. Jeśli niczego nie zepsuliśmy po wejściu na stronę główną naszego serwisu powinna ukazać się nam nasza strona powitalna.{toc} p. Na poprzedniej lekcji, przy omawianiu kontrolerów wspomnieliśmy o widokach, a w szczególności o widoku natywnym kontrolera. Na dzisiejszej lekcji przybliżymy sobie dokładniej pojęcie widoku, jego działanie i sposób definiowania. Jak już wiemy, framework APEL generuje strony html w oparciu o mechanizm szablonów smarty. Nie będziemy go tutaj opisywać - dokładny opis tego mechanizmu możemy znaleźć na stronie http://www.smarty.net/. Definicje szablonów (co też już omawialiśmy) znajdują się w katalogu front/skin/default/templates/. Co więc trzeba do napisania własnego widoku? h3. Parametry widoku i klasy abstrakcyjne p. Do poprawnego zdefiniowania widoku potrzebny jest nam tylko jeden parametr. Nazywa się on @$template@ i jest to nazwa szablonu smarty który dany widok będzie generował. Jeśli szablon nie jest zdefiniowany bezpośrednio w katalogu templates tylko po drodze są jakieś podkatalogi, musimy podać do niego ścieżkę. Przy nazwie szablonu pomijamy rozszerzenie pliku (.tpl). p. Potrzebna jest nam jeszcze definicja funkcji @init()@. W niej umieszczamy kod potrzebny do przygotowania danego fragmentu strony. Nie będzie błędem pozostawienie tej metody pustej, i powierzenie przygotowania kontrolerowi, ale może to prowadzić do nadmiernej rozbudowy kontrolera, jak również konieczności wielokrotnego powtarzania kodu, zwłaszcza gdy widoku używamy więcej niż raz. Najprościej ten problem wyjaśnić na przykładzie: p. Załóżmy że widok zawiera element <select> w postaci listy rozwijanej. Wybrany element jest przekazywany przez parametr @selectedOption@ i @selectedOption2@. Możemy więc zostawić metodę init() w widoku pustą i wszystko przerzucić do kontrolera, wtedy kod kontrolera i widoku będzie wyglądał tak: (przyjmujemy że widok będzie użyty w dwóch metodach kontrolera: @show_1()@ i @show_2()@ pre.. /** * kontroler */ .... public function show() { $options = array ( '1' => 'jeden', '2' => 'dwa', '3' => 'trzy' ); $show = $this->addShow('show_main'); $opt = $this->get('selectedOption'); $show->assign('options',$options); $show->assign('selectedOptions',$opt); } ..... public function show_2() { $options = array ( '1' => 'jeden', '2' => 'dwa', '3' => 'trzy' ); $show = $this->addShow('show_main'); $opt = $this->get('selectedOption2'); $show->assign('options',$options); $show->assign('selectedOptions',$opt); } ......... /** * widok */ public function init() { } p. Jak widzimy cały kod musieliśmy powtórzyć dwukrotnie. Teraz to co jest niezmienne przerzućmy do widoku. Wtedy kod będzie wyglądał tak: pre.. /** * kontroler */ .... public function show() { $show = $this->addShow('show_main'); $opt = $this->get('selectedOption'); $show->assign('selectedOptions',$opt); } ..... public function show_2() { $show = $this->addShow('show_main'); $opt = $this->get('selectedOption2'); $show->assign('selectedOptions',$opt); } ......... /** * widok */ public function init() { $options = array ( '1' => 'jeden', '2' => 'dwa', '3' => 'trzy' ); $this->assign('options',$options); } p. Jak widać można zaoszczędzić sobie sporo pisania. h3. Metody używane w widoku p. Predefiniowane metody używane w widoku to: * @assign(param_name,param_value)@ * @addMngr('mngr_name')@ * @addShow('show_name','position')@ * @initPosition('position')@ p. @assign@ jest to tak naprawdę metoda z mechanizmu smarty, nie wymaga więc opisu; @addMngr@ i @addShow@ działają identycznie jak w przypadku kontrolera, natomiast metoda @initPosition@ jest odpowiedzialna za inicjalizację pozycji @position@. O co chodzi z tą inicjalizacją dowiemy się za chwilę. h3. Zagnieżdżanie widoków p. Jak już wiemy, kontroler ma za zadanie poskładać z widoków kompletną stronę html. Polega to na tym, że "zbiera" od różnych widoków fragmenty wygenerowanego kodu i umieszcza w swym widoku natywnym. Aby mógł to zrobić w szablonie widoku natywnego musimy określić pozycje na których będą się znajdować te fragmenty kodu. Nie są one niczym innym jak zmiennymi smarty. Dodając do widoku, bądź kontrolera kolejny widok musimy określić jego pozycję. W przypadku gdy tego nie zrobimy system automatycznie przypisuje mu pozycję "main". Gdy będziemy chcieli na jednej pozycji dodać kilka widoków, będą one "sklejone" w kolejności dodawania. Może się zdarzyć że mamy zdefiniowaną w szablonie pozycję, ale żaden widok nie zostanie jej przypisany. Nie jest to dużym problemem dla PHP, ale z uwagi na bardzo rygorystyczną kontrolę błędów we frameworku, otrzymamy wyjątek. Aby się on nie pokazał należy użyć wspomnianej wcześniej metody @initPosition@. Spowoduje ona zainicjowanie pozycji na pustą wartość i dzięki temu nie otrzymamy komunikatu o błędzie. Ponieważ kolejne widoki można dodawać bezpośrednio w innym widoku, można je w sobie zagnieżdżać praktycznie do dowolnej głębokości. p. Ponieważ wiemy już jak tworzyć widoki możemy rozwinąć naszą testową aplikację. Poprzednio stanęliśmy na definicji kontrolera. Teraz zdefiniujmy jego widok natywny. W kontrolerze zapisaliśmy, że nazywa się on show_main. Tworzymy więc plik @front/system/show/main.php@ i wypełniamy go treścią. Od razu zakładamy że szablon będzie znajdował się w pliku @front/skin/default/templates/main.tpl@ pre.. /** * widok natywny dla kontrolera ctrl_main */ class show_main extends ap_show implements iface_show { protected $template = 'main'; public function init() { } } p. Pozostało nam wypełnić szablon @main.tpl@. Zróbmy to np. w taki sposób: pre.. <html> <head> <title> Moja pierwsza strona APEL </title> </head> <body> {$main} </body> </html> p. Jak widać zdefiniowaliśmy jedną pozycję o nazwie *main*. Szablon nie wymaga żadnych dodatkowych danych więc funkcję @init()@ możemy pozostawić pustą. p. W tym momencie umiemy już definiować kontrolery i widoki, co jest wystarczającą wiedzą do stworzenia strony powitalnej naszego systemu. Co trzeba więc zrobić? * po pierwsze: stworzyć widok z tekstem strony powitalnej * po drugie: dodać ten widok w kontrolerze p. A więc do dzieła: zaczynamy od widoku: pre.. /** * widok z tekstem strony powitalnej */ class show_welcome extends ap_show implements iface_show { protected $template = 'welcome'; public function init() { } } p. Zapisujemy go w pliku @front/system/show/welcome.php@ p. Teraz tworzymy plik @front/skin/default/templates/welcome.tpl@ i zapisujemy w nim tekst powitania. W naszym wypadku wystarczy pre.. Witam w mojej pierwszej aplikacji napisanej przy użyciu frameworka APEL p. Teraz dodajemy widok w kontrolerze @ctrl_main@. Robimy to w ten sposób pre.. .... public function show() { $show = $this->addShow('show_welcome','main'); } p. Jeśli niczego nie zepsuliśmy po wejściu na stronę główną naszego serwisu powinna ukazać się nam nasza strona powitalna. "<<< Kontroler":http://www.xp-dev.com/wiki/67486/Kontroler - "Baza danych >>>":http://www.xp-dev.com/wiki/67486/Baza%20danych

janf0 picture
janf0 created Wiki Widok

View View full history