Url router dynamicky z database

Radek39
Člen | 2
+
0
-

Zdravim,
mam na vas otazku. Chtel bych si napsat vlastni router, ale nikde nemuzu najit jak na to. Nebo spatne hledam.
Moje predstava je ta, ze mam v databasy tabulku treba s nazvem url.
Tabulka url
Id. Url. presenter action id

  1. nejka-url. Clanek. Detail pes-a-auto
  2. nejaka-jina foto. Detail
  3. Kategorie-foto kategoriefoto show

Doufam ze me chapete.
V danych kategoriich v adminu se ulozi url s danym presenterem a action a na frontendu se podle url vzdy pouzije dane presenter:action

Vsem dekuji za mozne rady a napady predem dekuji.
Vzhled adresy podle tabulky url.
www.domena.tld/…l/pes-a-auto {plink Clanek:detail, pes-a-auto}
Jeste jednou moc dekuji za rady.

Sitole
Člen | 39
+
+1
-

Není nutné psát vlastní router. Použij stávající a vyuzij funkce FILTER_IN a funkce FILTER_OUT. Příklady najdeš v dokumentaci na stránce https://doc.nette.org/…tion/routing

Radek39
Člen | 2
+
0
-

Moc dekuji,ale vubec nevim kde zacit uz jsem vyskousel snad uplne vsechno, ale bez uspechu. Vse cpu do jedne tabulky teda ne vse. Do dane tabulky ukladam url presenter action. Kde url je zaroven id pro dany presenter a akci. Ale jsem uz v koncich opravdu jsem vyzkousel snad vse. Stahl jsem si stare projekty cms co kdy kdo napsal v nette pro inspiraci nejake nakopnuti. Chapu ze mi tady nikdo nenapise hotove reseni, ale alespon nejaka treba funkcni ukazka. Vsem predem dekuji.

filsedla
Člen | 101
+
+4
-

Zmíněné řešení s filterIn a filterOut by mohlo vypadat třeba takto.

final class RouterFactory
{
    /** @var Nette\Database\Context */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    /**
     * @return Nette\Application\IRouter
     */
    public function createRouter()
    {
        $router = new RouteList;

        $router[] = new Route('<url>[/<id>]', [
            null => [
                Route::FILTER_IN => function (array $params) {

                    $row = $this->database->table('route')
                        ->where('url', $params['url'])
                        ->order('id ASC')
                        ->fetch();

                    if (!$row) {
                        return null;
                    }

                    return [
                        'presenter' => $row->presenter,
                        'action' => $row->action,
                        'id' => $params['id'],
                    ];
                },
                Route::FILTER_OUT => function (array $params) {

                    $row = $this->database->table('route')
                        ->where('presenter', $params['presenter'])
                        ->where('action', $params['action'])
                        ->order('id ASC')
                        ->fetch();

                    if (!$row) {
                        return null;
                    }

                    return [
                        'url' => $row->url,
                        'id' => isset($params['id']) ? $params['id'] : null,
                    ];
                },
            ],
        ]);

        $router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
        return $router;
    }
}