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 | 1034
+
+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.