Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zarządzanie modułami serwisu
Forum PHP.pl > Forum > PHP
AcidBurnt
witam

temat pewnie się gdzieś juz na forum pojawil, ale uzywajac wyszukiwarki, pod hasłąmi moduły, zarzadzanie itp nic ciekawego nie znalazlem zatem otwieram ten temat

po raz koleiny stanolem przed napisaniem sredniej wielkosc aplikacji, tym razem dla biura nieruchomosci

no i po raz kolejny stwierdziłem ze rozwiazanie z poprzedniego projektu nie za bardzo mi sie podoba i szukam czegos nowego winksmiley.jpg

chodzi o zarzadzanie modułami serisu, wiec tak w poprzednim projekcie robiłem tak

katalog

Kod
./modules


w nim

Kod
/module_name


no i dla przykładu module_name to zarzadzanie użytkownikami, no i tutaj dodawanie, usuwanie, edycja, niektore polaczene w 1 plik inne nie...

dla przykladu

Kod
card.php /* drukowanie wizytowek */
change_parent.php /* zmiana rodzica, osobno bo troche operacji calosc oparta na drzewkach metoda depesza*/
delete_user.php /* usuwanie usera */
reg_unreg.php /* rejestracja niezarejestrowanyc (ma to sens uwiezcie na slowo;p) */
user_add.php /* dodawanie */
user_logs.php /* logi */
user_search.php /* szukaj, i tutaj ukryta edycja, przegladanie itp... */
users_money.php /* pieniadze z prowizji */


no i tak jak widac dosc spory balagan np edycje mozna by wywalic do osobnego pliku

no i teraz tak sprawa z pokazaniem tego w jakims menu... no wiec tak, skrypt pobiera z bazy te moduly ktore dodane, przechowuje tam nazwe pliku, nazwe jaka ma byc wyswietlona, i ID modułu. no i pobieram z bazy wszyskie dodane moduly, sprawdzam czy user ma dostap czy nie i jak tak to pokazuje jak nie to nie pokazuje

no i mniej wiecej tak wyglada pokazanie modulu:

  1. <?php
  2. if(isset($_GET["module_id"]) && !empty($_GET["module_id"]) && is_numeric($_GET["module_id"])){
  3. $module_id = trim($_GET["module_id"]);
  4. if($premission -> check($module_id, $db)){
  5. include("./modules/".trim($db -> GetOne("SELECT module_name FROM temida_modules WHERE module_id = (SELECT module_parent FROM temida_modules WHERE module_id = ".$module_id.")"))."/".trim($db -> GetOne("SELECT module_name FROM temida_modules WHERE module_id = ".$module_id."")).".php");
  6. }else{
  7. $smarty -> assign('tpl_name', no_permission);
  8. }
  9. }
  10. ?>


sam chyba za bardzo nie wiem co jest tutaj napisane, i nie jestem w stanie tego jakos prosto przeniesc do nowego projektu... ;/

no i nie wiem zarzadzanie tym wydaje mi sie odrobine toporne, jak wrzuce jakis nowy modul na serwer, musze wejsc do admina dodac go do menu, itp

no i teraz mysle nad jakism sprawniejszym rozwiazaniem tylko nie za bardzo wiem jak to lepiej rozwiazac

moze ktos z was ma jakis pomysl, albo u Siebie macie inne rozwiazania ktore w/g z was za bardziej efektywne

sorki za dluuugi topik

pozrawiam
pawel_k
ja robie to w następujący sposób (sposób bardzo uproszczony):
index.php
  1. <?php
  2. try
  3. {
  4. $objDisp = new Dispatcher();
  5. }
  6. catch(SQLException $e1)
  7. {
  8. //logowanie błędów itp., przenoszenie
  9. }
  10. ?>


a klasa dipatcher to w duzym skrócie coś takiego:
  1. <?php
  2. class Dispatcher
  3. {
  4.  private $strHandle;
  5.  
  6.  public function __construct()
  7.  {
  8.  if(!empty($_GET['event']))
  9.  {
  10.  $this->strHandle = $_GET['event'];
  11. }
  12. else
  13. {
  14. //domyslne zdarzenie
  15. }
  16. $this->handle_the_event();
  17.  }
  18.  
  19. private function handle_the_event()
  20.  {
  21. try
  22. {
  23. $strClassName = 'Handler_'.ucfirst($this->strHandle);
  24. $objEvent = new $strClassName();
  25. if($objEvent instanceof Handled)
  26. {
  27. $objEvent->handled_event();
  28. }
  29. else
  30. {
  31. header('Location: index.php');
  32. }
  33. }
  34. catch(Exception $e) {
  35.  throw $e;
  36. }
  37.  }
  38. }
  39. ?>

jak mozna wywnioskowac kazdy moduł musi dziedzczyć po abstrakcyjnej klasie Handled (w ktorej jest wymuszanie napisania metody handled_event ). moduły ładuje autoloader, do obsługi bazy danych i smarty mam statyczne nakladki opierające sie na singelthone, tak samo jak glowne klasy odpowiedzialne za usera itp.
wszystko to mozna bardzo latwo obudować o dodatkowe rzeczy, jest bardzo wygodne i ogolnie cacy (przynajmniej nic lepszego nie wymyslilem tongue.gif )
bigZbig
@pawel_k - stosuje podobne rozwiazanie co Ty tylko, ze to jest przepis na obsluge zdarzen, a nie na zarzadzanie modulami - przynajmniej nie pelny przepis.
AcidBurnt
dokłąnie to juz sama zarzadzanie zdazeniami, a mi chodzi o zarzadzanie plikami na serwerze chociaz to tez sie przyda winksmiley.jpg
slavo
No to moze tak, jak rozmawialismy uklad w stylu:

moduleName.class.php - główny plik modułu. klasa go obsługujaca
moduleName.data.class.php - metody klasy ktore obsługuja pobieranie danych,
z bazy, $_POST, $_GET
moduleName.action.php - poszczegolne akcje na moule takie jak dodaj, usun
edytuj, itp... korzystaja z metod zawartych w moduleName.class.php
moduleName.template.tpl - główny plik z szablonem dla modułu
moduleName.action.template.tpl - szablony dla poszczegolnych akcji

wywolywaniem konkretnie akcji, ładowniem odpowiedniego pliku zajmuje sie
zewnetrzna klasa obsługujaca $_GET, $_POST...

czy jednak za bardzo rozdrobnione.. ?
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.