Routování – filter_in – neposílá hodnoty které potřebuji
- Jan Kostohryz
- Člen | 14
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 | 1263
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.