Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] $this-action()
Forum PHP.pl > Forum > PHP > Frameworki
Cezar708
witam mam kontroler:
  1. <?php
  2. class TestController extends Zend_Controller_Action {
  3. public function fooAction(){
  4. $this->view->tablica = array(1,2,3,4,5);
  5. }
  6. }
  7. ?>


nastepnie w index.phtml mam:
  1. <?php echo $this->action('foo', 'test'); ?>


a w templacie foo.phtml mam:
  1. <?php
  2. var_dump($this->tablica)
  3. ?>


niestety wynikiem działania skryptu jest:
Kod
null


co nie tak robię z przekazaniem parametru 'tablica' do widoku? Jaki popełniam błąd?

Pozdrawiam
Cezar708
koodlaty
A tak spróbuj:

  1. <?php
  2. class TestController extends Zend_Controller_Action {
  3. public function fooAction(){
  4. $this->view->assign('tablica', array(1,2,3,4,5));
  5. }
  6. }
  7. ?>
Cezar708
sad.gif

niestety efekt taki sam, poza tym chyba nawet ta metoda jest wywoływana w magicznym __get(),

generalnie udało mi się jakimiś gimnastykami dostać do zmiennej w widoku w taki sposób:
  1. <?php
  2. var_dump($this->getHelper('action')->view->tablica);
  3. ?>


co sugeruje, że zmienna jest przekazywana, ale chyba nie do tego obiektu Zend_View.

Może to Was naprowadzi co mogę mieć źle... czyżby powstawały dwa obiekty widoku? Mieliście taki problem?

Pozdrawiam
Sabistik
Korzystasz z jakichś rozszerzeń na smarty albo własnej klasy ?
Cezar708
nie, nie korzystam z własnych rozszerzeń...

co do poprzedniego posta to jest nieaktualny, nie widzi mi tak zmiennej, po prostu testując różne możliwości dodałem inaczej tę zmienną (w konstruktorze akcji) przez co była zmienna widoczna. Oczywiście takie rozwiązanie jest niesatysfakcjonujące.

więc jestem w punkcie wyjścia (post #1)

Masz jakąś idee co mogę robić nie tak?

Pozdrawiam
mike
Podejrzewam ze Ty robisz OK, tylko Zend ma błąd.
Daj w tym pliku index.phtml:
  1. <?php
  2.  
  3. echo $this->action('foo', 'test');
  4. var_dump($this->tablica);
  5.  
  6. ?>
Cezar708
coś się dzieje, zrobiłem tak w index.phtml:

  1. <?php
  2. var_dump($this->tablica);
  3. echo $this->action('foo', 'test');
  4. var_dump($this->tablica);
  5. ?>


a wynik to:
Kod
null // to wywolane w index.phtml przed $this->action

null // to wywoane w foo.phtml

array  // to znowu wywołane w index.phtml ale po $this->action
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4
  4 => int 5


questionmark.gif

czyli jakby wszystko dopiero zaczęło działać po fakcie smile.gif

~EDIT:
żeby nie było
takie wywołanie:
  1. <?php
  2. var_dump($this->tablica);
  3. echo $this->action('foo', 'test');
  4. var_dump($this->tablica);
  5. echo $this->action('foo', 'test');
  6. ?>


daje rezultat:
Kod
null

null

array
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4
  4 => int 5

null




~EDIT 2

jeszcze jedna wskazówka...

jak wywołam link http://localapphost/test/foo to wynik mam prawidłowy, czyli:
Kod
array
  0 => int 1
  1 => int 2
  2 => int 3
  3 => int 4
  4 => int 5


echh.. ozłocę tego kto wskaże mi dobrą drogę postępowania...
teutates
Chyba cos namieszales, u mnie to co masz w pierwszym poscie dziala doskonale.
Cezar708
Cytat(teutates @ 9.05.2008, 20:16:13 ) *
Chyba cos namieszales, u mnie to co masz w pierwszym poscie dziala doskonale.


no wiem, że coś jest namieszane (stąd ten wątek), ale ja nic nie zmieniałem w kodach Zenda, wszystko jest takie same jak po ściągnięciu (Zend Framework 1.5.1).

Mam kolejny trop.... w pliku: Zend/View/Helper/Action.php jest kod funkcji action():

  1. <?php
  2. public function action($action, $controller, $module = null, array $params = array())
  3. {
  4. $this->resetObjects(); 
  5. if (null === $module) { 
  6. $module = $this->defaultModule; 
  7. } 
  8.  
  9. // clone the view object to prevent over-writing of view variables
  10. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  11. $viewRendererViewObj = $viewRenderer->view;
  12. $viewRenderer->view = $this->cloneView(); 
  13.  
  14. $this->request->setParams($params) 
  15. ->setModuleName($module) 
  16. ->setControllerName($controller) 
  17. ->setActionName($action) 
  18. ->setDispatched(true); 
  19.  
  20. $this->dispatcher->dispatch($this->request, $this->response); 
  21.  
  22. // reset the view object to it's original state
  23. $viewRenderer->view = $viewRendererViewObj;
  24.  
  25. if (!$this->request->isDispatched() 
  26. || $this->response->isRedirect()) 
  27. { 
  28. // forwards and redirects render nothing 
  29. return ''; 
  30. } 
  31.  
  32. $return = $this->response->getBody();
  33.  
  34. return $return;
  35. }
  36. ?>


i jeśli zakomentuję linię (tu linię 12):
  1. <?php
  2. // $viewRenderer->view = $this->cloneView();
  3. ?>


wszystko zaczyna działać tak jak powinno.

macie może pomysł dlaczego tak się dzieje?

Pozdrawiam


~EDIT
Dobra znalazłem na Zendowskiej JIRA zagadnienie o tej samej treści co moje, na razie jest otwarte, a poprawka ma wyjść przy następnym release frameworka.

Jest w helperze widoku action() pewien problem z klonowaniem obiektu Zend_View, po prostu źle to robią i w niektórych przypadkach (vide powyższy) dane są źle przekazane do widoku.

Dopóki nie wyjdzie nowy release napisałem własnego helpera, który w prawidłowy sposób przekazuje zmienne do renderowanego widoku.

Temat najprawdopodobniej jest wyczerpany.


Pozdrawiam
Cezar708
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.