Undefined index: slug (ale on existuje)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
AgentKrtek
Člen | 3
+
0
-

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
+
0
-

Na jakym radku ti to tu chybu hlasi? Nebo lepe, posli rozklikavaci ladenku.

Michal Vyšinský
Člen | 608
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

@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)