Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Zend Layout - jak używać "layout()->content" ?
Forum PHP.pl > Forum > PHP > Frameworki
phpmack
Witam
Stworzyłem Layout strony z taką przykładową sekcją "body"
  1. <div id="page-container">
  2. <div id="header">Header</div>
  3. <div id="sidebar-a">Sidebar A</div>
  4. <div id="content">content
  5. <h1><?php echo $this->escape($this->title); ?></h1>
  6. <?php echo $this->layout()->content; ?>
  7. </div>
  8. <div id="footer">Footer</div>
  9. </div>
  10. </body>


Sama aplikacja posiada standardowo domyślny idexController w którym będą akcje odpowiadające za generowanie głównej treści strony,
oraz dodatkowo utworzyłem usersController w którym będą akcje odpowiadające za logowanie wylogowywanie rejestracje itp....

i problem teraz mam taki skąd wziąć "drugi" $this->layout()->content; który bym mógł wrzucił np. do <div id="header"> i który by mi dynamicznie uzupełniał widok tego diva w zależności od "stanu" aplikacji czyli wyświetlał by formularz do logowania a po zalogowaniu np. "jesteś zalogowany jako Janek" - zgodnie z widokami wywoływanymi z usersController.

Wy-googlowałem i przewałkowałem kilka sposobów jedne działają, inne nie działają, są proste sposoby, są też bardziej skomplikowane A moje pytanie brzmi jak to zrobić "po bożemu". Jestem nowicjuszem i nie bardzo rozumie niektóre metody - modyfikowanie iluś tam plików dodawanie pluginów rejestrowanie nowych hellperów, dodawanie wraperów itd... poco to wszystko kiedy mi jest po-prostu potrzebny kolejny "$this->layout()->content" questionmark.gif?

mam nadzieje że w miarę jasno przekazałem o co mi chodzi biggrin.gif
Pozdrawiam



batman
Sposobów jest kilka.
1. W kontrolerze zapisujesz do zmiennej layoutu to, co chcesz wyświetlić, a w samym layoucie wstawiasz echo $this->layout()->twoja_zmienna.
2. Korzystasz z metody render (Zend_View) i renderujesz skrypt widoku, np. echo $this->render('header.phtml')
3. Piszesz helper widoku i wywołujesz go w layoucie - echo $this->twojHelperWidoku()

W Twoim przypadku najlepszym rozwiązaniem będzie helper widoku, ponieważ możesz w nim sprawdzić, czy użytkownik jest zalogowany i wyświetlić odpowiedni skrypt widoku.
webmaniak
Dorzucę tu swoje zdanie, sam jestem początkującym w zendzie, więc też szukałem sposobów na Zend_Layout. Rozwiązanie udzielił użytkownik z tego forum:) Wygląda to tak że masz:
  1. <body>
  2. <div id="page-container">
  3. <div id="header">Header</div>
  4. <div id="sidebar-a">Sidebar A</div>
  5. <div id="content">content
  6. <h1><?php echo $this->escape($this->title); ?></h1>
  7. <?php echo $this->layout()->content; ?>
  8. </div>
  9. <div id="footer"><?php echo $this->layout()->footer; ?></div>
  10. </div>
  11. </body>

By stworzyć $this->layout()->footer; powinieneś utworzyć kontroler np. footer i akcję footer. Dodatkowo w layoucie powinieneś dodać:
  1. $this->layout()->signin = $this->action('footer', 'footer');

więc layout dla tego przykładu wygląda:
  1. <body>
  2. <div id="page-container">
  3. <div id="header">Header</div>
  4. <div id="sidebar-a">Sidebar A</div>
  5. <div id="content">content
  6. <h1><?php echo $this->escape($this->title); ?></h1>
  7. <?php echo $this->layout()->content; ?>
  8. </div>
  9. <div id="footer"><?php $this->layout()->signin = $this->action('footer', 'footer');
  10. echo $this->layout()->footer; ?></div>
  11. </div>
  12. </body>

Oczywiście nazwa kontrolera może być inna. To jest jak sądzę sposób 1., który napisał batman, nie wiem w jakim stopniu jest z nim poprawny, w każdym razie działa. oczywiście będziesz miał też plik footer.phtml w views/scripts/footer i tam należy dać zawartość stopki.
phpmack
Cytat(webmaniak @ 31.10.2011, 19:03:08 ) *
Dorzucę tu swoje zdanie, sam jestem początkującym w zendzie, więc też szukałem sposobów na Zend_Layout. Rozwiązanie udzielił użytkownik z tego forum:) Wygląda to tak że masz:
  1. <body>
  2. <div id="page-container">
  3. <div id="header">Header</div>
  4. <div id="sidebar-a">Sidebar A</div>
  5. <div id="content">content
  6. <h1><?php echo $this->escape($this->title); ?></h1>
  7. <?php echo $this->layout()->content; ?>
  8. </div>
  9. <div id="footer"><?php echo $this->layout()->footer; ?></div>
  10. </div>
  11. </body>

By stworzyć $this->layout()->footer; powinieneś utworzyć kontroler np. footer i akcję footer. Dodatkowo w layoucie powinieneś dodać:
  1. $this->layout()->signin = $this->action('footer', 'footer');

więc layout dla tego przykładu wygląda:
  1. <body>
  2. <div id="page-container">
  3. <div id="header">Header</div>
  4. <div id="sidebar-a">Sidebar A</div>
  5. <div id="content">content
  6. <h1><?php echo $this->escape($this->title); ?></h1>
  7. <?php echo $this->layout()->content; ?>
  8. </div>
  9. <div id="footer"><?php $this->layout()->signin = $this->action('footer', 'footer');
  10. echo $this->layout()->footer; ?></div>
  11. </div>
  12. </body>

Oczywiście nazwa kontrolera może być inna. To jest jak sądzę sposób 1., który napisał batman, nie wiem w jakim stopniu jest z nim poprawny, w każdym razie działa. oczywiście będziesz miał też plik footer.phtml w views/scripts/footer i tam należy dać zawartość stopki.


No właśnie też to testowałem i nie działa to tak jak bym oczekiwał dodanie "na sztywno" echo $this->layout()->footer; powoduje że zawsze będzie widoczna zawartość widoku footer.phtml w którym jest formularz albo button zaloguj itd... mój kontroler składa się z trzech akcji i trzech widoków w zależności od stanu ma wyglądać inaczej np.użytkownik jest nie zalogowany to z automatu wyświetla się "zaloguj" oraz formularz, po zalogowaniu znika zaloguj (bo poco ma być widoczne) i pojawia się "jesteś zalogowany jako Stefan" i button wyloguj...

Ale z tego co już przejrzałem nie da się tego osiągnąć w tak prosty sposób - a tak właśnie działa helper $this->layout()->content; gdzie zawsze dostajemy "aktualny" widok po wykonaniu akcji wystarczy go wkleić do diva
tvister
Dopisując się do sposobów @batmana:

4. Zrób kilka layout-ów i podmieniaj w init kontrolera
5. Napisałeś że jesteś początkujący więc ten punkt może być "Rocket science" :-p
zostawić "footer" w layout i w razie potrzeby dodawać na actionstack akcje z placehoderem "footer".
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.