Název projektu místo id v url
- xciza
- Člen | 194
Ahoj,
na webu mám takovouto routu pro detail projektu:
$router[] = new Route('<projectId>/detail/', 'Front:Projects:detail');
Chtěl bych aby místo „<projectId>“ byl název projektu, který je uložený v databázi. Potřeboval bych trochu navést (případně i ukázat) jak na to (jestli je to možné)?
Díky
- Casper
- Člen | 253
Mrkni do
dokumentace na překladové funkce a filtry (Route::FILTER_IN
a
Route::FILTER_OUT
). Řešilo se také např. tady.
Editoval Casper (1. 11. 2013 10:54)
- xciza
- Člen | 194
Tak jsem zkusil podle toho vlákna vytvořit taky v DetailRepository metodu na získání názvu projektu, potom přidat routu:
$router[] = new Route('<projectId>/detail/', array(
'presenter' => 'Front:Projects',
'action' => 'detail',
'projectId' => array(
Route::VALUE => 0, // default value
Route::FILTER_OUT => callback('DetailRepository::getTitle'),
),
));
Ale výsledek je že laděnka hlásí chybu:
Callback 'DetailRepository::getTitle' is not callable.
Co to pro mě znamená? Díky
- Jan Suchánek
- Člen | 404
@xciza: Můžeš ji volat staticky, ale pak nepoužívej uvnitř $this. Nebo ji používej nestaticky, ale potomu musíš ten objekt Routě předat, injectnout.
Pošli na pastebin co provádíš.
Editoval jenicek (4. 11. 2013 17:34)
- David Matějka
- Moderator | 6445
do toho $detailRepository je potreba dostat instanci
Todo\DetailRepository
, to mas predpokladam registrovany jako
sluzbu, pokud routy vytvaris v RouterFactory, tak:
class RouterFactory
{
protected $detailRepository;
public function __construct(Todo\DetailRepository $detailRepository)
{
$this->detailRepository = $detailRepository;
}
public function createRouter()
{
.....
.....
Route::FILTER_OUT => callback(array($this->detailRepository, 'getTitle')),
....
}
}
- David Matějka
- Moderator | 6445
hod sem cely routerfactory s definici vsech rout.
nemas nejdriv nejakou obecnou routu a az pak tuhle specifickou? ta obecna by mela byt az na konci, jelikoz dokaze odchytit cokoliv.
- xciza
- Člen | 194
<?php
use Nette\Application\Routers\RouteList,
Nette\Application\Routers\Route,
Nette\Application\Routers\SimpleRouter;
/**
* Router factory.
*/
class RouterFactory {
protected $detailRepository;
public function __construct(Todo\DetailRepository $detailRepository) {
$this->detailRepository = $detailRepository;
}
/**
* @return Nette\Application\IRouter
*/
public function createRouter() {
$router = new RouteList();
if (
function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules()) // pro Apache
|| isset($_SERVER["NETTE_HTACCESS"]) // pro FastCGI nebo okoliv jineho kde mame flag
) {
$router[] = new Route('Loga', 'Front:Projects:logos');
$router[] = new Route('tistenaGrafika', 'Front:Projects:print');
$router[] = new Route('kontakt', 'Front:Contact:default');
// $router[] = new Route('<projectId>/detail/', 'Front:Projects:detail');
$router[] = new Route('index.php', 'Front:Projects:default', Route::ONE_WAY);
$router[] = $adminRouter = new RouteList('Admin');
$adminRouter[] = new Route('admin/<presenter>/<action>', 'Default:default');
$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Projects:default');
$router[] = new Route('<projectId>/detail/', array(
'presenter' => 'Front:Projects',
'action' => 'detail',
'projectId' => array(
Route::VALUE => 0, // default value
Route::FILTER_OUT => callback(array($this->detailRepository, 'getTitle')),
),
));
} else {
$router = new SimpleRouter('Front:Projects:default');
}
return $router;
}
}
- David Matějka
- Moderator | 6445
jo, jak pisu – ta routa
$router[] = new Route('<projectId>/detail/' ....
musi byt pred
$router[] = $frontRouter = new RouteList('Front');
$frontRouter[] = new Route('<presenter>/<action>[/<id>]', 'Projects:default');
- xciza
- Člen | 194
Tam jsem ji uz zkousel dat, ale po zkatualizování stránky ji mám pouze bílou a na ni menu a kdyz kliknu na menu kde by mely byt jiné reference tak laděnka hlásí chybu:
rawurldecode() expects parameter 1 to be string, object given
jo a řádek na kterem to hlasi je odkaz na detail:
<a n:href="Projects:detail projectId => $big->id">dozvědět se více</a>
EDIT: když nechám tu routu až za defaultní a pak se po odkazu na detail podivam do debug baru tak tam mam:
Matched? Class Mask Defaults Module Request****
may Route <projectId>/detail/ presenter = Front:Projects Front:Projects:detail
action = detail projectId = projects
projectId = 0
Editoval xciza (4. 11. 2013 18:45)