Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: skrypt podzielony na moduły
Forum PHP.pl > Forum > PHP > Object-oriented programming
1q2w3e4r
Witam,
Mam w planach stworzenie skryptu silnika stron, dzięki któremu będę mógł tworzyć każdą inna stronę (niezależnie jaka tematyka) zaczynając od niego.
Czyli musi być skrypt który czyta te moduły z odpowiedniego katalogu, np. "moduly", możliwość instalowania/odinstalowania danego modułu. Po przeczytaniu takiego modułu musiałby wyświetlić je w odpowiednim miejscu na stronie.
Nie wiem własnie jak z tym zastartować, jak to musi wyglądać? Założenie jest takie, że będzie on modularny. Czyli piszę jakiś moduł i on działa odpowiednio w skrypcie, każda funkcja skryptu to był by właśnie moduł (moduł 1: rejestracja,logowanie, moduł 2: newsy - itp).
Byłbym wdzięczny za podrzucenie mi jakiegoś skryptu, który własnie jest tak zbudowany i mógłbym sobie zobaczyć działanie i jak jest skonstruowany.

Z góry dzięki za pomoc.
Crozin
Pisanie czegoś takiego od podstaw to naprawdę ogrom roboty - czy nie lepiej byłoby wykorzystać jakiś istniejący CMS, który by spełniał Twoje oczekiwania co do modularności i tworzyć w oparciu o niego?
1q2w3e4r
Może i dużo roboty ale chciałbym się więcej nauczyć. Sama obsługa modułów nie będzie chyba rozbudowana. Najwięcej czasy na pewno zajęlo by pisanie modułów.

Dalej w takim razie proszę o jakieś porady lub przykład samego takiego silnika.
Hoku
popatrz sobie w źródło Drupala.

wiele cms wczytuje listę modułów za pomocą przeglądania katalogu modules dla przykładu

app
→modules
►news
►map
►newsletters
...
→plugins
→etc
admin
→modules
►news
►map
►newsletters
...
→plugins
→etc
templates

kontrola stanu modułu w bazie danych
wyświetlanie na wybranych stronach np za pomocą drzewa tak jak w przypadku menu smile.gif
dojdzie ci tez kontrola położenia widoku modułu w templatce
Zyx
Właśnie najwięcej czasu to Ci zejdzie z samym mechanizmem obsługi modułów. Tobie się wydaje, że to jest proste "skopiuj pliki, wgraj strukturę bazy, gotowe", a to nieprawda. Jeśli to ma działać, w aplikacji musisz też przewidzieć punkty rozszerzania, czyli miejsca, które takie wtyczki będą mogły wypełniać. Przewidzenie i dobre zaprojektowanie interfejsu programistycznego do nich jest sztuką i bardzo łatwo tu się wkopać z pominięciem jakiegoś ważnego przypadku. Konieczna jest umiejętność patrzenia na problem z wielu różnych perspektyw, bo ilu programistów, tyle będzie sposobów wykorzystania mechanizmu. Do tego dochodzi kwestia obsługi zależności, rozwiązywanie konfliktów, organizacja plików, a nawet takie prozaiczne rzeczy, jak zabezpieczyć instalator i system przed błędem w czasie instalacji.

Dlatego osobiście jeśli nie radzisz sobie dobrze z obiektówką, projektowaniem i myśleniem analitycznym, radziłbym Ci póki co odłożyć ten temat i wrócić do niego nieco później. Nie ucieknie Ci on, a wiedza Ci się na pewno przyda.
LSM
@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.php
Kod
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.phtml
Kod
<div class="idRightBoxModule"></div>

A w kontrolerze:
controller.php
Kod
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ść ?
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.