[php] Systemy modułowe

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
Wankster
Nowy
Nowy
Posty: 40
Rejestracja: ndz mar 23, 2003 12:36 am
Lokalizacja: Polska
Kontakt:

[php] Systemy modułowe

Post autor: Wankster »

Witam,

Chciałbym się dowiedzieć, jak i czy w ogóle piszecie swoje większe aplikacje modułowo? Chodzi mi o sposób dzięki, któremu można wyświetlać na jednej stronie kilka modułów jak i jeden, np. na stronie głównej wyświetlać moduł newsy, top10, katalog stron WWW, a jak się kliknie na link, ktorychś z tych modułów to już pracujemy tylko w nim (?module=nazwa_modulu).

Ja sobie tak pisze, pisze w swoim systemie... i natknąłem się na problem :( Otóż wszystko pisze sobie, pisze ;) obiektowo i mam klase 'modules', w której znajduje się między innymi metoda 'loadModules'. Pobiera ona z tabeli dane o modułach, które mają się wyświetlać na stronie głównej później w pętli uruchamiana jest metoda loadModule i jako parametr ma nazwę modułu, pobraną wcześniej z bazy danych. Metoda loadModule sprawdza czy Uzytkownik, który odpalił stronę ma uprawnienia do oglądania go, jeżeli tak to dołącza klasę modułu

Kod: Zaznacz cały

include_once( './modules/' . $nazwa_modulu. '/index.php' );
a następnie odpala ją (zmienna $moduleName pochodzi z pliku index.php modułu i zawiera nazwę klasy, a drugi parametr: true = moduł pokazywany na stronie głównej; false = moduł NIE pokazywany na stronie głównej)

Kod: Zaznacz cały

new $moduleName( $this, true  );
A to jest struktura klasy z pliku index.php modulu:

Kod: Zaznacz cały

<?php

   $moduleName = 'example';

   class example
   {
      function example( &$mcms, $showStartPage )
      {
         if ( $showStartPage )
         {
            return $this->showStartPage( $mcms );
         }

         $mcms->setOutput( 'test' );
      }

      function showStartPage( &$mcms )
      {
         $mcms->setOutput( 'testowy moduł' );
      }
   }

?>
No i prawie wszystko działa. Jak odpalam jeden moduł (?module=example) to jest wyświetla mi 'test', tak jak powinno, ale jak wejdę na stronę główną, w bazie mam np. dwa rekordy określające jakie moduły mają się znaleźć na stronie głównej i tu już jest problem :) Odpalana jest metoda loadModules robi się pętla, ale... no ale tylko raz :( Dostaje wynik TYLKO JEDNEGO pierwszego modułu, a dalsze moduły się nie uruchamiają bo pętla zostaje zamknięta... Czemu? Oto jest moje pytanie ;)

Jak są jakieś niejasności to proszę pytać :roll:

P.S.
Zauważcie, że do każdej metody modułu przekazywać musze obiekt 'silnika', który zawiera wszystkie podstawowe funkcję, a to nie jest zbyt wygodne. Dlatego też proszę Was abyście przedstawili także swoje sposoby na systemy modułowe ;)
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Wszystko powinieneś obsługiwac za pomoca prostej kolejki... użyj tablicy do której odpowiedni moduł będzie ładował zadania do wykonania, a nastepnie inny będzie je odpalał. Co do tego że główną klasę dołączasz tyle razy to faktycznie niezbyt ekonomicznie, powinieneś załadowac ją tylko raz, ale uważam że zwykła kolejka rozwiąże twoje problemy.

Jeżeli będziesz dalej miał problemy to pytaj... :-D

Dodaj w tytule postu: [PHP]
Killer
Posty: 10
Rejestracja: śr lip 09, 2003 7:44 am

Re: [php] Systemy modułowe

Post autor: Killer »

Witam
Ja mam troche inne instrukcje załadowania wszystkich modułów. Mój portal składa się z 5 części i do każdej z nich można dodać moduł jaki sie chce. Te części to nagłówek, lewa strona, glówna treść, prawa strona i stopka. Do każdej części można dodać gniazda które przechowywują id modułu, nazwę, i umiejscowienie na stronie, który ma się wyświetlić jak wszystkie instrukcje zostaną wykonane. Kawałek kodu wygląda tak:

Kod: Zaznacz cały

$zapytanie = "SELECT g.*, m.* FROM ".TABLICA_GNIAZDA." g, ".TABLICA_MODULY." m WHERE gniazdo_modul_id = m.modul_id";

if( $konfiguracja['stan_portalu'] == true )
{
     $wynik_sql = mysql_query($zapytanie);

     while($wiersz = mysql_fetch_array($wynik_sql, MYSQL_ASSOC))
     {
          $MIEJSCE = $wiersz['gniazdo_umiejscowienie'];
          $SPECJALNE = $wiersz['gniazdo_specjalne'];
          include($glowna_sciezka.'moduly/'.$wiersz['modul_plik']);
     }
}
i działa bardzo dobrze ale może ktoś będzie maił lepsze propozycje :)
Wankster
Nowy
Nowy
Posty: 40
Rejestracja: ndz mar 23, 2003 12:36 am
Lokalizacja: Polska
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wankster »

Wojtek: Po napisaniu posta wyłączyłem Internet, załączyłem serwer... i udało się! Przypomniałem sobie, że moja klasa do obsługi bazy danych zawiera metodę fetch_rowset, która zwraca właśnie taką 'kolejke', później wsadziłem to do pętli FOR i... zadziałało... straciłem na to kilka tygodni. Ale to pewnie nowe WI tak na mnie działa :lol:

A obiekt silnika przekazuje referencyjnie do każdej ffunkcji bo jakbym rozszerzył klase modułu o klase module (extends) to uruchamiana by była od nowa klasa engine, a z tym: ponowne łączenie z bazą, sesje, i nie zliczanie w całość wszystkich np. wykonanych zapytań :(

P.S.
W tytule posta jest [php] ;)
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Nie wiem jaką chierarchię ustaliłeś w swoim systemie dziedziczenia, ale podejżewam że da się ją tak rozgałęzić aby odseparować potrzebną klasę. Nie wiem jak wygląda kod, ale jeżeli to nie wypali to więcej bez kodu nic nie poradzę.

PS cieszę się że mogłem pomóc :-D
Wankster
Nowy
Nowy
Posty: 40
Rejestracja: ndz mar 23, 2003 12:36 am
Lokalizacja: Polska
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wankster »

engine extends sessions_manager
module extends engine

w engine uruchamiam także sql_layer, templates_manager, input_vars, itp. :D

a w index.php daje $_MCMS = new module(); później jeżeli jest podana nazwa modułu to $_MCMS->loadModule();, a jak nie - to wyświetlają sie moduły na stronie głównej $_MCMS->loadModules();

:roll:
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Nie wiem co zawierają poszczegulne klasy... Same nazwy mi mało mówią... Trudno powiedzieć, dobrze by było abys rozrysował jak działa twoje jądro i pokazał, wtedy może bym pomógł...
Wankster
Nowy
Nowy
Posty: 40
Rejestracja: ndz mar 23, 2003 12:36 am
Lokalizacja: Polska
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wankster »

engine.php

Kod: Zaznacz cały

<?php

   // dolaczanie bibliotek

   class engine extends sessions_manager
   {
      var $db;
      var $session;

      // vars...

      var $IN;
      var $OUT;

      function engine()
      {
         $this->db = new sql_layer();
         $this->IN = new input_vars();

         $this->sessions_manager();
      }

      // metody
   }

?>
class.sessions_manager.php

Kod: Zaznacz cały

<?php

   class sessions_manager
   {
      // vars...

      function sessions_manager()
      {
         // dzialanie konstuktora
      }

      // metody
   }

?>
class.modules_manager.php

Kod: Zaznacz cały

<?php

   class module extends engine
   {
      var $modules    = array();
      var $moduleName = '';
      var $moduleFile = '';

      function module()
      {
         $this->engine();

         $this->getModule();
      }

      // pobiera z adresu jezeli jest nazwe modulu i plik
      // i zapisuje do moduleName i moduleFile
      function getModule() {}

      function loadModule( $moduleName = '', $showStartPage = FALSE )
      {
         if ( empty( $moduleName ) )
         {
            $moduleName = $this->moduleName;
         }

         include_once( './modules/' . $moduleName . '/index.php' );

         new $MODULE_CLASS( $this, $showStartPage );
      }

      function loadModules()
      {
         // pobranie modulow na strone glowna
         $row = array(); //tablica z modulami
         $rows = count( $row ); // ilosc modulow

         for ( $i = 0; $i < $rows; $i++ )
         {
            $this->loadModule( $row[ $i ]['module_name'], TRUE );
         }
      }
   }

?>
modules/example/index.php

Kod: Zaznacz cały

<?php

   $MODULE_CLASS = 'example';

   class example
   {
      var $moduleName = 'example';

      function example( &$mcms, $showStartPage )
      {
         if ( $showStartPage )
         {
            return $this->showStartPage( $mcms );
         }

         // so = alias do setOutput
         $mcms->so( $this->moduleName . ' loaded' );
      }

      function showStartPage( &$mcms )
      {
         $mcms->so( $this->moduleName . ' loaded on home page' );
      }
   }

?>
-- pisane od ręki

Robiłem tak, że rozszerzałem klase modułu example (example extends module) przez klase module i wtedy było by pięknie... Ale przypomniało mi się, że mam zamiar zrobić, że na stronie głównej może być kilkanaście modułów i wtedy to byłby problem :)

P.S.
Ja sobie martwiłem, że mój system ma już 9 zapytań SQL, a jak odpaliłem cms Xaraya to szczęki padły... ponad 100 zapytań wykonuje na samej stronie głównej!!!
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Myślę że trochę za dużo klas... Można to na pewno uszczuplić. A wyjściem może być użycie tablicy jako kolejki i powiązanie z Smarty, wszystko będzie działało pięknie jak dodasz dodatkowy moduł który by eksportował zmienne do Smarty... i problem będzie z głowy. Myślę że obawiałes sie stworzyć jednął dużą klasę, ale to lepsze niż tworzenie wielu małych... :-D
Wankster
Nowy
Nowy
Posty: 40
Rejestracja: ndz mar 23, 2003 12:36 am
Lokalizacja: Polska
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wankster »

Za dużo? Hmmm... nie lubie bałaganu, a poza tym jak patrze na zagraniczne CMS to tam dopiero 8O Na przykład dla jednego element formularza (pole np. hidden) tworzona jest klasa :) Wszystko w marię szybko działa :) A ze Smarty się dawno temu bawiłem i nie udało mi się czegoś tam zrobić... zrezygnowałem :roll: Mam kilkakrotnie mniejszą klase, ale także badzo dobrą i szybką 8)

P.S.
I tak to nie są wszystkie i pełne moje klasy, te które zapodałem na forum :wink:
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Więc skoro nadal masz problem, namawiam abyś stworzył sensowną kolejkę, która by przechowywała zadania, a nastepnie po kolei podawała do wykonania... Przecież ja to mówiłem, a jeżeli masz problemy ze Smarty (przecież to proste :-D ) to odsyłam do artykułu:

http://www.webinside.pl/php/artykuly/65
Krzysztof Aszkiełowicz
Zaczyna działać
Zaczyna działać
Posty: 458
Rejestracja: pn maja 26, 2003 9:29 pm
Lokalizacja: Warszawa
Kontakt:

Re: [php] Systemy modułowe

Post autor: Krzysztof Aszkiełowicz »

Ja nic nie będę komentował ale sytsem modułowy mam zrobiony w "zwykłym" PHP.
Co rozumiem przez "zwykły", ano to, że kod nie jest oparty na obiektach.
Moim zdaniem lepiej działa, chociaż nie mogę przedstawić kodu, ani wyjjaśnic działąnia, bo jest oparty on na rozwiązaniach komercyjnych (oczywiście moich :P)

Ale jak patrze Wankster to nie jest źle 8)
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Krzysztof Aszkiełowicz pisze: Co rozumiem przez "zwykły", ano to, że kod nie jest oparty na obiektach.
Moim zdaniem lepiej działa...
Tutaj można by dyskutować, z tą wydajnością to jest zależnie od skonstruowanych obiektów. Przy 200 lub 300 liniach kodu tego nie widać, może byc nawet gożej, ale przy 800 juz to mozna zauważyc (chociaż nie zawsze).

Pozatym eksploatacja kodu strukturalnego jest nie wygodna, zajmuje więcej miejsca i jest mniej uniwersalny. W PHP 4 obiekty nie są jeszcze na takim poziomie jak bycmy chcieli, ale w PHP 5 są już destruktory, określanie elementóe private i public... to daje na prawde duże możliwości, zwłaszcza jeżeli chodzi o poważne projekty, więc namawiam do kożystania z obiektów. :-D
Krzysztof Aszkiełowicz
Zaczyna działać
Zaczyna działać
Posty: 458
Rejestracja: pn maja 26, 2003 9:29 pm
Lokalizacja: Warszawa
Kontakt:

Re: [php] Systemy modułowe

Post autor: Krzysztof Aszkiełowicz »

Zgadzam się że PHP oznaczony numerkiem 5 jest bardziej przystosowany do obiektów, ale nie jestem do nich przyzwyczajony, nie wiem dlaczego, ale jakoś wole kod strukturalny. A co do modułow ( bo to o tym temat). Skrypt do modułów zajmuje okoló 60 linjek z copyrightem który zajmuje około 10 więc to chyba nie dużo?
Pozdrawiam :)
Wojciech Jurewicz
Przelotem
Przelotem
Posty: 274
Rejestracja: wt lip 22, 2003 11:29 pm
Lokalizacja: Mazury
Kontakt:

Re: [php] Systemy modułowe

Post autor: Wojciech Jurewicz »

Krzysztof Aszkiełowicz pisze:Skrypt do modułów zajmuje okoló 60 linjek z copyrightem który zajmuje około 10 więc to chyba nie dużo?
Nie, ale przy tak małym skrypcie. Jest tak mały że podejżewam że nie zachodzi tam potrzeba ponownego wykożystania kodu...

Ale proponuję abyśmy trzymali się tematu. :-D
ODPOWIEDZ