Struktura aplikacji (2)

Programowanie obiektowe w yii

W głównym pliku aplikacji (index.php) importuje się plik yii.php framework'a. Daje to nam dostęp do klasy Yii z której wywołujemy statycznie funkcje, które zwracają albo jakieś parametry, albo generują obiekty. Widać to na przykładzie uruchomienia samej aplikacji, które wygląda następująco:

Yii::createWebApplication($config)->run();

$config – ścieżka do pliku konfiguracyjnego

Plik konfiguracyjny jest domyślnie w protected/config/main.php zawiera on tablicę (array) parametrów.

Należy zwrócić uwagę na różnicę między :: (wywołaniem statyczne zdefiniowanej w obiekcie funkcji) a -> (wywołanie funkcji/metody z obiektu).

class test {

public function f() {print 'ok'; }
}

test::f();

$o = new test();

$o->f();

Wśród funkcji klasy Yii najważniejsza jest app() - zwracająca obiekt aplikacji (klasy CApplication).

Typowe wywołanie:

$db = Yii::app()->db; - pobranie obiektu bazy danych

Inne przykłady użycia obiektu app:

$error=Yii::app()->errorHandler - obiekt obsługi błędu klasy CerrorHandler

$error=Yii::app()->errorHandler->error - błąd

Yii::app()->user -> - Obiekt użytkownika – klasy CUserIdentity

Yii::app()->user->id() - numer (klucz) użytkownika

Yii::app()->user->name() - identyfikator użytkownika

Yii::app()->end(); - koniec wywolania skryptu (np. ajax)

Yii::app()→name – nazwa aplikacji

Yii::app()->params['paramName'] – pobranie parametrów uzytkownika – zdefiniowanych w sekcji params pliku konfiguracyjnego

Yii::app()->request – obiekt zapytania – klasy CHttpRequest

->isPostRequest – post czy get

->isAjaxRequest – czy Ajax

->getParam('name') - parametr z wywołania

->getQuery() - parametr przesłany jako GET

->getPost() - parametry przesłane jako POST

->getQueryString() - łańcuch zapytania: $_SERVER['QUERY_STRING']

->userHostAddress – adres hosta

Inne funkcje klasy Yii często używane:

Yii::setPathOfAlias(...) - alias dla modułów

Yii::getPathOfAlias('nazwa') – pobranie

Yii::t() - tłumaczenia komunikatów

Yii:log() - logowanie komunikatów

Struktura prostych stron internetowych

Nowoczesne strony buduje się z użyciem metodologii MVC. Skrót pochodzi od Model (dostęp do danych), View (widok tych danych) i Controller (realizacja funkcji – przepływ danych).

Treści strony internetowej (widoki) można zazwyczaj rozdzielić na dwie części:

  • elementy stałe (określane jako layout, szablon, temat);

  • elementy zmienne – czyli najważniejsza część informacyjna strony.

Po wygenerowaniu strony yii otrzymujemy informację, gdzie znajdują się skrypty odpowiedzialne za te dwa elementy:

  • View file: C:\xampp\htdocs\yiikurs\www\protected\views\site\index.php

  • Layout file: C:\xampp\htdocs\yiikurs\www\protected\views\layouts\main.php

Możemy zmieniając wskazany wyżej plik index.php uzyskać prostą stronę ze standardowym szablonem. Jeśli chcemy zrezygnować z szablonu – podmieniamy wskazany powyżej plik main.php (budowanie profesjonalnych szablonów jest odrębnym zagadnieniem).

Najprostszy „szablon” (main.php):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title><?php echo CHtml::encode($this->pageTitle); ?></title>
</head>
<body>
<?php echo $content; ?>
</body>
</html>

Plik szablonu zostaje użyty w obiekcie kontrolera (klasy Controller). Jest on dostępny poprzez zmienną $this (tytuł strony pochodzi z tego obiektu: $this->pageTitle). Jego definicja jest zawarta w pliku protected/controllers/SiteController.php.

Kontrolerów oczywiście może być więcej. Umieszcza się je zazwyczaj w katalogu protected/controllers/ i każdy ma nazwę kończącą się na „Controller.php”. Każdy z nich realizuje inne funkcje programu/strony. Jeśli strona jest tylko jedna, można poprzestać przy standardowym kontrolerze, który wykonuje następujące czynności:

- widok strony głównej z views/site/index.php przetwarza do zmiennej $content

- ładuje szablon (views/layouts/main.php)

- w szablonie zawartość zmiennej $content jest wyświetlana w odpowiednim miejscu

Budowa kontrolera

Kontroler realizuje akcje (funkcje) aplikacji, uruchamiane poprzez podanie odpowiednich parametrów w adresie UEL. Standardową akcją jest Index (nie musimy podawać jej nazwy). Jeśli więc wywołamy stronę bez parametrów, zostanie użyty kontroler SiteController z którego zostanie wywołana akcja IndexAction.

Możemy to przetestować zamieniając kontroler (SiteController.php) na plik o zawartości:

<?php
class SiteController extends Controller {
public function actionIndex() { echo 'Hallo world'; }
}

Wykonujemy test z przeglądarki - uzyskamy napis:

Hallo world
Co zrobić, aby kontroler użył szablonu i widoku strony głównej? Służy do tego funkcja kontrolera o nazwie 'render'. Kontroler może więc przyjąć postać:

<?php
class SiteController extends Controller {
public function actionIndex(){ $this->render('index'); }
}

Skąd on wie, gdzie szukać odpowiedniego widoku (tu: index)? Na podstawie nazwy własnej. Kontroler o nazwie AbcController poszukuje widoków w katalogu views/abc

Spróbujmy przetestować:

Kontroler AbcController:

<?php
class AbcController extends Controller {
public function actionIndex(){ $this->render('index'); }
}

Widok views/abc/index.php:

test abc

Sprawdzamy w przeglądarce (parametr r zawiera nazwę kontrolera):

http://localhost/yiikurs/www/?r=abc

Łatwo możemy dodawać następne akcje do kontrolera.

Na przykład:

public function actionTest(){
$this->render('vtest');
}
Do tego oczywiście widok: views/abc/vtest.php i już możemy testować: http://localhost/yiikurs/www/?r=abc/test

Na przykład:

$this->renderPartial('//site/_navigation');

Budowa prostych widoków

Widok jest zwykłym skryptem php. W szczególności może to więc być prosty tekst, albo kod html.

Można go podzielić na moduły dołączane standardowym mechanizmem php (require_once). Można także uzyć funkcji kontrolera renderPartial:

$this->renderPartial('xyz');

Jaka jest różnica między renderPartial a require_once? W takim prostym przypadku nie ma właściwie żadnej. Jednak renderowanie (render/renderPartial) może odbywać się z parametrami. Wówczas łatwiej zachodzą bardziej istotne różnice w sposobie przekazywania tych parametrów (zmiennych).

Analiza adresów url

W powyższych przykładach podano standardowe wywołanie akcji (akcja) dla kontrolera (f): index.php?r=f/akcja

Aby móc używać prostych adresów (bez parametrów), trzeba użyć obiektu UrlManager, który przetworzy adres na parametry wywołania.

W tym celu należy w pliku konfiguracji (config/main.php) odkomentować definicję komponentu 'urlManager'.

Testujemy (w miejsce http://localhost/yiikurs/www/index.php?r=abc/test): http://localhost/yiikurs/www/index.php/abc/test

Aby móc pominąć nazwę skryptu (index.php), należy do konfiguracji UrlManager dodać 'showScriptName'=>false,:

'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(

....
Dodatkowo w katalogu głównym aplikacji należy założyć plik .htaccess z definicją przepisywania adresów:

RewriteEngine on

RewriteRule . index.php

Testujemy: http://localhost/yiikurs/www/abc/test

Ale jak przekazać w adresie url parametry do wybranego kontrolera?

Na przykład coś takiego: /abc/test2/parametr

Stwórzmy akcję test2:

public function actionTest2($parametr){
echo 'jestem '.$parametr;
}
Dopisujemy do UrlManagera wzorzec abc/test2/<parametr> i akcję, jaką należy wywołać:

'rules'=>array(

'abc/test2/<parametr>'=>'abc/test2/',

Testujemy: abc/test2/12345

Ostatnia modyfikacja: wtorek, 20 październik 2015, 09:31