Dawid Katarzyński

Dawid Katarzyński programista php
śląsk, web developer
śląsk, aplikacje
ded...

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Jestem początkujący dlatego pytam google przedukałem ale jakoś nici :/
pytanie jak wywołać akcję 1 kontrolera w innym?

class IndexController extends Zend_Controller_Action{
function init() {
parent::init();
$this->view->cytat='moja zawartosc';
}
}//class

class MojaController extends Zend_Controller_Action{
function init() {
parent::init();
//i tu chce wywolac IndexController::init();
}
}//class

a w widokach mam: <?php echo $this->escape($this->cytat); ?>

czy też mam to zrobić inaczej? najlepiej jakbym to miał globalnie definiowane gdzieś i wywoływać wszędzie gdzie chcę. Ktoś pomoże?

np: mojadomena/costu/.... -> i tu wywołanie tego co potrzebuj
Wojciech Soczyński

Wojciech Soczyński Programista
eksplorator -
blog.wsoczynski.pl

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Może zrób sobie view helpera i w nim wrzuć takie rzeczy i możesz je wtedy w każdym widoku odpalać

konto usunięte

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Witam,

jest kilka narzędzi które prawdopodobnie rozwiążą twój problem. Na przykład funkcja _forward(), która przekierowuje na inną akcję
$this->_forward('nazwa akcji', 'nazwa kontrolera', 'nazwa modułu')

, obowiązkowy jest tylko pierwszy parametr.

Dla bardziej złożonych kombinacji(np.: gdy trzeba wykonać kilka-kilkanaście akcji z różnych kontrolerów), jest przewidziany pomocnik akcji - ActionStack, lub pomocnik widoku Action
<?php echo $this->action('akcja', 'kontroler', 'moduł', array('parametry')) ?>
, należy go jednak używać bardzo ostrożnie bo robi klona całego obiektu View, który zazwyczaj jest ogromy.

PozdrawiamYuriy Kisil edytował(a) ten post dnia 01.05.10 o godzinie 20:37
Katarzyna W.

Katarzyna W. Leading Software
Engineer

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Można też przekierować żądanie z poziomu kontrolera bezpośrednio, bez użycia metody _forward(), osiągając ten sam efekt:

$this->getRequest()->setModuleName('nazwa modulu')
->setControllerName('nazwa kontrolera')
->setActionName('nazwa akcji')
->setDispatched(false);

W większości przypadków jednak wygodniej i szybciej jest korzystać z metody _forward(), którą opisał wyżej Yuriy Kisil.Katarzyna W. edytował(a) ten post dnia 09.05.10 o godzinie 11:29
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: Wywołanie jednego kontroleraz z poziomu innego?

imho action helper i tego typu wynalazki poprostu smierdza, bo gdy masz wiele kodu w init, pre/post dispatch itp itd to prowadzi do glupich bledow i wielokrotnego wykonywania tego samego kodu

lepiej zrob sobie kontroler bazowy i wrzuc do niego potrzebne fragmenty logiki zamiast wywolywac cala akcje z poziomu innego kontrolera.
Artur Świerc

Artur Świerc Programista PHP/Java

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Do wypowiedzi Łukasza dodam jeszcze, że często mam okazję pracować w takim kodzie - czasem trudno się w nim odnaleźć, ze względu na zagnieżdżone wywołania akcji kontrolerów w widokach. Masakra, jeśli jeszcze projekt jest podzielony na moduły.

Chyba lepiej zrobić sobie jakiegoś helpera.

ps/ nie potrzebujesz za każdym razem robić parent'a w inicie - w klasie po której dziedziczysz init i tak jest pusty.Artur Świerc edytował(a) ten post dnia 10.05.10 o godzinie 08:58
Dawid Katarzyński

Dawid Katarzyński programista php
śląsk, web developer
śląsk, aplikacje
ded...

Temat: Wywołanie jednego kontroleraz z poziomu innego?

postaram się powdrażać wasze sugestie lecz powiem ze topornie to idzie :(Dawid Kat edytował(a) ten post dnia 13.05.10 o godzinie 13:54

konto usunięte

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Łukasz Cepowski:
imho action helper i tego typu wynalazki poprostu smierdza, bo gdy masz wiele kodu w init, pre/post dispatch itp itd to prowadzi do glupich bledow i wielokrotnego wykonywania tego samego kodu

lepiej zrob sobie kontroler bazowy i wrzuc do niego potrzebne fragmenty logiki zamiast wywolywac cala akcje z poziomu innego kontrolera.

Witam,

Jestem trocha odmiennego zdania, na temat wykorzystania możliwości które daje nam Zend Framework. No i oczywiście action Helper mi nie śmierdzi :), gdyż jest najoptymalniejszym(w dniu dzisiejszym) sposobem łączenia aplikacji składającej się z niezależnych modułów w jedną całość, które dostarcza nam ZF.

Właściwie, w pierwszym akapicie dokumentacji technicznej ZF o helperach akcji można przeczytać , że „...pomagają one zminimalizować zapotrzebowanie na dziedziczenie od abstrakcyjnego kontrolera działań przy dodawaniu typowego zachowania...”. Osobiście nie uważam by wyeliminowanie jednego poziomu dziedziczenia z krowy pod nazwaniem Zend Framework, jakoś szczegółowo przyśpieszyło pracę aplikacji, natomiast przenośność i możliwość powtórnego wykorzystania kodu spada znacząco.

Uważam, natomiast, że nie powinno się pisać kodu w pre/postDispatch helperów akcji czy pluginów jeżeli się nie ma świadomości w jaki sposób FrontController je uruchamia. Z tej że dokumentacji technicznej można wyczytać że preDispatchu najlepiej trzymać sprawdzenie ACL'a, wtedy mamy pewność że za każdą pętlą dispatchera zostaną sprawdzone dostępy do każdego zasobu poszczególnie. A do inicjalizacji aplikacji czy modułów pozostają nam funkcje pluginów:

routeStartup()
routeShutdown()
dispatchLoopStartup()

, które z kolei nie są cykliczne i wykonują się jeden raz na request.

Założenia pluginów są takie że można je włączać (wzbogacają przy tym funkcjonalność CAŁEJ aplikacji) lub wyłączać. Natomiast kiedy kilka kontrolerów mają część wspólnej funkcjonalności powinno się wykorzystywać helpery akcji.

Pozdrawiam.Yuriy Kisil edytował(a) ten post dnia 21.05.10 o godzinie 20:59

konto usunięte

Temat: Wywołanie jednego kontroleraz z poziomu innego?

Święte słowa! :-) Szkoda, że nie można tego nigdzie przypiąć dla potomnych ;-)



Wyślij zaproszenie do