nowy_pehapowiec
8.05.2010, 23:29:13
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
8.05.2010, 23:46:46
Powinny być dwa kontrolery. Możesz utworzyć sobie główny kontroler, np. site, po którym oba kontrolery będą dziedziczyły.
nowy_pehapowiec
9.05.2010, 00:44:41
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
9.05.2010, 02:00:05
A pomyślałeś żeby zrobić jeden kontroler, który będzie z linku otrzymywał zmienną określającą który rekord pobrać?
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
9.05.2010, 10:31:29
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
9.05.2010, 10:46:48
@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 są.
nowy_pehapowiec
9.05.2010, 11:45:22
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
9.05.2010, 12:04:05
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ć
nowy_pehapowiec
9.05.2010, 12:19:30
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
9.05.2010, 12:46:14
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.
Route::set('r1', 'page/kontakt')
'controller' => 'contact',
'action' => 'index'
));
Route
::set('r0', 'page(/<id>)', array('id' => '.*?')) 'controller' => 'page',
'action' => 'index',
'id' => 0
));
Edit: Oczywiście skoro szukamy id to regex dla tego parametru powinien wyglądać raczej tak: "[0-9]+?"
nowy_pehapowiec
9.05.2010, 14:00:01
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
9.05.2010, 14:18:29
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:
public function action_index($id, $przykladowy)
{
}
Nazwy zmiennych w parametrach metody "action_index" powyżej są dowolne czyli równie dobrze może być:
// $numer dla <id>
// $tekst_przykladowy dla <przykladowy>
public function action_index($numer, $tekst_przykladowy)
{
}
nowy_pehapowiec
9.05.2010, 14:31:36
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);
}
ziqzaq
9.05.2010, 14:45:12
Wydaje się ok oprócz tego, że nadpisujesz sobie regułę "default" (zostanie tylko ta druga).
nowy_pehapowiec
9.05.2010, 15:25:17
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
9.05.2010, 15:33:56
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
9.05.2010, 15:44:07
A do czego może mi się przydać: Route::get($name)
Jakie może być dla tego praktyczne zastosowanie?
pozdro
ziqzaq
9.05.2010, 15:51:11
Szybki przykład to ostatni nagłówek dokumentacji
Routes, URLs, and Links.
nowy_pehapowiec
9.05.2010, 19:25:09
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.