Nefungující odkaz v komponentě

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

Dobrý den,
mám komponentu která generuje navigační tlačítka do administrace, ovšem když chci generovat odkaz i s ID tak nette hlásí chybu error: No route for Admin:presenter:action id() … control pro komponentu posílá odkazy v poli typ_odkazu ⇒ odkaz a šablona to pak vykresluje pomocí makra plink…

control:

class NavigationControl extends Control
{

		public function render($data = NULL)
    {
        $template = $this->template;
        $template->setFile(__DIR__ . '/templates/navigationControl.latte');
        $urls = array('view' => ':'.$this->presenter->name.':');
        if($this->presenter->parameters['id']){
					$urls['preview'] = ':admin:technologies:preview '.$this->presenter->params['id'];
				}
				$template->urls = $urls;
        $template->translate = array('add' => 'Přidat', 'view' => 'Přehled', 'preview' => 'Náhled');
        $template->navigationData = $data;
        $template->render();
    }

}

a šablona:

<div class="navigation clearfix">
{foreach $navigationData as $item}
	{var $link = (array_key_exists($item, $urls)) ? $urls[$item] : $item}
	<a {if $item == 'preview'}target="_blank"{/if} class="block left" id="{$item}" href="{plink $link}"><div class="icon"></div><span class="title">{$translate[$item]}</span></a>
{/foreach}
</div>

dodávám ještě routerfactory pro jistotu:

public function createRouter()
	{
		$router = new RouteList();

		$router[] = $admin = new RouteList('Admin');
		$admin[] = new Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default');
		return $router;

	}

děkuji za jakékoli rady

Tirus91
Člen | 199
+
0
-

Nestačilo by v komponentě upravit metodu render?

z

$urls = array('view' => ':'.$this->presenter->name.':');

na

$urls = array('view' => ':'.$this->getParent()->presenter->name.':');
David Kudera
Člen | 455
+
0
-

@Tirus91 to by mělo být jedno. Pokud by nebyl presenter dostupný, což v render metodě už je, tak by mu to vyhodilo exception. To getPresenter nebo jen presenter stejně volá obecnou metodu lookup s názvem třídy, která se má ve stromu komponent směrem nahoru dohledat

David Kudera
Člen | 455
+
0
-

Ehm, když už v renderu stejně přistupuješ k presenteru, tak co ty url vytvořit už tam rovnou pomocí $this->presenter->link('...');?
Stejně když tam někdy budou parametry, tak si nemyslím, že by to pak latte přeložilo. Myslím tím tohle:

$urls['preview'] = ':admin:technologies:preview '.$this->presenter->params['id'];
wassy
Člen | 46
+
0
-

díky za rady, vytvářet tu url už v komponentě mě napadlo, ale nefungovalo mi to, protože jsem psal jen $this->link(). Díky za pomoc :)