@Zyx ma rację.
To nie takie hop siup.
Natomiast można sprawę wykonać stosunkowo łatwo, ale będą to rozwiązania dosyć sztywne na początku. Postaram się nie namotać, ale mam nadzieję, że koncept złapiesz w locie.
index-template.phtml :Kod
<div class="moduleLayerLeftBox"><?php echo $objModuleManager->getView( {idLeftBoxModule} ); ?></div>
[...]
<div class="moduleLayerRightBox"><?php echo $objModuleManager->getView( {idRightBoxModule} ); ?></div>
W kontrolerze, który uruchamiałby całość dobrze byłoby umieścić kod wykonujący się na każdej podstronie - czyli kod tworzący obiekty modułów (jako np. kolekcję) i zastępujący {idLeftBoxModule} konkretną wartością wyciągniętą z relacji bazodanowej: { table ModuleViewRelation: id / moduleId / viewElementId } gdzie moduleId to np: "News" lub wartość całkowita, a viewElementId to "moduleLayerLeftBox" i już mamy informację o powiązaniu konkretnego modułu z widokiem... a skąd ? a no z ustawień które kliknęliśmy wcześniej w naszym panelu administracyjnym i zapisali my to do bazy ;-). Czyli po zamianie w widoku byłoby tak:
Kod
<div class="moduleLayerLeftBox"><?php echo $objModuleManager->getView( 'News' ); ?></div>
[...]
<div class="moduleLayerRightBox"><?php echo $objModuleManager->getView( 'UsersList' ); ?></div>
I mamy po odpaleniu jakiegoś index.php podstawiane kody widoków dla modułów w odpowiednie miejsca szablonu. A tu kontroler:
controller.phpKod
class IndexController
{
public function __construct()
{
// utworz obiekty modułów, które ustawiłeś w konfiguracji, z listy, którą pobierzesz np. z bazy danych czy pliku XML ($arrModulesList)
$objCollectionModuleManager = new ModuleManager( $arrModulesList );
// teraz łączymy nasz widok glowny (index-template.phtml) z widokami poszczegolnych modułów podstawiając własnie takie elementy jak {idLeftBoxModule} na konkretne ID
$objModuleViewManager->mergeWithModules( $objCollectionModuleManager, "index-template.phtml" );
}
public function aboutMeAction()
{
// tutaj w zasadzie nie musimy już robic nic poza akcjami dla tej konkretnej podstrony, ponieważ mamy juz wsadzone kody widokow poszczegolnych modułów co "zrobił konstruktor"...
}
}
Rozwiązanie to jednak pozostawia wiele do życzenia. Ponieważ uzależnilismy na sztywno wybór modułu od elementu widoku: <
Kod
<?php echo $objModuleManager->getView( {idRightBoxModule} ); ?>
Innymi słowy: ModuleManager wybiera moduł i przy pomocy instrukcji warunkowej wyszukuje moduł w swojej kolekcji taki dla którego w tabeli ModuleViewRelation jest wpis w polu viewElementId == "idRightBoxModule".
I teraz nie daj pani Bogusio aby ktoś zmienił nawę tego ID w widoku i system się sypie, więc teraz należałoby wprowadzić jakieś zabezpieczenie :-). Reszty baboli nie chce mi się wymieniać wyjdą w praniu ;-). Natomiast rozwiązanie jest - i można je teraz przerabiać, dopracowywać - "small moves".
Inny sposób:
index-template.phtmlKod
<div class="idRightBoxModule"></div>
A w kontrolerze:
controller.phpKod
public function wstawWidokModuluDoSzablonu( $idDIVa, $nazwaModulu )
{
// tworzenie obiektu przy sparametryzowaniu nazwy klasy
$modul = new $nazwaModulu();
// teraz znajdz i zamien string z tagiem gdzie <div id="$idDIVa" ></div>,a $idDIVa to np. rightBoxModule
str_replace("<div class=".$idDIVa." ></div>", $module->getView(), $index-template-file-code );
}
Czaisz jakim tropem iść ?