Obiekt akcji na przykładzie xupload

Akcje definiuje się w kontrolerze. Przy zastosowaniu prostych adresów akcja actionAtest w kontrolerze CtestController aplikacji test przekłada się na url: http://localhost/test/ctest/atest.

Jeśli akcja jest bardzo złożona, albo chcemy ją powielać w różnych kontrolerach (lub dla różnych aplikacji), możemy ją zdefiniować w odrębnym module zbudowanym na bazie CAction:

class Test1Action extends CAction {
public function run( ) {
echo 'jestem';
}}

Oczywiście logika akcji jest w publicznej funkcji run.

Zazwyczaj akcje umieszcza się w katalogu protected/actions (co przekłada się na ścieżkę: application.actions), albo w rozszerzeniach (extensions).

Aby było możliwe jej wykorzystanie – musimy ją zaimportować: albo w kontrolerze, albo definiując w pliku parametrów. Wybierzmy tą drugą opcję, tworząc przy okazji alias actions. Alias możemy stworzyć w parametrach, albo przez wywołanie Yii::setPathOfAlias.

// Yii::setPathOfAlias('actions', 'application.actions');

return array(

...

'import'=>array(

'application.actions.*' //import akcji !

),

'aliases' => array(

'actions' => 'application.actions',

),

W kontrolerze nadpisujemy funkcję actions:

public function actions() {

return array('test1'=>array('class' => 'actions.Test1Action', 'parametr' => "jakaś wartość" ), );

}

Jeśli zrobimy to w kontrolerze głównym (SiteController), uzyskamy adres url: localhost/test/test1.

Podobnie jak w modułach – można zdefiniować też publiczne parametry, ustawiane przy inicjowaniu akcji (przykład w dołączonych plikach). Należy zwrócić uwagę na to, że środowiskiem akcji nie jest już kontroler! Aby więc na przykład wyświetlić widok (render) – trzeba odwołać się do kontrolera w którym akcja została zdefiniowana:

$this->getController()->render('test1',array('par' => $this->parametr));

Jedną z bardziej złożonych i często wykorzystywanych akcji jest obsługa ładowania (upload) plików z użyciem mechanizmów Ajax. Wykorzystuje się do tego często bibliotekę Blueimp: http://blueimp.github.io/jQuery-File-Upload/

Autor rozszerzenia xupload (http://www.yiiframework.com/extension/xupload/) zaimplementował nie tylko obsługę akcji kontrolera, ale i kontrolkę (widget) o nazwie XUpload .

Przykład wykorzystania kontrolki:

$this->widget('xupload.XUpload', array(

'url' => Yii::app()->createUrl("site/upload", array("parent_id" => 1)),

'model' => $model,

'attribute' => 'file',

'multiple' => true,

));

Podany adres „site/upload” wskazuje, że musimy zdefiniować akcję obsługi ładowania plików w kontrolerze site, a sama akcja ma się nazywać upload.

Zmieniamy więc kontroler SiteController:

Yii::import("xupload.models.XUploadForm");

class SiteController extends Controller {

public function actions() {

return array(

'upload' => array('class' => 'xupload.actions.XUploadAction'

'path' => Yii::app() -> getBasePath() . "/../images/uploads",

"publicPath" => Yii::app()->getBaseUrl()."/images/uploads" ),

);

}

...

I to wszystko! Skomplikowana funkcjonalność aplikacji w kilkunastu linijkach kodu!

Trzeba jeszcze tylko założyć katalogi na przesyłane obrazki – zgodnie z ustawieniami zdefiniowanymi w parametrach path i publicPath. W naszym przypadku będą: to katalog images (w katalogu aplikacji – powyżej protected) oraz podkatalog upload.

Więcej ustawień w dokumentacjach podanych powyżej bibliotek.

Żeby to ładnie wyglądało, trzeba jeszcze gdzieś dodać style Bootstrap (w szablonie?):

<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">

Ostatnia modyfikacja: piątek, 26 luty 2016, 08:38