Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Szablon i widoki - jak połączyć i kilka innych pytań.
Forum PHP.pl > Forum > PHP > Frameworki
ShadowD
Mam ciekawe z mojego punktu widzenia pytanie związane z szablonem i widokami w zf - jak powinny być połączone? Nie chodzi tutaj o jakieś szczegóły techniczne np. funkcje! haha.gif

Mam spory problem zamysłowy, nie do końca rozumiem w jakim celu są widoki jak szablony mogą je zastąpić. Przykładowo mamy kilka stałych części strony: top, footer jakiś blok z reklamami to wszystko ląduje na stałe w szablonie i nie ma wątpliwości gdzie to podczepić.

Tutaj czas zaznaczyć, aplikacja ma mieć możliwość wgrywania i zmiany szablonów - fajnie by było by wszystkie pliki były w jednym katalogu by wkleić zmienić w adminie 1 rekord i wszystko grało.

Strona zawiera też zmienną TREŚĆ mogą być nią newsy, jakaś galeria lub zwykły tekst - to powinno wylądować w szablonie czy widoku? - Niby łatwa odpowiedz widok (mamy już problem, zmiana szablonu jest równa z zmianą plików widoku, czy tak powinno być i nie da się tego uniknąć?), teraz następna część strony po prawej kolumna, na newsach zawsze jedna, na podstronach zależy od ustawień przy jej tworzeniu - gdzi eto umieścić? - Może jako helper widoku?

Aplikacja ma zapewniać dużą konfigurację, administrator może stworzyć podstronę i wybrać w jakim charakterze będzie działać, news, tekst, galeria. (Zakładamy, że mogą istnieć dwie oddzielne galerię lub klika zbiorników na newsy).

Jak to wszytko poskładać? Czym więcej czytam książek i blogów tym więcej możliwości, każda inna i nie wiem już jaka jest słuszna.

Ps. Może maci jakąś większą aplikację którą można by zobaczyć choćby z screnów lub jest jakiś przykład w sieci np. gotowego bloga na zf?
piotr.pasich
W widoku trzymamy jak najmniejsze części/bloki , które następnie układamy w szablonie.
Szablon przetrzymuje miejsca gdzie mają być umieszczone bloki z widoków np. header, gorne menu, lewe menu, stopka, content.

Przykładowo kod szablonu wyglądałby tak :

  1. <head>...</head>
  2. <div class="header"><?= $this->layout()->header ?></div>
  3. <div class="top_menu"><?= $this->layout()->topMenu ?></div>
  4.  
  5. <div class="container">
  6. <div class="left_menu"><?= $this->layout()->leftMenu ?></div>
  7. <div class="content"><?= $this->layout()->content ?></div>
  8. </div>
  9. <div class="footer"><?= $this->layout()->footer ?></div>
  10. </body>
  11. </html>


Na pewno już widać konkretne miejsca i po nazwach od razu wiadomo, w której części strony będą się znajdować.

Teraz załóżmy że w kontrolerze Index i akcji index chcemy wstawić górne menu.

1. Do IndexController/Index wstawiamy
  1. $this->actionStack(array('action','controller','module'));
W ten sposób dodając akcję do stosu - uwaga - akcja wykonuje się dopiero na samym końcu bezpośrednio przed postDispatchem.
2. W przykładowej akcji MenuController/TopMenu dodajemy linijkę
  1. $this->_helper->viewRenderer->setResponseSegment('topMenu');

która określa, w którym bloku szablonu ma być wyświetlona akcja - standardowo jest to content.
3. Tworzymy i edytujemy odpowiedni plik widoku dla menu.


Dla elementów stałym takich jak header, stopka czy lewe menu, które dla większości aplikacji są niezmienne na każdej podstronie warto action stacki wywoływać w pluginie. Pluginy są wywoływane w bootstrapie jeszcze przed budowaniem akcji.
ShadowD
Dzięki wielkie za podpowiedz, mam jednak jeszcze takie jedno pytanko - jak wdrożyć obsługę szablonów tak by dodanie nowego było jednoznaczne z przekopiowaniem jednego katalogu?

1. Rozumiem, że jedyną metodą jest wyjęcie widoków, helperów itd. do public i po katalogowanie ich w katalogach odpowiadających nazwom szablonów, da się to zrobić lepiej może jest inna metoda wskazana?
2. Związane z poprzednim, mam problem - mam "plugin" wywoływany w bootstrap w nim chciał bym zmienić ścieżkę do widoków, ale nic się nie dzieje (jak wstawię to do kontrolera - działa), a w tej klasie mam coś takiego:
<?php
  1. class Ss_Autoconfiguration_view
  2. {
  3. public function __construct()
  4. {
  5.  
  6. $layout = Zend_Layout::getMvcInstance();
  7. $view=$layout->getView();
  8. $view->headTitle('Title site');
  9. $view->setScriptPath('/sciezka/do/pliku_widoku/:module');
  10. }
  11. }


Title się ustawia prawidłowo, a ścieżka nie działa poprawnie. :-(

Ogólnie siedzę w zend już trochę czasu i oprócz masy przydatnych rzecz zaczynam widzieć wady konstrukcyjne na obejście których wykorzystuję całą masę czasu, a i tak rozwiązania są raczej niepewne.
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.