Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Template'y z uzyciem zend_layout i zend_view
Forum PHP.pl > Forum > PHP > Frameworki
matchor
Witam. Raczkuje z ZF i bardzo prosze was o pomoc bo juz glupieje. Uzywam najnowszej wersji ZF.

Chce zrobic sobie szablon 3 kolumnowy + header + stopka. Uzylem do tego zend_layout i stworzylem sobie szkielet strony. Teraz w zaleznosci od akcji chce wyswietlac w poszczegolnych elementach layoutu inna zawartosc

i tak np na stronie index w indexControlers chce sobie ustawic by w 'module srodkowym' layoutu miec tresc powitania/'prawej kolumnie' guzik do zalogowania / w 'lewej kolumnie' nie wiem cos innego

na stronie login.html ( loginControlers) chce miec juz cos innego czyli zamiast w lewej kolumnie logowania chce miec np liste ostatnio zalogowanych uzytkownikow
w srodkowej czesci natomiast formularz logowania
w prawej jeszcze cos innego

czyli w zaleznosci od strony do poszczegolnych elementow layoutu chce wrzucac calkowicie inna nie powiazana ze soba tresc cos a'la if (index) include_template_a / else include_template_b

w jaki sposob to oprogramowac ? ja juz sie poddaje i nie za bardzo wiem.

probowalem tak:

w layoucie w odpowiednim katalogu application/views/scripts/index/index.phtml oraz w application/views/scripts/index/login.phtml mam taki sam kod layoutu (tu juz mi cos nie pasuje bo n roznych stron w serwisie i mam tworzyc n takich samych layoutow??) w odpowiednich miejscach htmla printuje

<?php echo $this->layout()->lewaK; ?>
<?php echo $this->layout()->srodekK; ?>
<?php echo $this->layout()->prawaK; ?>


nastepnie w indexControlers

$this->_helper->layout()-> lewaK= = $this->render('guzikZaloguj');
$this->_helper->layout()-> srodekK= $this->render('powitanie');
$this->_helper->layout()-> prawaK= $this->render('cos');


a w loginControlers

$this->_helper->layout()-> lewaK= = $this->render('ostatniZalogowani');
$this->_helper->layout()-> srodekK= $this->render('formularzLogowania');
$this->_helper->layout()-> prawaK= $this->render('cos2');



guzikZaloguj.phtml powitanie.phtml etc... mam w katalogu /application/layouts/scripts




czy dobrze kombinuje ? co robie zle ? - bo niestety nie osiagam zamierzonego efektu. W dodatku nie dostaje zadnych warningow errorow noticow - nic co by sugerowalo ze cos robie zle :|

przypisanie do $this->_helper->layout()-> lewaK = "asdada" dziala i wyswietla na stronie tekst - natomiast chcialbym zeby wyswietlalo zawartosc 'template'a'

z gory dzieki za poswiecony czas i pomoc
seth-kk
to twoje application/views/scripts/index/index.phtml to widok a nie layout

ten efekt mozna osiagnac na wiele sposobow
chyba najprostszy to switch/if + action view helper
czyli cos w stylu
  1. <div id="left>
  2. <?php
  3. switch($controller_action)
  4. {
  5. case 'index_index':
  6. echo $this->action(...);
  7. break;
  8. //....
  9. }
  10. ?>
  11. </div>
  12. <div id="center">
  13. <?= $this->layout()->content; ?>
  14. </div>
  15. <div id="right">
  16.  
  17. <?php
  18. switch($controller_action)
  19. {
  20. case 'index_index':
  21. echo $this->action(...);
  22. break;
  23. //....
  24. }
  25. ?>
  26. </div>

ale rownie dobrze moznaby action helper zastapic partialami lub sterowanie przesunac do controllerow lub helperow jesli zawartosc bocznych elementow nie powina trafiac do glownego contentu
Sajrox
Ja mam to tak:

Mój layout.phtml
  1. <?= $this->partial('header.phtml'); ?>
  2. <?= $this->partial('top.phtml', array('imagesPath' => $this->imagesPath)); ?>
  3. <?= $this->partial('left.phtml'); ?>
  4.  
  5. <div class="body_container">
  6. <div class="body">
  7.  
  8. <?= $this->layout()->content ?>
  9.  
  10. </div>
  11. </div>
  12.  
  13. <?= $this->partial('right.phtml') ?>
  14. <?= $this->partial('footer.phtml') ?>
  15.  


Ale mozna to zrobić też tak:
  1. <?php
  2. if (isset($this->partialUp) AND is_array($this->partialUp))
  3. {
  4. foreach ($this->partialUp as $lay)
  5. {
  6. if (isset($lay['name']) AND $lay['name'] != '')
  7. {
  8. if (isset($lay['params']))
  9. $params = $lay['params'];
  10. else
  11. $params = array();
  12.  
  13. $this->partial($lay['name'], $params);
  14. }
  15. }
  16. }
  17. ?>
  18.  
  19. <div class="body_container">
  20. <div class="body">
  21.  
  22. <?= $this->layout()->content ?>
  23.  
  24. </div>
  25. </div>
  26.  
  27.  
  28. <?php
  29. if (isset($this->partialDown) AND is_array($this->partialDown))
  30. {
  31. foreach ($this->partialDown as $lay)
  32. {
  33. if (isset($lay['name']) AND $lay['name'] != '')
  34. {
  35. if (isset($lay['params']))
  36. $params = $lay['params'];
  37. else
  38. $params = array();
  39.  
  40. $this->partial($lay['name'], $params);
  41. }
  42. }
  43. }
  44. ?>


Do zmiennych $this->partialUp oraz $this->partialDown dodajesz strony które chcesz dołączyć. Pisałem z ręki więć nie dam głowy że to działa winksmiley.jpg
matchor
no dobra ale co w takim razie podaje do np <?= $this->partial('right.phtml') ?> gdzie ustawiam co tam ma byc i jak wygladac ?
seth-kk
Cytat(matchor @ 19.10.2009, 11:52:44 ) *
no dobra ale co w takim razie podaje do np <?= $this->partial('right.phtml') ?> gdzie ustawiam co tam ma byc i jak wygladac ?

jesli tak to zrobisz to w tym partialu
Sajrox
tam gdzie masz swój plik layout.phtml tworzysz right.phtml i już
matchor
i co i w right.phtml mam miec

switch(akcja)
case akcja1:
case akcja2
case akcja.. n





i wszystkie mozliwe widoki jakie moze przyjac prawa kolumna layoutu ?


bardziej myslalem o rozwiazaniu ze w kontrolerze ustalam jaki phtml ma sie znalezc w right i raz bym robil right = right.phtml a raz right=sidebar.phtml a innym razem right=xyz.phtml
Sajrox
Ja robie to tak. W layout.phtm przy pomocy:

  1.  
  2. <?= $this->partial('...'); ?>
  3.  


ładuję stały kod html który siuę nie zmienia




Jednak do dynamicznego generowania zawartości bocznych menu używam:

  1.  
  2. <?= $this->action('...'); ?>
  3.  





Generalnie najpierw w kontrolerze globalnym tworzę tablicę np:

  1.  
  2. $modułyBoczne[] = array(
  3.  
  4. 'controller' => 'firmy',
  5.  
  6. 'action'   => 'najnowsze'
  7.  
  8. );
  9.  
  10. $modułyBoczne[] = array(
  11.  
  12. 'controller' => 'artykuly',
  13.  
  14. 'action'   => 'najnowsze'
  15.  
  16. );
  17.  
  18. $this->getRequest()->setParam('modułyBoczne', $modułyBoczne);
  19.  
  20.  
  21.  





i w Layout.phtml

  1.  
  2. foreach ($this->getRequest()->getParam('modułyBoczne') as $v)
  3.  
  4.      $this->action($v['action'], $v['controller']);
  5.  





Próbuje przedstawić sam sens działania, jednak powinieneś to sam już bardziej rozbudować, ale jeśli załapałeś o co chozi to bez problemu sobie z tym poradzisz winksmiley.jpg

Pamiętaj aby w tych akcjach które wyświetlasz przez $this->action() wyłączyć layput:

  1.  
  2. $this->view->layout()->disableLayout();
  3.  




matchor
WIELKIE DZIĘKI exclamation.gif To rozwiązanie mi się podoba.

Ja wczoraj metodą prób i błędów zrobiłem sobie to na tej zasadzie:

w layoutcie mam

<?php echo $this->leftColumn;?>

natomiast w controlerze robie

$this->view->leftColumn = $this->view->render('pasekLewyLogowanie.phtml');

nawet sie sprawdza

niemniej twoje rozwiazanie bardziej do mnie przemawia smile.gif

Jeszcze raz dzieki (WSZYSTKIM winksmiley.jpg )
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.