Moduláris CMS - Codeigniter
2010-05-06T01:46:47+02:00
2010-07-14T19:53:39+02:00
2022-07-25T01:37:24+02:00
  • Üdv!

    Kicsit fejlesztgettem a CMS-t ezen a vonalon, de út közben kiderült, hogy bizonyos esetekben ütközések vannak. Ha például van az admin modulon belül egy home metódus és van egy home modul is, akkor nem találja, hogy mit kellene neki betölteni. Gondolom ez a nem megfelelő routing reguláris kifejezésnek köszönhető.

    Kicsit kutakodtam neten, és láttam, hogy már mások is készítettek Codeigniter alapú CMS-t. Ilyen például a PyroCMS. Letöltöttem, megnéztem, és tetszett az ő megoldásuk.

    Úgy oldották meg, hogy az application mappán belül létrehoztak egy modules mappát, amin belül találhatóak a rendszer nélkülözhetetlen moduljai (legalábbis a doksiban ezt írták). A fejlesztők által hozzáadható ("hozzáfejleszthető") modulok pedig a gyökér könyvtárban elhelyezett third_party mappába kerülhetnek.

    A modules mappán belül pedig modulonként külön mappába vannak rendezve. A modulokon belül pedig mintha külön Codeigniter "rendszerek" lennének. Mindegyik modulnál a hozzá tartozó modelleket, nyelvi fájlokat, helpereket külön külön tudja kezelni.

    Abban szeretném kérni a segítségeteket, hogy hogyan lehetne ezt a variációt megoldani? A lapjukon azt olvastam, hogy magához a keretrendszerhez nem nyúltak, úgyhogy nyugodtan, gond nélkül lehet frissíteni. Bogarásztam kicsit a forrását, de nem tudtam rájönni, hogy hogyan oldják meg, hogy máshol keresse a rendszer a controllereket.

    [szerk]
    Még azon gondolkodtam - bár egyenlőre még távoli a dolog - hogy ilyen moduláris bontás esetén, ha az admin modulnál szeretnék bejelentkezni, akkor a bejelentkező formot, és a felhasználó hitelesítését hogyan kéne végezni? Külön modul? (Ez a bejelentkezés természetesen a publikus felületre is vonatkozik, de az admin felületre külön jogok kellenek majd. vagyis nem kéne 2x ugyanazt megírni)
    Mutasd a teljes hozzászólást!
  • Üdv!

    Bocsánat, hogy ilyen későn reagálok, eléggé el vagyok havazva... utánanézegettem kicsit a dolgoknak, és a routing segítségével oldottam meg a problémámat.

    Egy reguláris kifejezéssel megadtam, hogy amennyiben az url-ben megtalálható az "admin", amit egy /-jel követ, mögötte pedig egy létező modulnév található (külön kiolvasom a mappákat, hogy tudjam milyen modulok vannak) akkor átirányítja a modulnév/admin.php-ba, ami a modul adminisztrációs felületéhez tartalmaz függvényeket.

    A modul mappa struktúrája
    [controllers] |-[modulnév] |-admin.php |-modulnév.php

    A modulnév.php pedig értelem szerűen a publikus felülethez tartalmaz funkciókat. Így nagyon szépen el lehet különíteni a két részt.

    Köszönöm a segítséget!
    Mutasd a teljes hozzászólást!
  • Huh, köszönöm a sok választ!

    Bocsánat, hogy csak most reagálok. Nem volt még időm sajnos elmélyedni a dologban, minden most jött össze, de ami így első ránézésre tetszett, az a routing. Amint lesz egy kis időm rálesek, és megpróbálom amiket javasoltatok!
    Mutasd a teljes hozzászólást!
  • Én is hasonló dologgal foglalatoskodok, mondjuk a kivitelezés nem teljesen ezt fedi le, de hasonló. Úgy oldottam meg, hogy az admin controllerem egy bizonyos configurációra épül (config fájl). Megvannak benne az általános törlés, módosítás.. (CRUD). Mikor az admin controller-ből meghívom a news-t, akkor betöltöm a hozzátartozó config fájlt (configs/admin/news.php). Ebben a fájlban pakoltam össze azokat az infokat, hogy mely mezők jelenjenek meg a listában, az űrlapban, milyen mezőtípusokkal, mely felhasználó szintet követeli meg, egyéb beállítások. Lényegében egy asszociatív tömb, amiben kb 20-30 elem épül fel.
    Az eltérés, hogy általánosítva van, nincsenek külön függvények "modulonként". Pl. a news-t úgy hívom meg, hogy admin/list/news.
    Ekkor a lista metódous fut le, és a news lista paramétereiből összerakja listát. Ha valami speciális dologra van szükség, akkor még be lehet kötni valamelyik metódusba a megfelelő library-t.

    Lényegében azért lukadtam itt ki, mert az összes admin menedzselés űrlapból és listából áll és minden a CRUDra épül. Így sikerült megspórolni, hogy 10* írjam le ugyanazt a kódot más osztálynévvel.
    Mutasd a teljes hozzászólást!
  • enisz: Lényegében a helper pont azt csinálná, amit kérdeztél.

    Randor ötlete nekem tetszik. Ha nem létezik egy modul, akkor lényegében 404-re fut a rendszer, szval érdemes utánanézned az említett guide-nak.
    Így másolás/törléssel meg tudod oldani az alapproblémádat.

    Viszont ha ennél többre vágysz (superadmin, aki eldönti a modulok betöltését saját adminból), akkor szükséges lehet az általam említett helper ötvözve Randor ötletével.
    Mutasd a teljes hozzászólást!
  • Ezt url config-gal nem tudnád belőni? Routing azt hiszem. A lényege az lenne, hogy az /admin -al kezdődő url-et átdobod a megfelelő modulra. Így csijnálhatsz külön admin modulokat, nem kell az egészet egy admin controllerbe tenned. Így egy könyvtárban tudnád a front és az admin controllert is tárolni.

    [szerk]
    http://codeigniter.com/user_guide/general/routing.html
    Mutasd a teljes hozzászólást!
  • Szia!

    Egészen pontosan azt szeretném elérni, hogy minden admin modult úgy tudjak elérni, hogy: www.mysite.hu/admin/modul_neve/parameterek

    Ehhez ugye egy admin controller kell. És ebből kell meghívogatnom az egyes modulokat. A modulokat, hogy hogyan és miképp tárolom az végülis mindegy, amit el szeretnék érni az az, hogy minél kevesebb forrást kelljen megpiszkálnom ahhoz, hogy ezeket hozzá tudjam adni, vagy eltávolítani. Ezért gondoltam, hogy bemásolgatni / törölni lenne érdemesebb.

    A helper, amit javasoltál az végülis egy egyszerűsített jogosultság kezelés lenne? Hogy melyik modult töltheti be, és melyiket nem?
    Mutasd a teljes hozzászólást!
  • Első olvasatra félreértettem, h mit is akartál.
    Feltételes betöltéseket, igaz?

    Fölraksz (mindig) minden modult, ami kellhet az admin funkcióhoz.
    Csinálsz egy helpert, ami egy paraméterlista alapján kezeli az egyes modulokat: engedi vagy megtagadja a betöltésüket, attól függően, hogy mit állítottál be. Természetesen a helpert minden lehetséges metódusban be kell töltened és meg kell hívnod a megfelelő paraméterekkel.

    A paraméter lista lehet egy txt-ben vagy magában az általad létrehozott helperben is.

    Remélem segített valamennyire.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Összetettebb problémával fordulok a prog.hu community-hez. Egy moduláris CMS-t szeretnék fejleszteni, a platform PHP. A Codeigniter framework segítségével képzeltem el a dolgot. Az alap elképzelésem az, hogy van egyszer egy publikus felület, amit a mezei júzer lát, amikor meglátogatja az oldalt. Ezzel természetesen nincs gond.

    A másik fele a történésnek az adminisztrációs felület, ahonnan az adatbázis tartalmát lehet módosítani (új hírek, új galériák, stb...).

    Jelenleg ezt úgy oldottam meg, hogy van egy külön Admin Controller, amiben a különböző modulok "be vannak ágyazva", ami annyit tesz, hogy külön van egy news metódus mondjuk az új hírekhez, és ezen belül elágazik a program több fele attól függően, hogy mit szeretnénk csinálni (új hírt felvenni az adatbázisba, meglévőt módosítani, esetleg törölni). Itt egy példa részlet:

    class Admin extends Controller { public function news($action, $id = false) { switch($action) { case 'new': self::_create(); break; case 'manage': self::_manage(); break; case 'modify': self::_modify($id); break; case 'delete': self::_delete($id); break; }//switch }//news }//Admin

    Ez most egy nagyon leegyszerűsített részlete az Admin Controllernek. A lényege az, hogy magán a controller-en belül létrehozok privát metódusokat amiket a böngészőbe beírva a felhasználó nem tud elérni, de "programon belülről" lehet rá hivatkozni.

    Ez természetesen működik, a maga módján pedig moduláris is. Több "modul" esetén már kicsit áttekinthetetlen a controller, másrészt "mégsem annyira moduláris". Azt szeretném elérni, hogy úgy lehessen modulokat hozzáadni vagy eltávolítani a CMS-ből, hogy magához a forráshoz ne kelljen hozzányúlni. Gondolok itt arra, hogy egy külön modules mappába egyszerűen bemásolni, vagy onnan kitörölni a kívánt modult attól függően, hogy mire van szükség. Mondjuk ha csak egy hír és egy galéria modulra van szükségem, akkor a másik 3 modult egyszerűen csak kitörlöm.

    A kérdésem az lenne, hogy ez megoldható-e valahogy, és ha igen, akkor hogyan? Mennyire terheli a szervert az, ha minden oldalletöltésnél ha egy esetleges modules mappát ki kell olvasni, a bennük található almappákkal és fájlokkal együtt, ami alapján később mondjuk össze szeretném állítani a CMS menü rendszerét?

    Vagy én bonyolítom túl mappa kiolvasásokkal? Meg lehet oldani egyszerűbben is a dolgot?

    Előre is köszönöm!

    [p.s.]
    Természetesen nem copy / paste kódot szeretnék, hanem elméleti megoldásokat. Ötleteket, van-e egyáltalán értelme egy ilyennek, vagy hogy hogyan tudnám akár egyszerűbben megoldani.
    Mutasd a teljes hozzászólást!
abcd