W serwisie znajdują się 2 tabele dla kategorii i artykułów. Routing prowadzony jest w oparciu o bazę danych - tabela urls(url, content_type, content_id), gdzie - jak nie trudno się domyślić - url jest unikalnym identyfikatorem zasobu (kategorii lub artykułu), a content_type polem enum przyjmującym wartość category lub page. Dlatego też content_id może się powtarzać (sytuacja gdy takie samo id ma kategoria i postrona).
Tu pojawia się problem zdefiniowania relacji typu has one w ORM'ie KO3. Dlaczego? Ponieważ deklaracja taka była by identyczna dla modelu kategorii jak i artykułów. Tj: protected $_has_one = array('url' => array('model' => 'url', 'foreign_key' => 'content_id')); Skutki jakie mogło by to pociągnąć za sobą, to przykładowo zwracanie url'a dla kategorii zamiast podstrony. Nie mówiąc o ewentualnych błędach. Jak temu zaradzić? Potrzeba określić warunek w relacji, taki który będzie określał content_type. W tym celu zmodyfikujemy lekko moduł ORM Kohany.
Rozwiązanie
Rozwiązanie jest proste. Do definicji relacji dodajemy warunek where, który będzie odpowiadał za określenie typu (content_id) obiektu (category/page). Wyglądać to będzie tak (dla modelu page): protected $_has_one = array('url' => array('model' => 'url', 'foreign_key' => 'content_id', 'where' => array('content_type' => 'page')));. Aby coś takiego zadziałało udajemy się do modules/orm/classes/kohana/orm.php i po linii 339 dodajemy:
if ( isset($this->_has_one[$column]['where']))
{
foreach ( $this->_has_one[$column]['where'] as $c => $v )
$model->where($c, '=', $v);
}
Zostawiam jako ciekawostkę. Chyba mało kto orientuje się jak to wygląda albo po prostu nie mieli okazji o tym słyszeć. Ja też do niedawna nie wiedziałem. Dodam tylko, że poniższe regułki dotyczą satanizmu laveyańskiego (takiego, który jako najwyższą wartość uznaje człowieka i jego potrzeby).
Jedenaście przykazań satanizmu
Nie wyrażaj swoich opinii lub rad, jeżeli nie jesteś o to proszony.
Nie zwierzaj się ze swoich problemów innym, chyba ze jesteś pewien, że chcą o nich słuchać.
Kiedy jesteś w cudzym domu (na cudzym terenie) okaż mu respekt lub, jeżeli nie potrafisz, nie chodź tam.
Jeżeli gość w twoim domu (na twoim terenie) dręczy cię, traktuj go okrutnie i bez miłosierdzia.
Nie czyń seksualnych awansów, dopóki nie dostaniesz wyraźnej propozycji współżycia.
Nie bierz tego co nie należy do ciebie, chyba że jest ta rzecz dla kogoś brzemieniem i osoba ta "płacze", by być uwolniona.
Potwierdź moc magii, jeśli udało ci się przy jej pomocy zaspokoić swoje pragnienia. Jeżeli zaprzeczysz mocy magii po jej wykorzystaniu, utracisz wszystko co w ten sposób uzyskałeś.
Nie narzekaj na coś, czemu nie musisz się poddawać.
Nie krzywdź małych dzieci.
Nie zabijaj zwierząt (nie-ludzi), chyba że zostaniesz zaatakowany lub będziesz potrzebował pożywienia.
Kiedy chodzisz w "otwartym" terenie nie zaczepiaj nikogo. Jeżeli ktoś cię zaczepia, poproś go by przestał. Jeżeli nie przestanie, zniszcz go.
Nie u mnie! Choć na FB obiecałem się "pojawić" na owym wydarzeniu. Nie będzie z jednego powodu: w tym roku praktycznie nie udzielałem się w blogosferze. I jak widać dalej brnie w to samo.
But... why?! Zaraz wyjaśniam. Przeszła mi obywatelska i patriotyczna postawa komentowania aktualnej sytuacji politycznej/absurdów dziejących się na naszym podwórku. Bunt bloggera, akcja na FB czy innej społecznościówce daje tyle co kot napłakał. Nie ma sensu wyrażać swoich poglądów, nie ma sensu brać udziału w flamewarach. Dlatego tak drastycznie spadła częstotliwość moich wpisów. Choć nie mówię definitywnie, że to koniec takich wpisów - może coś tak podrapie mnie po nerwach, że samo się coś o tym napisze. Z resztą blogowanie nigdy mi nie wychodziło za dobrze.
Minął też okres kiedy w sieci można było pisać o swoim życiu. Ostatnio nawet na Joggerze było o tym, tylko nie pamiętam już gdzie. Trudno pisać o swoim życiu, finansach w sieci. Ja tej zasady trzymam się prawie od zawsze.
O projektach też nie można pisać, bo tajne. W sumie... jedyne co mi wpadło do głowy na tegoroczny BlogDay to Planeta PHP.pl i prawie-blog - Google'owski HTML5Rocks, które to śledzę od dawna. Choć uważam, że to zbyt techniczne.