Undefined index: slug (ale on existuje)
- AgentKrtek
- Člen | 3
Zdravím,
mám následující router, který podle databáze určuje locale:
$router = new RouteList();
$router[] = new Route('<slug [a-z0-9_-]+>', array(
'presenter' => 'Static',
'action' => 'default',
NULL => array(
Route::FILTER_IN => function ($params) use ($database) {
$retVal = $database->table('static_pages')->select('id, locale')->where('route', $params['slug'])->fetch();
if($retVal)
{
$params['slug'] = $retVal->id;
$params['locale'] = $retVal->locale;
return $params;
}
else
return NULL;
},
Route::FILTER_OUT => function ($params) use ($database) {
$retVal = $database->table('static_pages')->select('route, locale')->where('id', $params['slug'])->fetch();
if($retVal)
{
$params['slug'] = $retVal->route;
unset($params['locale']);
return $params;
}
else
return NULL;
}
)
));
$router[] = new Route('[<locale=cs cs|en>/]<presenter>/<action>', "Homepage:default");
Tracy mi neustále hlásí Notice: Undefined index: slug. Když si tu proměnnou dumpnu, tak tam slug je. Ono dokonce url při zobrazení této chyby je správně přeložené.
Jedná se o bug, nebo něčemu výrazně nerozumím?
- David Matějka
- Moderator | 6445
Na jakym radku ti to tu chybu hlasi? Nebo lepe, posli rozklikavaci ladenku.
- Michal Vyšinský
- Člen | 608
S tímto jsem se už také setkal, bylo to pro mě WTF, protože v dumpu ten index na 100 % byl. Nakonec jsem zjistil, že se ta funkce volá dvakrát a že podruhé tam ten index není, takže to vyřešil isset()
Editoval Michal Vyšinský (28. 4. 2014 12:30)
- Jan Suchánek
- Člen | 404
@AgentKrtek: A co vyhodit rovnou NULL, když ten slug neexistuje? Pokud neexistuje slug měla by následovat nějaká jiná routa např. Homepage Presenter?
$router = new RouteList();
$router[] = new Route('<slug [a-z0-9_-]+>', array(
NULL => array(
Route::FILTER_IN => function ($params) use ($database) {
… // if(!isset($params["slug"]) return NULL; ?
},
Route::FILTER_OUT => function ($params) use ($database) {
…
}
),
'presenter' => 'Static',
'action' => 'default',
'slug' => NULL, // a podle čeho má vědět, že existuje nějaký slug, když ho v konstruktoru nepředáváš?
));
Editoval jenicek (28. 4. 2014 13:51)
- AgentKrtek
- Člen | 3
Problém byl v tom že ve FILTER_IN byl $params[‚slug‘] definován
vždy, zatímci v FILTER_OUT ne.
Každopádně isset() pomohl. Výsledek tedy je:
public function createRouter(Nette\Database\Context $database)
{
$router = new RouteList();
$router[] = new Route('<slug [a-z0-9_-]+>', array(
'presenter' => 'Static',
'action' => 'default',
NULL => array(
Route::FILTER_IN => function ($params) use ($database) {
$retVal = $database->table('static_pages')->select('id, locale')->where('route', $params['slug'])->fetch();
if($retVal)
{
$params['slug'] = $retVal->id;
$params['locale'] = $retVal->locale;
return $params;
}
else
return NULL;
},
Route::FILTER_OUT => function ($params) use ($database) {
if(!isset($params['slug']))
return NULL;
$retVal = $database->table('static_pages')->select('route, locale')->where('id', $params['slug'])->fetch();
if($retVal)
{
$params['slug'] = $retVal->route;
unset($params['locale']);
return $params;
}
else
return NULL;
}
)
));
$router[] = new Route('[<locale=cs cs|en>/]<presenter>/<action>', "Homepage:default");
return $router;
}
Díky moc za pomoc
- Jan Suchánek
- Člen | 404
@AgentKrtek: a když ho budeš definovat?
$router[] = new Route('<slug [a-z0-9_-]+>', array(
'presenter' => 'Static',
'action' => 'default',
'slug' => FALSE,
...
A nemělo by tam být i to locale?
$router[] = new Route('[<locale [cs|en|de]{2} >/]<slug [a-z0-9_-]+>', array(
'locale' => 'cs',
'slug' => FALSE,
'presenter' => 'Static',
'action' => 'default',
...
Editoval jenicek (28. 4. 2014 17:28)