Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] jak ustawić jeden kontroler dla kilku podstron?
Forum PHP.pl > Forum > PHP > Frameworki
nowy_pehapowiec
Dzięki pomocy dobrych ludzi z forum wybrałem swój framework Kohana. Ale mam z nim pewien kłopot. Jak ustawić jeden kontroler dla kilku podstron? Treść tych podstron ma być odczytywana z bazy danych. Do czego jest mi potrzebny tylko identyfikator, który jest podany w adresie, np home. Dzięki przepisywaniu adresów w apachu mam nice-url: adres.pl/home albo adres.pl/contact. Tylko, że Kohana dla takich adresów szuka kontrolerów home i contact. A kontroler ma być jeden wspólny i tylko ma pobierać różne rekordy z tej samej tabeli. Jak to zrobić przy pomocy Kohany?

pozdro
pedro84
Powinny być dwa kontrolery. Możesz utworzyć sobie główny kontroler, np. site, po którym oba kontrolery będą dziedziczyły.
nowy_pehapowiec
Niemożliwe! Musi być inne wyjście. Przecież dla 20 podstron nie będę pisać 20 kontrolerów które będą się różnić tylko identyfikatorem rekordu pobieranego z bazy?? Przy większej stronie liczba plików będzie masakrycznie duża. Na pewno nie da się tego ominąć?

pozdro
Riklaunim
A pomyślałeś żeby zrobić jeden kontroler, który będzie z linku otrzymywał zmienną określającą który rekord pobrać?
Gryf
zawsze możesz namieszać w routers dla kohany 2.3.x
kohana/application/config/routes.php
i robisz
Kod
$config['_default'] = 'witamy';
$config['strona'] = 'page/strona/1';
$config['kontakt'] = page/strona/2';

i potem jak wywołasz adres.strony/kontakt.html
to do metody strona kontrolera page zostanie podana wartość 2 ;]

add. bbcode ;]
nowy_pehapowiec
Riklaunim, o tym pomyślałem ale nie mam pojęcia jak to zrobić.

Gryf, wybrałem Kohana3 i tam chyba trzeba to zrobić jakoś inaczej. Nawet takiego pliku jak podałeś nie ma.

pozdro
destroyerr
@nowy_pehapowiec skoro wybrałeś Kohana 3 to powinieneś wiedzieć, że główną zmianą w stosunku do wersji 2 jest zmiana routingu. Polecam poszukać w google odpowiednich materiałów. Właśnie sprawdziłem i mogę potwierdzić, że takowe .
nowy_pehapowiec
destroyerr dzięki, trochę się naszukałem, ale wszystkiego i tak nie mam.

Znalazłem bootstrap. Tam chyba mogę dać np:
Route::set('default', '(<id>)')
->defaults(array(
'controller' => 'main',
'action' => 'page',
));

Wtedy wpisując strona.pl/home odwołam się do kontrolera main i akcji page? Ale teraz nie wiem jak skorzystać w tej akcji z id inaczej niż poprzez $_SERVER? I mam jeszcze jedną zagwozdkę. Co jeśli dla adresu strona.pl/contact będę chciał skorzystać z innej akcji albo kontrolera? Będę chciał wyświetlić formularz a nie pobierać dane z bazy.

Jeśli znasz jakieś dobre tutki o Kohana 3 to proszę podaj linki do nich. Ja bazuje na oficjalnej (kiepskiej, bez przykładów) dokumentacji i na nasza.kohana.pl. Poza tym to tylko pojedyncze wpisy na blogach. Nigdzie nie ma niczego bardziej kompletnego?


pozdro
Riklaunim
Do oddzielnych logicznie stron np. kontakt, czy list newsów stosuj oddzielne kontrolery. Jeżeli narzędzie nie ma wystarczającej dokumentacji to do kosza i głęboko zakopać winksmiley.jpg
nowy_pehapowiec
Riklaunim właśnie takie dwa kontrolery chciałbym zrobić, jeden do "stron z bazy", drugi do "formularza kontaktowego". Ale nie wiem jak zarządzać ich użyciem. Co zrobić, żeby strona kontakt korzystała ze swojego kontrolera a reszta z innego. To powinno być w tym bootstrapie ale nie wiem jak zdefiniowac takie dopasowanie.

A dokumentacja Kohany jest gorsza niż niewystarczająca. Tylko, że nie znalazłem lepszej alternatywy. Inne FW to kobyły po kilkanaście albo kilkadziesiąt MB, tysiące funkcjonalności których nie potrzebuje. Chyba, że coś przegapiłem w swoich poszukiwaniach?


pozdro
ziqzaq
Dodajesz sobie poprostu odpowiednie reguły routingu dla odpowiednich stron.
Pamiętaj, że najbardziej ogólna reguła idzie na koniec ponieważ pierwsza pasująca jest wykonywana.
Np.
  1. Route::set('r1', 'page/kontakt')
  2. ->defaults(array(
  3. 'controller' => 'contact',
  4. 'action' => 'index'
  5. ));
  6. Route::set('r0', 'page(/<id>)', array('id' => '.*?'))
  7. ->defaults(array(
  8. 'controller' => 'page',
  9. 'action' => 'index',
  10. 'id' => 0
  11. ));


Edit: Oczywiście skoro szukamy id to regex dla tego parametru powinien wyglądać raczej tak: "[0-9]+?"
nowy_pehapowiec
Ziqzaq dzięki,
już powoli zaczynam to kumać. Po prostu wstawiam kolejne wzorce tak jak w mod_rewrite. Tylko jak jest z tym id? Jak użyć id z adresu w kontrolerze? I czy można używać innych nazw zmiennych zamiast id?



pozdro
ziqzaq
Jeśli się dobrze orientuję to masz dwa podstawowe parametry: <controller> i <action>.
Resztę definiujesz wedle uznania tak jak pokazałem wczesniej.
Parametry (oprócz <controller> i <action>) są przekazywane do metody akcji.
Czyli mając parametry <id> i <przykładowy> i wykonywaną akcję "index" z jakiegoś kontrolera masz:
  1. public function action_index($id, $przykladowy)
  2. {
  3. var_dump($id, $przykladowy);
  4. }

Nazwy zmiennych w parametrach metody "action_index" powyżej są dowolne czyli równie dobrze może być:
  1. // $numer dla <id>
  2. // $tekst_przykladowy dla <przykladowy>
  3. public function action_index($numer, $tekst_przykladowy)
  4. {
  5. var_dump($numer, $tekst_przykladowy);
  6. }
nowy_pehapowiec
Czy razem to powinno być jakoś tak?
Bootstrap:
Kod
Route::set('default', 'contact')
->defaults(array(
'controller' => 'main',
'action' => 'contact_form',
));

Route::set('default', '(<id>)')
->defaults(array(
'controller' => 'main',
'action' => 'page',
));


I w kontrolerze:
Kod
  public function action_contact_form()
      {
      //formularz
      }
      public function action_page($id)
      {
      var_dump($id);
      }


questionmark.gif
ziqzaq
Wydaje się ok oprócz tego, że nadpisujesz sobie regułę "default" (zostanie tylko ta druga).
nowy_pehapowiec
JEszcze raz dzięki!
Fakt, powinienem mieć dwie różne nazwy. Czy teraz jest ok??
Kod
Route::set('nie_default_a_contact', 'contact')
->defaults(array(
'controller' => 'main',
'action' => 'contact_form',
));

Route::set('default', '(<id>)')
->defaults(array(
'controller' => 'main',
'action' => 'page',
));


Czy z nazw tych tras (route) gdzieś później się korzysta?

pozdro
ziqzaq
Cytat
Czy teraz jest ok??

Wygląda ok. Sprawdź sobie.
Cytat
Czy z nazw tych tras (route) gdzieś później się korzysta?

To już zależy od twoich potrzeb. Możesz pobierać sobie zdefiniowane ścieżki routingu poprzez metodę Route::get($name).
nowy_pehapowiec
A do czego może mi się przydać: Route::get($name)
Jakie może być dla tego praktyczne zastosowanie?

pozdro
ziqzaq
Szybki przykład to ostatni nagłówek dokumentacji Routes, URLs, and Links.
nowy_pehapowiec
Czytałem to kilka razy ale nic ciekawego nie zauważyłem albo nie zrozumiałem :| ale dzięki za pomoc

pozdro
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.