Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] Kontroler i kilka innych pytań
Forum PHP.pl > Forum > PHP > Frameworki
Max Damage
Cześć, próbuję przepisać sobie stronę na Kohane. Jest to mój pierwszy framework i styczność z MVC, więc mam pewien problem i ogólnie kilka pytań. Przede wszystkim kontroler. Wygląda tak:
  1. class Index_Controller extends Controller {
  2. public function __construct(){
  3. parent::__construct();
  4. $this->template=new View('layout');
  5. $this->template->headers=new View('header');
  6. $this->template->footer=new View('footer');
  7. $this->template->headers->title = 'Samochody świata';
  8. $this->template->footer->copyright = 'Copyright';
  9.  
  10. $model=new Menu_Model;
  11. $wynik=$model->getmenu();
  12. $this->template->set('menu',$wynik);
  13. }
  14. public function index(){
  15. $this->template->content=new View('content');
  16. $news=new News_Model;
  17. $wynik=$news->getnews();
  18. $this->template->content->news=$wynik;
  19. $this->template->render(TRUE);
  20. }
  21. public function przegladaj($index) {
  22. $this->template->content=new View('przegladaj');
  23. $auta=new Przegladaj_Model;
  24. $wynik=$auta->getAuta($index);
  25. $this->template->content->auta=$wynik;
  26. $this->template->render(TRUE);
  27. }
  28. public function news($index){
  29. $this->template->content=new View('news');
  30. $news=new News_Model;
  31. $wynik=$news->getnews($index);
  32. $this->template->content->news=$wynik;
  33. $this->template->render(TRUE);
  34. }
  35. }

Ogólnie mam layout ze nagłówkiem, stopką i zmienną zawartością, zależnie od tego w jaki kliknąłem link. Teraz chciałbym stworzyć taki link: http://localhost/index.php/index/przegladaj/auto/3 . Jak to zrobić? Jedyne co przychodzi mi na myśl to jakiś switch w funkcji przegladaj, tyle że gdybym potem chciał zrobić coś takiego z auto, będzie już problem.
Czy taki kontroler ma być tylko jeden na stronie? Jeśli nie to jakie mam pisać inne, i ogólnie jak to wszystko wtedy połączyć. Tworzenie modeli wydaje mi się póki trochę beznadziejne, bardziej przypominają opakowania na funkcje niż rzeczywiste klasy. Mimo iż w tych powyższych mam teraz tylko pobieranie danych z bazy, to potem mogę mieć co najwyżej wstawianie lub zaktualizowanie danych. Jakoś nie widzę innych rozwiązań.
Poprzednio korzystałem ze Smarty, i podobało mi się, że mając coś takiego : /przegladaj.php?auto=2 i takiego: /przegladaj.php?marka=3 robiłem sobie np. {if $smarty.get.auto} w szablonie i wyświetlałem co trzeba, jak mogę tutaj coś takiego zrobić, lub jakiś tego odpowiednik?
k_@_m_i_l
Cytat
Teraz chciałbym stworzyć taki link: http://localhost/index.php/index/przegladaj/auto/3 . Jak to zrobić?

Nie wiesz jak to zrobić w jakim sensie ? Odnośniki chyba tworzyć umiesz. Jak chcesz żeby taki adres wywołał ci metodę przegladaj z kontrolera Index z parametrem 3 to w pliku routes.php(w application/config) wpisujesz :
  1. $config['index/przegladaj/auto/([0-9]+)'] = 'index/przegladaj/$1';

i jak wpiszesz ten adres to zostanie wywołany kontroller index->metoda przegladaj z parametrem podanym po /auto/ w adresie,czyli jakąś liczbą.
Co do pozostałych pytań, to poszukaj sobie o MVC i czytaj dokumentacje Kohany. Tam jest wszystko napisane, opisane jak i co używać. Linków ci nie podam, bo sam je znajdziesz smile.gif
Max Damage
Sorry, źle zadałem pytanie. Mam taki link http://localhost/index.php/index/przegladaj/8 , wyświetla mi on nazwy wszystkich aut danej marki, a teraz gdy na jakąś nazwę kliknę (link : http://localhost/index.php/index/przegladaj/auto/7) to zadziała mi metoda auto, która pobierze i przekaże wszystkie dane do widoku dla konkretnego auta. Tak to sobie przynajmniej wyobrażam.
Cytat
Co do pozostałych pytań, to poszukaj sobie o MVC i czytaj dokumentacje Kohany

Bez urazy, ale nie lubię jak pisze na forum i odsyła mnie się do google, tym bardziej że nie znalazłem jakiegoś konkretnego, dobrego artykułu o MVC - wszędzie opisywane tak 'po łepkach' i od środka. Jak ktoś wie o co biega to może i mu to wystarczy, o ile potrzebuje wtedy coś takiego czytać. Ale jak masz jakiś dobry artykuł odpowiadający na część moich pytań to chętnie przeczytam.
Bez czytania dokumentacji nie napisał bym nawet tego co teraz mam : )
Gryf
ehh...
no niestety akurat o MVC to w naszej rodzimej stronie sieci dużo niema
a co do pytani to logika aplikacji
w kohanie masz adresy według schematu dla twojego przykładu
http://localhost/index.php/index/przegladaj/auto/7
odpalasz metodę przeglądaj z parametrami auto, 7 kontrolera o nazwie index
z kolei adres
http://localhost/index.php/index/przegladaj/8
odpala metodę przeglądaj z parametrem 8
czyli teraz pisząc Model <- który to ma pobierać i zwracać do kontrolera określone dane
(z bazy danych czy też pliku XML a nawet kanału RSS czy też Atom'a)
deklarujesz w nim metody odpowiadające za np.
- pobranie listy wszystkich marek
- pobranie listy modeli samochodów określonej marki (ewentualnie z możliwością określenia limitu)
- pobranie wszystkich informacji o konkretnym modelu
- etc...
teraz jak dostaniesz wynik z Modelu ustawiasz w Kontrolerze preferowany widok i wpinasz do niego dane pod określone zmienne
a w widoku po prostu obrabiasz tablice z danymi i układasz w swój szablon.
Pytałeś też czy Model ma być tylko jeden czy też wiele w zasadzie wszystko zależy od zaawansowania strony
dajmy na to masz jeden Model do obsługi użytkowników inny do wyświetlania niusów etc.. wtedy nie robi się "bajzel"
Max Damage
Cytat
odpalasz metodę przeglądaj z parametrami auto, 7 kontrolera o nazwie index

I właśnie o to mi chodziło : ) I zastanawia mnie też co będzie jeśli strona będzie odpowiednio hm... głęboka, czli jeśli adres będe miał powiedzmy taki : http://localhost/index.php/index/przeglada...o/abc/def/ghe/7 . Z tego co napisałeś wynika że to wszystko muszą być parametry funkcji, czyli trochę to kłopotliwe przy bardziej rozbudowanych stronach. I wychodzi też na to, że muszę zastosować w funkcji ify albo switcha dla rozróżnienia co jest pierwszym parametrem, gdy zamiast auto będę mógł mieć także np. marka. Wtedy inne zapytanie i inny widok. Wychodzi także na to, że nie da się w tym frameworku pisać bardzo rozbudowanych stron. A pytałem o Kontroler, bo jeśli chodzi o Model to tak jak pisałeś, podział na poszczególne grupy sam się nasuwa : )
Gryf
taka jest przyjęta struktura dla standardowych linków można ją oczywiście zmienić od tego masz np.
tablice routingu w każdym fw np. we CI,
przekopiuj sobie plik routes.php ze system/config (o ile piszesz pod ver. 2.3 ;])
tam możesz określić że część adresu nie jest ważna -> SEO xP
a kohana jako fw jest bardo wydajna i dość elastyczna a z stwierdzeniem że
Cytat
Wychodzi także na to, że nie da się w tym frameworku pisać bardzo rozbudowanych stron.

to się nie zgodzę -> wszystkie fw mają na celu przyspieszenia pracy a ograniczenie o jakim mówisz wynika raczej
z "błędnego" podejścia do problemu.
thek
Ja polecam dokładne przyjrzenie się temu jak Kohana przyjmuje i interpretuje link. Nawet bardzo rozbudowane linki przetwarzane są ostatecznie do kontroler/metoda/parametr1/wartosc1/parametr2/wartosc2/... i tak dalej... Plik routes.php także istnieje w Kohanie i łatwo dzięki temu linki SEO tworzyć.
Inna sprawa to taka, że niepotrzebnie wszystko wrzucasz do pliku index. Zrób sobie inne kontrolery, które będą wszystko rozbijały na sensowniejsze części. Chcesz samochody? To zrób klasę taką i odpowiedni model do niej a nie pisz kolejną metodę dla kontrolera index :/ Po to jest obiektówka wymyślona by z niej korzystać, a nie tworzyć jeden plik do wszystkiego bo to mija się z celem.
Przykład? Robisz portal i ładujesz do niego wszystko w index tylko robisz inne metody? Totalny bezsens smile.gif Piszesz kontroler jako index, ale do niego piszesz kontrolery: news, artykuł, PW, logowanie itp... Tylko je odpowiednio wywołujesz z index lub robisz forward/redirect na odpowiedni z nich. Kohana jest naprawdę przyjemnym FW, który swoje korzenie ma w CI i czerpie z niego garściami. Jedyna różnica to taka, że jest w pełni już nastawiony na obiektówkę w PHP5. Dlatego wpierw przemyśl naprawdę podział na klasy i potraktuj każdą jako sumę kontroler+model+widok (czasem może nie być któregoś z nich - zależy od tego co robi klasa winksmiley.jpg ). To pozwoli Ci sensownie rozbić całość strony na kontrolery.

Dla mnie błędem jest już nawet konstruktor jaki zrobiłeś. Nie dajesz sobie elastyczności. Zauważ, że to co pakujesz w nim w części metod nawet nie używasz. Co z menu? Walisz je na sztywno. A co jeśli będzie ono musiało ulec zmianie? Zacznij wpierw od podziału aplikacji, a dopiero potem koduj. Oszczędzisz sobie masę problemów.

By nie być gołosłownym. Strona kumpla napisana w Kohanie ->http://www.ofertypracy24h.pl/ Wierz mi że za tym stoi ów framework i spisuje się bardzo dobrze smile.gif
Max Damage
Jeszcze jedno pytanie, bo nie działa i nie jestem pewien czy na pewno napisałem to tak jak mi to opisałeś thek. Zrobiłem teraz tak: W Index_Controller mam przykładowo metodę news:
  1. public function news($index){
  2. $abc=new News_Controller;
  3. $abc->getOneNews($index);
  4. }

Potem robię sobie kontroler News_Controller z tą metodą:
  1. class News_Controller extends Index_Controller {
  2. public function __construct(){
  3. parent::__construct();
  4. }
  5. public function getOneNews($index){
  6. $news=new News_Model;
  7. $wynik=$news->getnews($index);
  8. $this->template->content->news=$wynik;
  9. $this->template->content=new View('news');
  10. $this->template->render(TRUE);
  11. }
  12. }

Zależnie od wywołanej metody w Index_Controller wywołuje odpowiedni Controler z jego metodą? W sumie wychodzi na to samo tylko przejrzyściej, a przynajmniej takie mam wrażenie. Chyba nie do końca załapałem....
Podany kod mi zresztą nie działa, nie wiem gdzie jest błąd:
Cytat
>E:/wamp/www/system/libraries/View.php [233]:
Only variable references should be returned by reference
k_@_m_i_l
Najpierw linia 9, później linia 8 :
  1. $this->template->content=new View('news'); $this->template->content->news=$wynik;


Ale po co tworzysz w index_controller tą metodę, skoro masz od tego inny kontroler ?
Jak chcesz uruchomić metode getOneNews z kontrolera News uruchomić,np z adresu
jakasstrona.domena/index/news/15
to robisz w routes
  1. $config['index/news/([0-9]+)'] = 'News/getOneNews/$1';


Poczytaj o routingu w Kohanie,
Tu masz link do Kohana 101
http://dev.kohanaphp.com/wiki/kohana2/Kohana101
Poczytaj tam sobie dokładnie, bo tam jest wszystko opisane jak rozpocząć prace z tym frameworkiem.

edit :
Cytat
Bez urazy, ale nie lubię jak pisze na forum i odsyła mnie się do google, tym bardziej że nie znalazłem jakiegoś konkretnego, dobrego artykułu o MVC

No wybacz, że ktoś Ci będzie szukać w internecie materiałów o MVC. Skoro piszesz już na forum, to naucz się szukać :
Temat: MVC
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.