Routování – filter_in – neposílá hodnoty které potřebuji

Jan Kostohryz
Člen | 14
+
0
-

Zdravím,
mám v šabloně odkaz s jedním parametrem:

<a n:href="Games:list $item->category_id">{$item->category_title}</a>

A chci v routeru pomocí FILTER_IN přeměnit category_id na pole hodnot – ty mám v databázi. Abych v url adrese zobrazil url místo id. Poté aby to poslalo hodnoty do presenteru. Kde je použiji dump abych věděl že vše funguje. Hodnoty pak použiji na nadpisy v další šabloně a vyhledávání v databázi.

<?php

declare(strict_types=1);

namespace App\Router;

use Nette;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
use App\Model\DatabaseFunctions;


class RouterFactory
{

	public $databaseFunctions;

	public function __construct(DatabaseFunctions $databaseFunctions)
    {
        $this->databaseFunctions = $databaseFunctions;
    }

	public function create(): RouteList
	{
		$router = new RouteList;
		$router->addRoute('administrace', 'Administration:default');

		$router->addRoute('<action>', [
			'presenter' => 'Administration',
			'action' => [
				Route::FILTER_STRICT => true,
				Route::FILTER_TABLE => [
					'administrace' => 'default',
					'prihlaseni' => 'login',
					'odhlasit' => 'logout',
					'registrace' => 'register'
				]
			]
		]);

		$router->addRoute('stranka/<category_id>', [
			'category_id' => [
				Route::FILTER_IN => function ($category_id) {
					$category = $this->databaseFunctions->getCategoryById($category_id);
					return $category;
				}
			],
			'presenter' => 'Games',
			'action' => 'list'

		]);



		$router->addRoute('<presenter>/<action>', 'Games:default');
		return $router;
	}

Presenter:

  public function renderList($category)
    {
        //$this->template->gamesList = $this->databaseFunctions->getGamesByCategory($category_id);
        //$this->template->category_title = $category_title;
        dump($category);

    }

Když mám vše takto, tak to mojí routu přeskočí a použije tu níže:

$router->addRoute('<presenter>/<action>', 'Games:default');

Ale jen co napíši do funkce presenteru a dump místo $category $category_id.

   public function renderList($category_id)
    {
        //$this->template->gamesList = $this->databaseFunctions->getGamesByCategory($category_id);
        //$this->template->category_title = $category_title;
        dump($category_id);

    }

Pole se asi pošle a zobrazí chybu:
url adresa: http://localhost:8000/stranka/3

Argument 1 passed to Nette\Routing\Route::param2path() must be of the type string, object given, called in /var/www/sites/Nette/projekt1/vendor/nette/routing/src/Routing/Route.php on line 240

Dělal jsem to částečně podle posoboty: https://youtu.be/zYpCmX5-oO0

Vůbec netuším co stím, moc prosím o radu.

Marek Bartoš
Nette Blogger | 1167
+
+2
-

Nekomplikuj si život s filtry v routě a prostě si předávej jen ID. Stačí když si kategorii podle ID získáš až v akci presenteru.