Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Zend_Layout
Forum PHP.pl > Forum > PHP > Frameworki
wlamywacz
Witam smile.gif

Tworze swój pierwszy projekt w tym frameworku. W swoim szablonie w zależności od potrzeb generuje dwa rodzaje menu, jak rozwiązać problem renederowania wybranego menu w zależności od wybranego w kontrolerze?

http://framework.zend.com/manual/en/zend.l...quickstart.html
  1. <body>
  2.    <!-- renders /nav/menu -->
  3.    <div id="nav"><?= $this->layout()->nav ?></div>
  4.  
  5.    <!-- renders /foo/index + /comment/fetch -->
  6.    <div id="content"><?= $this->layout()->content ?></div>
  7. </body>


Jak np. tu layout()->nav
mrok
Jeśli potrzebujesz to na szybko to w kontrolerze mozesz wczytac coś pod zmieną
$this->layout->nav = 'cokolwiek' i taki tekst pojawi sie na ekranie.
Jesli masz statycznego htmla to mozesz zapisac go jako plik i wczytac pod te zmienna.

Tylko im dłużej o tym myśle to troche chybione generować kod html (widok) w kontrolerze.
Jak znadję chwile to sprawdzę czy nie da się podstawić tam jakiegoś szablonu do wyrenderowania, chyba ze ktoś lepszy ubiegnie mnie z odpowiedzią (oby;)

Pozdrawiam
Mrok
qba_rox
w kontrolerze twojej glownej akcji:

  1. <?php
  2. $this->_helper->actionStack('top', 'menu', 'general');
  3. ?>


kod powyzej, dodaje do petli dispatchera akcje top z controllera menu w module general, ale ten kod powyzej nam nie starcza, bo mimo ze menu zostanie wygenerowane, to wynik zostanie dopisany do glownego segmentu obiektu response (content), dlatego pod koniec akcji top nalezy to zmienic, uzyjemy jednej z najlatwiejszych mozliwosci:
  1. <?php
  2. $this->render('nazwa templata, ktora moze byc nullem i wtedy bedzie wyrenderowany defaultowy dla akcji', 'nazwe segmentu, w twoim wypadki menu')
  3. ?>


oczywiscie mozna to wyszstko tak fajnie usystematyzowac uzywajac pluginow i innych magicznych sztuczek ale to inny temat. pozdrawiam

w kontrolerze twojej glownej akcji:

$this->_helper->actionStack('top', 'menu', 'general');

kod powyzej, dodaje do petli dispatchera akcje top z controllera menu w module general, ale ten kod powyzej nam nie starcza, bo mimo ze menu zostanie wygenerowane, to wynik zostanie dopisany do glownego segmentu obiektu response (content), dlatego pod koniec akcji top nalezy to zmienic, uzyjemy jednego z najlatwiejszych mozliwosci:
  1. <?php
  2. $this->render('nazwa templata, ktora moze byc nullem i wtedy bedzie wyrenderowany defaultowy dla akcji', 'nazwa segmentu, w twoim wypadki menu')
  3. ?>


oczywiscie mozna to wyszstko tak fajnie usustematyzowac uzywajac pluginow i innych magicznych sztuczek ale to inny temat. pozdrawiam
wlamywacz
Zrobiłem to w troszkę inny sposób:
  1. <?php
  2. $response = $this->getResponse();
  3. $response->insert('menu', $this->view->render('menu.phtml'));
  4. ?>
adgad
Witam, mam problem, męczę się z Zend_layout i to ładne parę dni, znalazłem taki tutorial:
http://www.goodcomputingtips.com/site/tag/zend-framework/
no i niby wszystko jest ok, niby działa jak ma działać, ale zmodyfikowałem layout.phtml:
  1. <?php echo $this->doctype(); ?>
  2. <html>
  3. <head>
  4. <?php echo $this->headTitle(); ?>
  5. <?php echo $this->headMeta(); ?>
  6. <?php echo $this->headLink(); ?>
  7. <?php echo $this->headLink()->appendStylesheet($this->baseUrl() . '/styles/default.css'); ?>
  8. <?php echo $this->headScript(); ?>
  9. </head>
  10. <body>
  11. <div id="header">
  12. <h1>ZF Basics</h1>
  13. <p><?php echo $this->layout()->navigacja; ?></p>
  14. </div>
  15. <div id="content">
  16. <?php echo $this->layout()->content; ?>
  17.  
  18. </div>
  19. </body>
  20. </html>

i teraz mam pytanie gdzie mam wczytać plik navigacja.phtml? gdzie on powinien się znajdować? czy powinien być w layouts/scripts/ czy w views/scripts/index/ czy jeszcze w innej lokalizacji? czy muszę tworzyć nowy kontroler? Bardzo proszę o pomoc.
KrzysiekWildfire
Możesz wykorzystać Zend_Navigation - możesz wczytać nawigację w Bootstrapie czy też Pluginie, w pluginie przypisujesz:
  1. class Twoj_Skrypt_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract {
  2. public function preDispatch(Zend_Controller_Request_Abstract $request) {
  3. $navigationConfig = new Zend_Config_Xml(APPLICATION_PATH.'/configs/page_navigation.xml','nav');
  4. $navigation = new Zend_Navigation($navigationConfig->toArray());
  5. Zend_Registry::set('Zend_Navigation',$navigation);
  6. }
  7. }

Jak nie wiesz, gdzie umieścić plugin, to zapytaj Google, a jak dalej nie będziesz wiedział, to pisz tutaj.
I teraz w layoucie:
  1. $this->navigation()->menu();

I powinieneś zobaczyć menu smile.gif. Oczywiście musisz jeszcze stworzyć swoją navigację, jak nie będziesz wiedział jak, to pisz.
adgad
Kłopot w tym że już google pytałem, patrzyłem na masę tutoriali, wszystkie są oczywiście w j. angielskim, po wpisaniu w google zend_layout doszedłem do 8 strony wyników smile.gif i za każdym razem wygląda to nieco inaczej, w manualu nie jest to do końca wytłumaczone, prz najmniej ja tego nie rozumiem, a tutoriale tak jak pisałem - każdy nieco inny, nieco inne sposoby na rozwiązanie problemu - wiadomo, ale działają mi te tylko co jest pozmieniane najwięcej, przez co później się pogubię, więc wolę sam od początku to zrobić, szczerze mówiąc już od tego się pogubiłem, no ale nie mogę się poddawać.
Odnośnie problemu to nie chodzi mi konkretnie o nawigację, tylko ogólnie że będę chciał w layout stworzyć coś jak:
  1. <?= $this->layout()->cokolwiek ?>

bo dla content wczytuje zawartość z pliku index.phtml, a odnosi się do tego akcja indexAction w indexController a do kolejnych takich odwołań co się odwołuje?
Dlatego proszę o pomoc w zrozumieniu tego, bo nie wiem, za każdym razem jak będę chciał dodać np:
  1. <?= $this->layout()->loginForm ?>

to muszę wszystko tworzyć jako plugin?
Bo chciałbym pojąć ten zend_layout.
CzarnyGsm
Jeżeli chciałbyś dodać do swojego layout'u przykładowo:
Kod
<?php echo $this->layout()->login ?>

Musisz najpierw utworzyć kontroler i akcję o odpowiedniej nazwie tj. kontroler np. o nazwie załóżmy "uzytkownicy" a w nim powinna znajdować się akcja o nazwie loginAction.
Po tych czynnościach masz pliczek w application/views/scripts/uzytkownicy/login.phtml. Aby wyświetliła Ci się dyrektywa echo $this->layout()->login musisz jeszcze w swoim layout'cie dodać $this->layout()->login = $this->action('login', 'uzytkownicy');. Powinno bez zarzutów pojawić Ci się zawartość login.phtml.

-edit-
Zakładam, że używasz komend Zend'a bo w innym wypadku po utworzeniu kontrolera i akcji nie będziesz miał automatycznie utworzonego pliku phtml.
Jestem początkujące, więc mogę się mylić za co z góry przepraszam, ale ja tak ten Zend_Layout obczajam.
adgad
Ok, dzięki wielkie. Sprawdzę to co napisałeś w najbliższych dniach i napiszę czy pomogło, używam oczywiście komend zenda.

Działa wszystko, zaraz poprosze moderatora o plusik za pomógł jeśli się da smile.gif, dzięki jeszcze raz, bo nawet nie wiesz ile ja szukałem rozwiązania które jest tak proste.
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.