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)