Dzięki. Zrobiłem w końcu!! Męczarni z tym było, bo baza danych już gotowa jest. Dodatkowo dodałem Unique dla nazwy.
Zawsze lepiej stosować ID w adresie, łatwiej się operuje i masz pewność, że nigdy nie trafisz na konflikt nawet jeśli będziesz miał takie same tytuły, bo 5 osób może wystawić "Sprzedam opla".
adres.pl/oferta/15/sprzedam-opla
W routingu oczywiście wszystko oddzielone:
Route::set('offer', 'oferta/<item_id>(/<slug>)', array('item_id' => '\d+', 'slug' => '[0-9a-z-]+'))
->defaults(array(
'controller' => 'offers',
'action' => 'show',
));
W kodzie zwyczajnie, ładowanie obiektu przez jego primary key.
$item_id = $this->request->param('item_id');
$offer = ORM::factory('offer', $item_id);
if(!$offer->loaded()) throw new HTTP_Exception_404('Nie ma takiej oferty');
$this->view->offer = $offer;
Slug w tym wypadku jest bez znaczenia, służy wyłącznie jako kwestia SEO i możesz go pomijać przy zapisie i generować w locie na podstawie tytułu oferty lub nazwy czegoś tam. Najlepiej w modelu ORM dodać sobie funkcję która zwróci od razu cały adres lub sam slug.
public function get_slug()
{
return url::title($this->title,'-',true);
}
public function get_uri()
{
return url::site('oferta/'.$this->id.'/'.$this->get_slug());
}
I w widoku odwoływać się:
<a href="<?php echo $offer->get_uri() ?>" title="<?php echo $offer->title ?>"><?php echo $offer->title ?></a>