Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [cakePHP] konstrukcja URLi a nazwy akcji
Forum PHP.pl > Forum > Gotowe rozwiązania
siemakuba
Sytuacja wygląda nastęująco.
Mam URL który wygląda tak: http://cake/aktualnosci/tutaj-tytul-aktualnosci
Ma to na celu oczywiscie zrobienie bardziej NiceURLs niz http://cake/news/1

Plik app/config/routes.php
  1. <?php
  2. $Route->connect('/aktualnosci', array('controller' => 'news', 'action' => 'index'));
  3. $Route->connect('/aktualnosci/*', array('controller' => 'news', 'action' => 'showNews'));
  4. ?>

W kontrolerze NewsController mam metodę showNews, która odpowiada za pobranie odpowiedniego newsa z modelu, na podstawie meta_name:
  1. <?php
  2. function showNews()
  3. {
  4. $args = func_get_args();
  5. $news = $args[0];
  6. $this->set('news', $this->News->findByMeta_Name($news));
  7. }
  8. ?>

Jak do tej pory, wyszsko gra.

Kolejna sprawa jest taka, że URLe http://cake/pages/kontakt, http://cake/pages/o-nas nie wygladaja OK, a bardziej OK wygladaja URLe http://cake/kontakt, http://cake/o-nas. Ten problem rozwiazalem kierujac caly nieznany ruch na kontrole Pages:
Plik app/config/routes.php
  1. <?php
  2. $Route->connect('/*', array('controller' => 'pages', 'action' => 'subpage'));
  3. ?>
To ostania regułka, więc wszystko co nie zostanie złapane do innych konrolerów pójdzie do kontrolera Pages, metody subpage, która dalej decyduje co pokazać.

Tu właśnie pies pogrzebany został :)
Pojawił się URL http://cake/oferta/dla-firm. Jest kontroller Offers, jest Routing z oferta/ na kontroller OffersController. I dostaję błąd: You are seeing this error because the action dlafirm is not defined in controller OffersController. Ha, ale metoda dlafirm jak najbardziej istnieje w OffersController.

Dalej, przszukałem http://groups.google.com/group/cake-php/ i znalazłem info, że można rozwiązać problem stosując brzydki hack w pliku app/config/bootstrap.php. Hack polega na przepisaniu $_GET['url'] i pozbyciu się myślników z URLa:
  1. <?php
  2. $_GET['url'] = r('-', '', $_GET['url']);
  3. ?>
Hack oczywiście robi swoje, i OffersController zaczyna widzieć metodę, wszystko działa.
Działa, do momentu kiedy nie wrócimy do http://cake/aktualnosci/tutaj-tytul-aktualnosci. Po zastosowaniu hacka, ten URL staje się oczywiście http://cake/aktualnosci/tutajtytulaktualnosci (wewnątrz aplikacji) i nie zostaje w bazie znaleziony odpowiedni rekord.

Zapisanie w bazie wersji bez myślników jest o tyle problematyczne, że wykorzystuję pole meta_name do budowy linków. Można ewentulanie za każdym razem w locie tworzyć meta_name na podstawie tytułu newsa /artykułu/whatever ale co z sytuacją, kiedy nie będzie się to działo automatycznie, tylko dam możliwość storzenia meta_name poprzez panel administracyjny. Wtedy tytuł newa może być "Zapraszamy do reklamy" a odpowiadający mu meta_name "to-bardzo-fajny-news".

Jakieś pomysły, co zrobić z zainstniałą sytuacją? Nie znam cakePHP super-świetnie. Do tej pory poznawałem go w domowym zaciszu testując. Prawdziwe problemuy rodzą się właśnie w takich real-life sytuacjach.

pozdr.
nrm
Jakbyś bardziej przemyślał kontrukcje serwisu to byś się w ogole nie bawil takimi problemami bo przecież przykładowe o-nas i kontakt można jakoś zgrupować w jeden kontroler np. /firma/o-nas, /firma/kontakt
i ładnie wygląda, i nie masz problemu. Wiem, że to nie rozwiązanie Twojego problemu bezpośrednio, ale warto nad tym pomyśleć aby w przyszłości znowu nie kombinować bo wcześniej się za bardzo zakombinowało.

jeszcze edit do drugiego przykladu: tutaj tez nie bawie sie w kombinacje i mam: serwis.pl/news/123/to-jest-tytul-newsa
rewrite tytulu mozesz zrobic poprzez napisanie wlasnego helpera i zamiane tytulu na rewrite tytul na poziomie widoku.
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-2024 Invision Power Services, Inc.