RouterFactory a přístup k persistentnímu parametru

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

Ahoj,

mám naprogramovaný modul s články, v databázi mám u každého článku uloženou i cool url a pomocí RouterFactory tyto url přepisuju. Web je více jazyčný a jazyk nastavuji persistentním parametrem $locale ve FrontBasePresenteru.
CoolUrl si kešuji a následně načítám.

Mám to řešené takto v RouterFactory.php a funguje to.

config.nenon

- App\RouterFactory
router: @App\RouterFactory::createRouter

RouterFactory.php

public function createRouter() {

    $router = new RouteList;
    // Admin
        $router[] = new Route('admin/<presenter>/<action>/<id>', array(
            'module' => 'Admin',
            'presenter' => 'Homepage',
            'action' => 'default',
            'id' => NULL,
        ));

        // Route for pages module

        $router[] = new Route('<locale>/<id>', array(
            'id' => array(
                Route::FILTER_IN => function ($id) {
                  if (is_numeric($id)) {
                    return $id;
                  } else {
                    $page = array_flip($this->pages->getUriCache()->load('pagesUri'));

                    if (array_key_exists($id, $page)) {
                      return $page[$id];
                    } else {
                      $e = explode('-', $id);
                      $cutId = array_pop($e);
                      return is_numeric($cutId) ? $cutId : FALSE;
                    }
                  }
                },
                Route::FILTER_OUT => function ($id) {
                  if (!is_numeric($id)) {
                    return $id;
                  } else {
                    $page = $this->pages->getUriCache()->load('pagesUri');
                    return array_key_exists($id, (array) $page) ? $page[$id] : $id;
                  }
                }
            ),
            'locale' => 'cs',
            'module' => 'Front',
            'presenter' => 'Page',
            'action' => 'page',
            ));

    // Basic front router
    $router[] = new Route('[<locale>/]<presenter>/<action>/<id>', array(
            'locale' => 'cs',
            'module' => 'Front',
            'presenter' => 'Homepage',
            'action' => 'default',
            'id' => NULL,
        ));

    return $router;
}

Nyní bych ale chtěl nastavovat rozdílné cool url pro různé jazyky. Pro jednotlivé jazyky mám jednotlivé soubory v cache. Abych to ale mohl rozběhat, potřebuji do následující části kódu protlačit persistentní parametr $locale, podle kterého už si načtu požadovanou cache a nevím si rady jak. Prosím tedy o radu jak toto provést.

'id' => array(
                    Route::FILTER_IN => function ($id) {
                      if (is_numeric($id)) {
                        return $id;
                      } else {
                        $page = array_flip($this->pages->getUriCache()->load('pagesUri'));

.....
.....

Editoval cronos (1. 2. 2017 14:11)

Matey
Člen | 142
+
+2
-

Vo filtri pre ‚id‘ sa dostaneš len k $id.
Použi globálny filter.

jiri.pudil
Nette Blogger | 1032
+
+2
-

Tohle je úplně typický use case pro globální filtry

cronos
Člen | 6
+
0
-

Dokonalé, díky, zkusil jsem to zatím jen tak letmo a funguje to. Úplně jsem to v dokumentaci přehlédl. Ještě se kdyžtak ozvu, kdybych s tím měl nějaký problém.