Název projektu místo id v url

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xciza
Člen | 194
+
0
-

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
+
0
-

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
+
0
-

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

Casper
Člen | 253
+
0
-

Co to znamená ti říká ta chyba ne? Předáváš špatný callback.

Je ta metoda statická? Pokud ne, vytvářej callback nad objektem.

callback($detailRepository, 'getTitle')
xciza
Člen | 194
+
0
-

ano, metoda je statická

jiri.pudil
Nette Blogger | 1029
+
0
-

Nemáš ten repozitář v nějakém namespacu?

Casper
Člen | 253
+
0
-

A nepoužíváš namespaces? Pak by je callback musel obsahovat.

callback('Model\Repository\DetailRepository::getTitle');
xciza
Člen | 194
+
0
-

Repositář ve kterém zjišťuji title projektu je v namespaces:

namespace Todo;
xciza
Člen | 194
+
0
-

jestli to dobře chápu, tak bych měl změnit

callback('Model\Repository\DetailRepository::getTitle');

na

callback('Todo\Repository\DetailRepository::getTitle');

?

Casper
Člen | 253
+
0
-

Proč to rovnou nezkusíš?

Pokud je namespace Todo a název třídy DetailRepository, tak jen

callback('Todo\DetailRepository::getTitle');
xciza
Člen | 194
+
0
-

Díky. Ještě se blbě zeptám proč mě teď laděnka hází chybu

Using $this when not in object context
    public static function getTitle($projectId){
19:            return $this->getTable()->select('title')->where('id_project', $projectId);
20:
21:        }

? Díky

David Matějka
Moderator | 6445
+
0
-

neni ta hlaska dost jasna? pouzivas $this ve staticke fci

xciza
Člen | 194
+
0
-

No chápu že není vytvořen objekt, ale at zkousim co zkousim tak se me zatim nedari to rozchodit…

David Matějka
Moderator | 6445
+
0
-
  1. metoda nemuze byt staticka
  2. https://forum.nette.org/…sto-id-v-url#…
xciza
Člen | 194
+
0
-

Musím ještě objektu $detailRepository přiřadit nějak to že si má tu funkci vzít práve v Todo/DetailRepository?

Jan Suchánek
Člen | 404
+
0
-

@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)

xciza
Člen | 194
+
0
-

Tak ted uz jsem z toho uplne mimo. Mohli by jste mě prosím více nasměrovat? Proč nepoužívat $this? co místo něho? Inject? to sem jeste nedelal…

David Matějka
Moderator | 6445
+
0
-

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')),
		....

	}
}
xciza
Člen | 194
+
0
-

No už mě to sice neháže žádnou chybu, ale v url stálení není to co potřebuji. momentálně je tam

/projects/detail?projectId=1

ale podle routy by mělo být

/nazevProjektu/detail
David Matějka
Moderator | 6445
+
0
-

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
+
0
-
<?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
+
0
-

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
+
0
-

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)