Množstvo webov potrebuje svoje podstránky zobrazovať na základe vygenerovaných nice friendly url adries reprezentujúce záznamy v databáze, namiesto výberu záznamov podľa id.
!> Vyberanie záznamu pomocou ID
example.com/clanok/1
!> Vyberanie záznamu pomocou slugu
example.com/clanok/moj-clanok
Pre tento prípad poskytuje rozšírenie CrudAdmin jednoduchú správu generovanie slugov na základe hodnôt z databázy pomocou vlastnosti sluggable
v Admin Modeli.
class Article
{
...
/*
* Sluggable
*/
protected $sluggable = 'name';
...
protected $fields = [
'name' => 'name:Názov|placeholder:Zadajte názov článku|required|max:90',
'content' => 'name:Obsah článku|type:editor|required',
'image' => 'name:Obrázok|type:file|image|required',
];
}
Po zadefinovaní vlastnosti sluggable
, ktorá reprezentuje stĺpec poľa, z ktorého sa budu automaticky generovať url adresy, sa v databáze vytvorí pomocný stĺpec s názvom slug
, do ktorého bude po vytvorení, či úprave záznamu uložená vygenerovaná hodnota slugu z tohto stĺpca.
!> V prípade, že vygenerovaná hodnota slugu po vytvorení záznamu už v databáze existuje, bude za adresu slugu dosadená inkrementálna hodnota v poradí existéncie daného slugu. V preklade pokial 3 záznamy obsahuju názov Môj članok, slugy budú vygenerované s nasledujúcimi hodnotmi moj-clanok, moj-clanok-1, moj-clanok-2.
Pokiaľ vstupné pole obsahuje parameter locale
, ktorý prekladá záznam do viacerých jazykov, bude hodnota v stĺpci slug
uložená vo formáte typu JSON, kde každý jazyk bude obsahovať vlastnú hodnotu slugu.
...
/*
* Sluggable
*/
protected $sluggable = 'name';
protected $fields = [
'name' => 'name:Názov|locale|required',
];
!> Pokial záznam nemá v administrácii priradený preklad, systém CrudAdmin automatický použije slug z hlavného jazyka, alebo dostupnej preloženej hodnoty.
?> Viac o preklade záznamov a textu nájdete v sekcii jazykové mutácie.
V kontroléri k výberu záznamu z databázy CrudAdmin sprístupnil metódu findBySlug()
alebo findBySlugOrFail()
, ktoré vyhľadajú záznam na základe hodnoty slugu z url adresy, ktorá bola dosadená ako parameter v url adrese.
class ArticleController extends Controller
{
...
/*
* example.com/article/{slug}
*/
public function show($slug)
{
$article = Article::findBySlugOrFail($slug);
return view('article')->withArticle($article);
}
K výberu záznamu pomocou hodnoty slug
je možné vyberať záznam taktiež aj pomocou id
záznamu zároveň. Ak funkcia findBySlug
alebo findBySlugOrFail
dostane ako druhý parameter id
daného záznamu, skontroluje pravosť slugu v url adrese, a pri nezhode slugu s databázou automaticky presmeruje klienta na správnu url adresu záznamu s hlavičkou kódu 301
.
class ArticleController extends Controller
{
...
/*
* example.com/article/{id}/{slug}
*/
public function show($id, $slug)
{
$article = Article::findBySlugOrFail($slug, $id);
return view('article')->withArticle($article);
}
Pokial chceme pristúpiť k hodnote slugu v danom zázname, jednoducho použíjeme metódu $article->getSlug()
, ktorá vráti vygenerovanú hodnotu slugu z daného záznamu v databáze.
<a href="{{ action('ArticleController@show', $article->getSlug()) }}">
{{ $article->name }}
</a>