Kwestia ladowania modulow w poszczegolne miejsce

0

Witam chcialem dowiedziec sie jak w coyote-cmf rozwiazujesz ladowanie do poszczegolnych blokow strony.

Powiedzmy ze mamy bloga i mamy block content i menu(po lewej stronie) cos takiego


content | |
| |
| |
________|____|

Teraz powiedzmy ze jestesmy na glownej stronie i do bloku content ladujemy komponent news'ow ktory wyswietla ostatnie news'y i np jakies inne komponenty a np w bloku menu mamy komponent logowania(lub profilu w przypadku gdy user jest zalogowany)

I teraz mam pytanie przechodzimy na strone kontaktu wtedy w bloku content nie bedziemy mieli juz wczesniej zaladowaych komponentow lecz tylko komponent kontaktu a blok menu zostanie nieruszone.

U mnie url wygladaja tak:
index.php/Home,Index,Index/parametry
Gdzie Home to glowny frontcontroller ten ktory wybiera glowny layout
Index to metoda wywolywana w glownym frontcontrolle'rze
Index to aktualna metoda wykonywana przez komponenty gdy maja dana metode wykonuja ja w przeciwnym wypadku defaultowa akcja jest Index().

I teraz zastanawiam sie jak oprzec ladowanie komponentow.

Ladowac je na podstawie nazwy frontcontrollera czy na podstawie glowej akcji frontcontrollera

Na akcjach wydaje mi sie lepiej uniknie powielania kodu w wielu frontcontrollerach.

I teraz przypuscmy ze mam:
index.php/Contact,Index,Index czyli laduje frontcontroller Contact ktory wykonuje jego akcje Index w ktorej laduje poszczegolneg komponenty do glownego widoku i go wyswietlam.Wtedy laduje komponenty na podstawie pierwszego czlona w url(Home) patrz Module_Plugin_Model w twoim projekcie

Lub
index.php/Home,Contact,Index
Analogicznie jak wyzej tylko wtedy laduje moduly na podstawie akcji czyli 2 czlona w url i mam mniej frontcontroellow...

Analizuje twoj kod jednak nie potrafie do konca zrozumiec jak ty to robisz a moje rozwiazanie ma pro i contro.

1

Coz, dokumentacji do projektu poki co praktycznie nie ma :P Wiec byc moze ciezko zrozumiec idee i architekture.

Na samym poczatku wazne, aby zrozumiec, ze kazda podstrona na 4programmers.net ma swoje odzwierciedlenie w bazie danych, w tabeli page [#]_. Kazdy rekord w tabeli page moze miec rodzica. Tak wiec rodzicem tego watku jest strona Coyote, a tej z kolei - Forum. Forum nie ma zadnego rodzica. Dzieki temu mozemy w prosty sposob konstrulowac drzewo stron w calym serwisie. Zaleta takiego rozwiazania jest to, ze dla kazdej ze stron mozna przypisywac rozne uprawnienia, ustawienia. Np. mozemy dana strone wylaczyc/wlaczyc, ustawic cachowanie, ustawic specyficzny kod CSS, czy meta tagi i itp itd.

**Moduly **sa elementami systemu (np. forum, modul Nowosci, modul Pastebin, modul generowania mapy strony), ktore sa ladowane w "jadrze" i stanowia w tym momencie integralna czesc systemu.

**Pluginy **sa elementami ktore nie moga dzialac samodzielnie. Moga natomiast byc dolaczane do modulow. I tak np. plugin komentarzy jest dolaczony do modulu Nowosci. Tym samym ustawienia pluginu komentarzy (takie jak Zezwalaj na pisanie anonimowym uzytkownikom, Zezwalaj na uzycie podstawowych znacznikow HTML) sa dolaczone do danego modulu. Dzieki temu, w module Nowosci moga istniec inne ustawienia komentowania niz w module Wiki (ktory umozliwia pisanie artykulow zarejestrowanym userom). Dodatkowo, ustawienia pluginu komentarzy sa widoczne dla kazdej strony, ktora ma swoj rekord w tabeli page. Dzieki temu mozemy ustalic indywidualne ustawienia komentowania dla kazdej ze stron.

Regiony sa miejscami w szablonie. Coyote-CMF funkcjonuje w oparciu o architekture MVC. Tak wiec w takim szablonie, w kodzie HTML deklaruje regiony. Standardowo sa naglowek, stopka oraz content. W te regiony mozna dolaczac bloki. Kazdy region moze zawierac w sobie wiele blokow, ktore ustawia sie w panelu administracyjnym. Mozemy ustawic rowniez kolejnosc wyswietlania tych blokow.

**Bloki **posiadaja swoje wlasne ustawienia. Mozemy ustawic cachowanie tych blokow, uprawnienie potrzebne aby dany blok wyswietlac czy ustawic grupy dla ktorych dany blok ma byc widoczny. Blok moze zawierac po prostu kod HTML/CSS, moze rowniez zawierac w sobie plugin. Tak wiec, to co u Ciebie nazywane jest modulem - nas: pluginem. Czyli np. tworzymy nowy blok i ustawiamy, aby zawieral w sobie plugin komentarzy. Caly blok z kolei przylaczamy do regionu - content. Mozemy sterowac, na jakich stronach dany blok ma sie wyswietlic lub nie. Podajemy to w formie URLi, czyli np. /Delphi/* powoduje wyswietlenie danego bloku pod sciezka /Delphi oraz stronami potomnymi. I to tyle. Nie ma jednak w bazie danych polaczenia pomiedzy wyswietlanym blokiem a strona. Chcialbym to zmienic w wersji 1.1 :P

Zdaje sobie sprawe, ze na poczatku moze to wydawac sie trudne do zrozumienia, tak wiec w razie czego - pytaj.

.. [#] Istnieja wyjatki od tej reguly. Np. panel uzytkownika nie jest strona w rozumieniu systemu, tzn. nie ma rekordu w tabeli page, ktory odzwierciedlalby panel uzytkownika i jego ustawienia.

0

Elo.

A wiec jesli dobrze cie rozumiem to u ciebie Region to jest u mnie to samo co Blok czyli czesc strony, np stopka,prawe menu,content strony,menu nawigacyjne.

W te Regiony ladyjesz poszczegolne bloki(?) czy moduly(?)
Ogolnie ja tez mam regiony(umnie bloki) do ktorych laduje poszczegolne komponenty(u ciebie moduly albo bloki)

Mam tez widget'y czyli takie proste komponenty bez zadnej wiekszej logiki i tylko z metoda do ich renderowania cos takiego jak u ciebie snippety np taki widget online users albo last threads ktore ogolnie "wstrzykuje" to widoku poprzez helpera.

Chcialbym wiedziec jakie kryteria uzywasz zeby zaladowac poszczegolne moduly(?)/bloki(?) do tych Regionow?

Powiedzmy jak ustawiasz by dany modul(?)/blok(?) byl widoczny na stronie forum a np na stronie glownej juz nie?

Wytlumacz mi tez czym u ciebie sie rozni blok od modulu bo nie bardzo potrafie tego zrozumiec ;)

ja tez mialbym takie strony ktore wlasnie odzwierciedlalyby wlasnie Nazwe frontcontrollera lub jego metode.

Moglbym uwzgledniac obydwie opcje czyli nazwe frontcontrollera jako strone a jego akcje jako modul.

Wtedy np na index.php/Home,Index,Index mialbym strone glowna z akcja Index ktora ladowalaby komponenty na strone Home modul Index.

Troche chaotycznie to opisalem, poki co wiem jaka funkcje u ciebie pelnia moduly,pluginy,bloki i regiony jednak nie rozumiem roznicy pomiedzy regionem a modulem.
Chcialbym tez zebys np opisal jak na dana strone wczytyjesz wszystko pomijajac juz pluiginy(bo bedzie to juz zbyt skomplikowane).

Dzieki ci za odp!

0

Ok panie Adamie.

Rozwiazalem kwestie ladowania modulow.
Teraz majac index.php/Home,Index,listAll
Jestsmy na stronie Home w module Index i aktualna akcja to listAll(Dla komponentu news bo jako jedyny ma ta akcje) i dla reszty komponentow dostepny na stronie Home i module Index to Index.

Teraz moge luzno zarzadzac na jakiej stronie i jakim module jakie komponenty maja byc.
Kwestia cache komponentow tez mam juz opanowana po prostu przed ich zaladowaniem sprawdze czy istnieje cache.
Jesli chodzi o uprawnienia to tak samo przed zaladowaniem sprawdze czy uzytkownik je posiada w przeciwnym razie nie zaladuje modulu.

Widgety laduje sie dla kazdego i nie maja opcji cache'owania.

Tylko teraz mam 2 pytania:
Jak robisz cache komponentow(czyli blokow u ciebie)?W sensie powiedzmy ze w komponencie news posiadamy metody listAll(),list(id),edit,delete.Teraz np metoda listAll moze byc cache'owana jednak edycja jak i usuwanie juz nie.
Myslalem o pliku konfiguracyjnym gdzie wpisze metody ktore mozna wrzucic do cache.Czy to dobry pomysl?

Jak rozwiazujesz kwestie komponentow i stron dla admina.

Mam taki komponent news i czytac je moga wszyscy ale juz usywac lub edytowac to nie.
Usuwanie i edycje danych robisz w odrebie danego komponentu czy calego panelu administracyjnego gdzie pozniej ewentualnie doczepiasz prace na innych komponentach?

0

Bloki generuja po prostu kod HTML. Nie ma zadnych akcji, stad cachowac jest latwo :P Ale na 4programmers.nie cachujemy calych blokow (ta opcja jest akurat wylaczona). Cachujemy za to takie elementy jak menu (ale tylko dla anonimow z wiadomych przyczyn).

0
Adam Boduch napisał(a)

Bloki generuja po prostu kod HTML. Nie ma zadnych akcji, stad cachowac jest latwo :P Ale na 4programmers.nie cachujemy calych blokow (ta opcja jest akurat wylaczona). Cachujemy za to takie elementy jak menu (ale tylko dla anonimow z wiadomych przyczyn).

Hmm ale skd bierze ten kod html?

U mnie tez cachuje juz wyrenderowane gotowe komponenty lub po prostu zapytania w bazie.

A jeszcze jedno jak u ciebie dziala Panel administratora kazdy komponent ma tak jakby panel z osobna czy masz glowny panel do ktorego podpinasz funkcjonalnosc kazdego komponent z osoba?

0

Wchodze do panelu administracji oraz wybieram opcje dodania nowego bloku. Tam moge wybrac rejon, w ktorym dany blok zostanie wyswietlony. Np. niech to bedzie stopka strony. W PA (panel administracyjny) moge wkleic kod HTML ktory bedzie wyswietlany w danym bloku. Wklejam np. <div style="color: red;">Anonimie! Zarejestruj sie u nas!</div> i ustawiam, aby ten blok byl wyswietlany tylko dla osob niezalogowanych w systemie. I to wszystko. Jest to najprostszy przypadek.

Innym przypadek: dodaje nowy blok, ale dodajac go, moge rowniez wybrac jaki plugin bedzie generowal kod HTML w danym bloku. Czyli w tym przypadku, kod HTML generuje sie dynamicznie. Dodaje nowy blok, przypisuje go do regionu stopka oraz wybieram plugin menu. Nastepnie wybieram nazwe menu, jaka chce aby sie wyswietlala w danym bloku. W wyniku takiego rozwiazania podczas generowania tresci na stronie, ustawiony przeze mnie blok zada od pluginu menu zwrocenie mu kodu HTML, ktory moglby wyswietlic.

0

Witam panie Adamie ponownie.
Mam takie male pytanie, jak pan obsluguje pluginy w przypadku gdy np plugin do glosowania chcemy dodac do news'a.

Problem glownie wystepuje gdy np do danego komponentu chcemu dodac plugin i mamy 2 rozne formularze , czyli ten z news'em i ten do dodania ankiety.
Jak za jednym requestem obsluzyc obydwie akcje?

To znaczy opisze przyklad z zycia wziety.
Tworze nowy wpis i decyduje ze do niego chce dodac ankiete o ile nie widze raczej problemu zeby dolaczyc formularz ankiety do komponentu news'ow to nie wiem zabardzo jak obsluzyc by w czasie dodawania/edytowania news'a dodac do niego ankiete...

Pobralem sobie repo z svn'a coyote-cmf przegladalem kod ale troche tego jest i nie potrafie wylapac jak to dokladnie robisz...bylbym wdzieczny za pomoc

P.S jeszcze jedno pytanie z tego co widze to u ciebie plugin tam samo jak i modul moze zawierac wlasna czesc administracyjna?

1 użytkowników online, w tym zalogowanych: 0, gości: 1