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)