Problemy koncepcyjne ;)

Witam,

od kilku lat programuje w php ale nigdy nie pisałem czegokolwiek używając frameworka. Postanowiłem zacząć i na tapetę poszło yii. Planuje napisać prostego cmsa i stronę na nim opartą.

Panel do cmsa napisze po napisaniu samej aplikacji wyświetlającej stronę.

Przejrzałem wszystkie dema w yii włącznie z tutorialem bloga, ściągnąłem gotowe cmsy napisane w yii (generalnie żadnego nie udało mi się uruchomić ;)) i zaczynam prace.

Jak to na początku bywa chciałem się zapytać jak należy zorganizować takie coś żeby napisać to zgodnie ze sztuka:

Mam template strony, w nim będą 3 kolumny lewa/prawa/środkowa z właściwą treścią, każda z kolumn będzie generowana przez osobny widok (widok będzie generował ramki rożnego typu z treścią, banerami etc).

Teraz jak to zorganizować po stronie kontrolerów i modeli?

Myślałem o takim czymś, jako ze generalnie będę miał typy stron (strona główna, strona kategorii (+ lista dokumentów w danej kategorii), strona dokumentu.

Stworze 3 kontrolery do każdego typu treści.

Teraz jakie akcje musi zrobić kontroler generujący stronę główna?

Jak ogarnąć te 3 kolumny? kontroler musi zrobić wywołanie 3 modeli które korzystając z innych modeli odczytają sobie z bazy układ ramek w danej kolumnie?

Pewnie niektórym pytania wydaja się banalne ale dla mnie nie są i wole się zapytać zanim zacznę robić po swojemu i tak sobie to utrwalać;)

P.S. Rozumiem ze mając już jakieś zmiennie stworzone przez model, widzę je w widoku?

Z góry dziękuje za odpowiedz ;)

Chyba jednaj za wiele nie czytałeś.

Kontrolery dobrze kombinujesz, modele trzeba przekazać do widoku, żeby były widoczne, albo wywołać NazwaModelu::model().

Jeśli chodzi i różne układy na stronach to zobacz jak się wykorzystuje layouty

Poczytaj przewodnik do Yii i do bloga a myślę, że wszystko stanie się jasne.

Caly ten opis komponentow /widgetow /modeli jest dosyć enigmatyczny dla kogoś kto pierwszy raz styka sie z tym frameworkiem. Przykładowy kod jest słabo opisany, w niektórych przypadkach brakuje wskazania gdzie powinien się znaleźć plik z danym kodem np widgety. Jedyna rzecz po jakiej się uczę to analiza kodu bloga, choć to i tak wszystkich wątpliwości nie rozwiązuje.

Np menu, w blogu menu jest statyczne i rysowane przez komponent zii CMenu, powiedzmy ze chciałbym menu pobierać z bazy. Mam do tego napisać model w nim użyć AR pobrać sobie pozycje menu i zwrócić do kontrolera tablice, a ten przekaże je do widoku ? A może bezpośrednio w kontrolerze pobrać z bazy menu i przekazać do widoku ?

Zastanawia mnie jeszcze jedna kwestia. Powiedzmy ze chciałbym zrobić linki SEO ale miałyby postać

domena/jakis_link_w_formacie_seo

po samym linku nie jesteśmy w stanie określić jaki to kontroler dopiero z bazy można by odczytać którego kontrolera użyć. Jak takie coś zrobić?

Na myśl przychodzi mi stworzenie głównego kontrolera który jako pierwszy będzie przejmował cały URL przekazywał do modelu a ten odczyta na podstawie url rekord z bazy zwróci kontroler i akcje lub false (404) w przypadku nie odnalezienia danego linku. Dobrze myślę czy macie lepszy pomysł ?

W ogole wszyscy piszą ze modele służą do odczytu danych np bazy danych. To znaczy ze błędem będzie napisanie modelu (SeoLinks.php ) który będzie np zawierał metodę genLink($id,$type=‘doc’) generującą linki? :)

Polecam ciekawy artykuł odnośnie menu: Creating a database-driven hierarchical Structure combined with CMenu and superfish

Na temat przyjaznych URL`i myślę, że wszystko zostało napisane tutaj i w dalszych punktach tego rozdziału.

Co do ostatniej wątpliwości to SeoLink najlepiej gdyby był klasą (komponentem), który będzie służył do generowania linków. Natomiast jeżeli skorzystasz z CUrlManager to wystarczy używać wbudowanej metody createLink, która sama załatwi sprawę tworzenia linków.

Pozdrawiam.

Tak jak już koledzy wcześniej powiedzieli najlepiej zapoznać się (i to czytając co najmniej 2 razy) z tutorialem. Jest on dostępny również w wersji polskojęzycznej. Znajdziesz tam odpowiedzi na większość nurtujących Cię pytań. Jeśli chciałbyś zobaczyć rozbudowaną strukturę katalogów z dużego projektu, to zapraszam do przeczytania artykułu z wiki stworzonego przez Quianga opisującego jak wygląda struktura katalogów dla strony yiiframework.com. Wiki, to kopalnia ciekawych artykułów napisanych przez użytkowników tego frameworka jak i samych ich twórców. Jeśli chcesz przejrzeć te związane z URLami, wystarczy je wyszukać w prosty sposób w wiki.

Jest też krótki i dobrze opisany przez samdarka artykuł w turorialu o najlepszych praktykach (wersja PL).

Apropos konwencji, to jest jeszcze jedna zaproponowana przez Qianga dot. CSS

Ogólnie trzeba tylko trochę poszperać i da się wszystko znaleźć :0

Po części się zgodzę, że opis szeczególnie w API jest enigmatyczny. Ale praktyka czyni mistrza więc poświęć trochę czasu na eksperymentowanie z kodem zanim zaczniesz pisać na poważnie.

Jest takie powiedzenie że kota można obedrzeć ze skóry na wiele sposobów. Tak samo jest w Yii - tu nie ma zadekretowanych raz na zawsze sposobów kodowania. To jak wykorzystasz CMenu zależy wyłącznie od Ciebie. Tak jak piszesz - możesz sobie stworzyć swój model AR menu (a jeśli chcesz mieć możliwość zarządzania różnymi menu czyli dodawania/usuwania/edycji pól menu) to nawet powinieneś.

Co do linku SEO w kontrolerze masz zmienne $this->id i $this->action a nawet %this->module->id (niezależnie jak dziwnie jest napisane są linki SEO).

Nie za bardzo rozumiem co chcesz osiągnąć poprzez stworzenie kontrolera dla kontrolerów. To jakiś hardkorowy pomysł (chyba, że przedstawisz argumenty że czegoś takiego potrzebujesz).

Na początku dzięki Panowie za odpowiedzi :) ciągle sie wgryzam w Yii, nie jest łatwo ale powoli metodą prób i błędów coś tam wychodzi :)

Powiedzmy ze mam jakiś artykuł o tytule Framework Yii jest fajny, chce żeby link do tego artykułu był taki:

/framework-yii-jest-fajny

problem w tym ze UrlManager nie rozpozna w tym akcji jaka ma wykonać (powiedzmy ze domyślnie actionShow() w jakimś kontrolerze), nie rozpozna tez czy ten link to dokument czy jakis katalog z dokumentami wiec nie będzie wiedział do jakiego kontrolera to żądanie skierować. Dlatego myślałem żeby zrobić tabele

url | kontroler | akcja

/framework-yii-jest-fajny | document | show

/framework-yii-podstawy | katalog | show

i jakiś kontroler główny który będzie kierował na tej podstawie zadanie do właściwego kontrolera.

P.S. może mi ktoś powiedzieć do czego są komponenty? może jakiś przykład do czego ich używać? :)

Teraz czaję co chcesz osiągnąć. Możesz stworzyć filtr który bedzie tłumaczył takie adresy (patrz pkt. 4 http://www.yiiframework.com/doc/guide/1.1/en/basics.controller. Z tym, że wg mnie tabela powinna zawierać tylko url i content_id. Zapytanie do bazy powinno pobierać złączenie tej tabeli z tabelą content i w zależności od typu danej (np. content_type) wywoływać akcje odpowiednich kontrolerów.

Komponenty to po prostu klasy PHP których możesz używać wielokrotnie w swojej aplikacji. Mogą to być klasy z zewnątrz lub np. przeładowane klasy YII.