Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZF] $this-action(), problem z przekazaniem zmiennej
Cezar708
post
Post #1





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
koodlaty
post
Post #2





Grupa: Zarejestrowani
Postów: 118
Pomógł: 3
Dołączył: 6.07.2006
Skąd: Dublin

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Cezar708
post
Post #3





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


(IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
Sabistik
post
Post #4


Administrator wortalu


Grupa: Przyjaciele php.pl
Postów: 960
Pomógł: 39
Dołączył: 21.10.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Korzystasz z jakichś rozszerzeń na smarty albo własnej klasy ?
Go to the top of the page
+Quote Post
Cezar708
post
Post #5





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mike
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Cezar708
post
Post #7





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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


(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

czyli jakby wszystko dopiero zaczęło działać po fakcie (IMG:http://forum.php.pl/style_emoticons/default/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...

Ten post edytował Cezar708 9.05.2008, 14:38:23
Go to the top of the page
+Quote Post
teutates
post
Post #8





Grupa: Zarejestrowani
Postów: 156
Pomógł: 2
Dołączył: 9.09.2006
Skąd: Londyn/Gdynia

Ostrzeżenie: (0%)
-----


Chyba cos namieszales, u mnie to co masz w pierwszym poscie dziala doskonale.
Go to the top of the page
+Quote Post
Cezar708
post
Post #9





Grupa: Zarejestrowani
Postów: 1 116
Pomógł: 119
Dołączył: 10.05.2005
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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

Ten post edytował Cezar708 14.05.2008, 16:06:28
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.12.2025 - 14:28