Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CodeIgniter] problem z MVC
Forum PHP.pl > Forum > PHP > Frameworki
Foxx
Witam,

od niedawna uczę się pracować na CodeIgniterze i próbuję zrealizować na nim pierwszy nieduży projekt. Jak to zwykle bywa w takich sytuacjach mam problem z rzeczami, które pewnie są oczywiste ale prawdopodobnie dlatego nigdzie nie mogę znaleźć na ten temat żadnej konkretnej informacji.

Chcę zrobić prosty system administracyjny, który będzie miał 3-poziomowe menu. Po wybraniu kategorii (np. zarządzanie stroną) w głównym menu wyświetli się menu drugiego poziomu z którego wybiorę moduł (np. newsy) i wtedy pojawi się menu przypisane do modułu z opcjami np. "dodaj news", "lista newsów".
Po wybraniu opcji zostanie załadowany odpowiedni widok, na przykład formularz dodawania newsa.

Ale jak w tym momencie miałyby wyglądać kontrolery dla takiej aplikacji? Jeżeli kontrolery będą odpowiednikami modułów, czyli np. News (z metodami "add", "delete", etc.) to kompletnie nie rozumiem co miałoby być uruchamiane po kliknięciu w menu pierwszego poziomu (oraz trzeciego). A przecież to menu trzeciego poziomu ostatecznie ma decydować co się wyświetli użytkownikowi.
Nie wiem czy jestem w stanie to jasno opisać. Jednym słowem nie mam doświadczenia i chciałbym żeby ktoś mnie nakierował na rozwiązanie.

Drugi problem jest podobny: załóżmy że mam stronę, na której jest jednopoziomowe menu z pozycjami "news", "products" i "contact". I mam kontrolery News, Products i Contact.
A teraz załóżmy, że przy każdym produkcie jest link do formularza w którym można zadać pytanie dotyczące tego przedmiotu. Czy on powinien być obsługiwany przez kotroler Products czy może już Contact i jakąś jego metodę w stylu "askProduct"?
Czy takie problemy rozwiązuje się arbitralnie i nie ma to większego znaczenia, czy są jakieś standardy?

Nie mogę nigdzie znaleźć przykładów na trochę bardziej skomplikowanych projektach...
Z góry dzięki za pomoc.
terabit
Cytat(Foxx @ 11.08.2008, 22:36:39 ) *
od niedawna uczę się pracować na CodeIgniterze i próbuję zrealizować na nim pierwszy nieduży projekt.


myślę że jak zaczynasz to o CI możesz poczytać tutaj: http://www.php.rk.edu.pl/w/p/kurs-ci/
na początek na pewno dobry kursik winksmiley.jpg

Polecam (na pewno nie tylko ja) przerzucenie się na Kohane...
Foxx
Aż tak źle ze mną nie jest smile.gif
Znam ten kurs, a także oficjalny ale nie znajduję w nich odpowiedzi na moje pytania.
To jest raczej pytanie o model MVC niż o konkretny framework.

Najbardziej chciałbym usłyszeć jak ktoś by rozwiązał takie dwa przykłady w praktyce.

Może inaczej sformułuję pytanie:

Załóżmy że mam menu dwupoziomowe. W pierwszym poziomie wybieram pomiędzy "administracja konfiguracją" a "administracja stroną".
Jeżeli wybiorę administrację stroną to pojawia się menu drugiego poziomu z opcjami na przykład "newsy" i "produkty".
Jeżeli kliknę na "produkty" to pojawia się menu trzeciego poziomu z opcjami "dodaj" i "lista". Po wybraniu "dodaj" pojawia się formularz dodawania produktu.

I teraz: logiczne wydaje się, żeby w tym momencie obsługiwał to kontroler "produkty" i wyświetlał mi widok "dodaj_produkt". A więc w url'u mam "products/add/". Wszystko jasne. Ale to dopiero po wybraniu opcji z ostatniego menu.
Ale nie wiem co miałoby się dziać wcześniej, po kliknięciu na "administracja stroną" pierwszego menu a potem po wybraniu modułu z drugiego menu. Podczas gdy normalnie załatwiłbym to odpowiednimi parametrami przekazywanymi w url'u, który wyglądałby jakoś tak: "?cat=2&mod=2&option=1" to teraz nie mam pojęcia jak to rozwiązać.

Jeszcze inaczej: zanim nie dokonam wyboru w ostatnim menu nie wyświetlam żadnego widoku i wobec tego nie wiem jaki kontroler miałby obsługiwać operacje na menu pierwszego i drugiego poziomu.

A może już w momencie wybrania opcji z pierwszego menu powinienem uruchamiać kontroler "administracja_strona", który byłby taką wielką klasą, która swoimi metodami robi wszystko? Ale jeden kontroler to brzmi jak zły pomysł.
terabit
Cytat(Foxx @ 12.08.2008, 14:42:56 ) *
A może już w momencie wybrania opcji z pierwszego menu powinienem uruchamiać kontroler "administracja_strona", który byłby taką wielką klasą, która swoimi metodami robi wszystko? Ale jeden kontroler to brzmi jak zły pomysł.


przecież nie będziesz tego robił w jednej classies!

robisz sobie np klasę admin w niej jakieś metody... np. welcome winksmiley.jpg która wyświetla pierwsze menu i jakieś tam inne bzdury.
Następnie masz linki administracja i zarządzanie (czy coś...) no i np. dwie classy. W classie administracja w index() wrzucasz do wikoku menu2 itd..
Foxx
Rozumiem, czyli klasa Admin, która ma się zajmować wyświetlaniem odpowiednich bloków menu na stronie.
Ale co w momencie, kiedy wybiorę opcję z menu trzeciego poziomu i będzie to np. dodawanie produktów? Za to odpowiedzialny powinien być już kontroler "produkty" ze swoimi metodami "dodaj", "usuń", etc. a przecież chcę żeby cały układ menu, wszystkie trzy poziomy nadal się wyświetlały. Jeżeli będzie za to odpowiedzialny kontroler Admin, to jak mogę mieć i jedno i drugie (to znaczy zarówno trzy poziomowe menu z zaznaczonymi opcjami jak i widok dodawania produktu).

Inaczej: dopóki klikam w menu 1. i 2. poziomu w urlu będę widział powiedzmy: "admin/menu1/id_wyboru/", "admin/menu2/id_wyboru/" - kontroler admin obsługuje mi nawigację - ale jak kliknę w menu 3. poziomu to będzie już "produkty/dodaj" - a menu tak jak było wybrane musi się nadal wyświetlać.
terabit
Cytat
Rozumiem, czyli klasa Admin, która ma się zajmować wyświetlaniem odpowiednich bloków menu na stronie.

NIE

Cytat
Ale co w momencie, kiedy wybiorę opcję z menu trzeciego poziomu i będzie to np. dodawanie produktów? Za to odpowiedzialny powinien być już kontroler "produkty" ze swoimi metodami "dodaj", "usuń", etc. a przecież chcę żeby cały układ menu, wszystkie trzy poziomy nadal się wyświetlały. Jeżeli będzie za to odpowiedzialny kontroler Admin, to jak mogę mieć i jedno i drugie (to znaczy zarówno trzy poziomowe menu z zaznaczonymi opcjami jak i widok dodawania produktu).

Inaczej: dopóki klikam w menu 1. i 2. poziomu w urlu będę widział powiedzmy: "admin/menu1/id_wyboru/", "admin/menu2/id_wyboru/" - kontroler admin obsługuje mi nawigację - ale jak kliknę w menu 3. poziomu to będzie już "produkty/dodaj" - a menu tak jak było wybrane musi się nadal wyświetlać.


nie wiem dokładnie jak to jest w CI a w Kohanaphp masz coś takiego jak Tepmlate Controller który pewnie by ci to ułatwił - http://docs.kohanaphp.com/addons/template?s[]=template
Speedy
Cytat(Foxx @ 12.08.2008, 16:00:54 ) *
Inaczej: dopóki klikam w menu 1. i 2. poziomu w urlu będę widział powiedzmy: "admin/menu1/id_wyboru/", "admin/menu2/id_wyboru/" - kontroler admin obsługuje mi nawigację - ale jak kliknę w menu 3. poziomu to będzie już "produkty/dodaj" - a menu tak jak było wybrane musi się nadal wyświetlać.


Możesz sobie includować jakiś plik, w którym będzie przechowywane menu, a w tym pliku w zależności od parametrów, jakie są podane w url-u wyświetlać menu.

np.

  1. <?if($this->uri->segment(2) == 'news'):?>
  2. menu newsów
  3.  <?if($this->uri->segment(3) == 'opcja1'):?>
  4.  menu newsów - opcja 1
  5.  <?endif;?>
  6. <?elseif($this->uri->segment(2) == 'inny_modul'):?>
  7. // ...
  8. // itd.
  9. <?endif;?>


Jeśli jest Ci wygodniej, to możesz to rozbić na jeszcze więcej plików, albo napisać sobie jakąś klasę do obsługi tego, którą będziesz ładował za każdym razem, kiedy zajdzie taka potrzeba. Koncepcje mogą być różne.
jarek_bolo
Musisz zastosować tutaj jakieś coś, nazwijmy to MainController dla każdej głównej pozycji Menu 1 poziomu, który to na podstawie URI będzie rozpoznawał jaki tamplate/menu teraz wyświetlić.
Jak już user dojdzie do końca, dotrze do jakichś konkretnych funkcjonalności, które będą wymagały użycia odpowiednich klas, to po prostu zaincludujesz te klasy będąc w tym MainControllerze.
Przeprowadzisz wymagane operacje i wynik z powrotem zwrócisz do MainControllera, który wyświetli odpowiedni template.

I tak za Twoim pierwszym opisem problemu musiało by to być mniej więcej tak:

1 poziom: www.strona.pl/manage_site/index -> wyświetli to swój jakiś dany template, a w nim drugi poziom menu
2 poziom: www.strona.pl/manage_site/newsy/index -> tutaj znowu wyświetlamy dany template, czyli 3 poziom
3 poziom: www.strona.pl/manage_site/newsy/{lista, dodaj, itd.} -> tutaj już konkretne funkcje do wykonania, w tym miejscu należało by zaincludować klase News, model. itd.

  1. <?php
  2. class MainController extends ciController { // nie znam dobrze CI
  3.  
  4. public function index() {
  5. $this->view('templatka_z_menu_drugiego_poziomu.html');
  6. }
  7.  
  8. public function news() {
  9. if (isset($this->uri->segment(3))) {
  10. include(News.class.php);
  11.  
  12. switch ($this->uri->segment(3)) {
  13. case 'list':
  14. // wyciągasz liste
  15. break;
  16. case 'add':
  17. // dajesz formularz
  18. break;
  19. //itd.
  20. }
  21. } else {
  22. $this->view('templatka_z_menu_trzeciego_poziomu.html');
  23. }
  24. }
  25. }
  26. ?>


I tutaj chciał bym zaznaczyć, że sam nie wiem czy to dobre rozwiązanie smile.gif
Nie korzystałem nigdy z CI czy Kohany. Mile widziana krytyka bardziej doświadczonych użytkowników tych frameworków.
phpion
Cytat(Foxx @ 11.08.2008, 22:36:39 ) *
Witam,

od niedawna uczę się pracować na CodeIgniterze i próbuję zrealizować na nim pierwszy nieduży projekt.

Jeśli możesz to olej CI i przenieś się na Kohana. Jest to osobny framework bazujący na idei CI w całości napisany w PHP5 i, co istotne, rozwijany tongue.gif
Foxx
Dzięki wszystkim za pomoc, teraz potrzebuję czasu żeby to wypróbować.
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.