Odkaz v komponentě na vlastní handle neobsahuje parametry presenteru

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

V šabloně komponenty chci odkaz na její vlastní handle, ale vygenerovaný odkaz neobsahuje parametry presenteru.

Podle dokumentace by to mělo fungovat:
Signál se vždy volá na aktuální view s aktuálními parametry, parametry signálu se jen přidají. Navíc se přidává hned na začátku parametr ?do, který určuje signál.

Co přehlížím nebo mám špatně? Předem díky za nápady.

Mám presenter a v něm renderOrderDetail(). Presenter vytváří komponentu pomocí továrny a nastavuje ID objednávky z parameteru presenteru.

<?php
public function createComponentCustomerOrders()
{
	$control = $this->customerOrdersFactory->create();
	if ( $this->getAction() == 'orderDetail' )
	{
		$control->setDetailId($this->getParameter('id'));
	}
	return $control;
}
?>

Komponenta je potomkem UI\Control a má vlastní šablonu. V šabloně presenteru OrderDetail.latte volám jenom tu komponentu {control customerOrders:detail}. Render v komponentě vypadá takto:

<?php
public function renderDetail()
{
	// nacitani informaci o objednavce
	$this->template->setFile( __DIR__ . '/Controls/CustomerOrderDetail.latte');
	$this->template->render();
}
?>

A samotný odkaz v šabloně komponenty:

<a n:href="downloadInvoice! invoiceId => $order->getInvoiceId()">faktura</a>

Jsem na adrese: http://localhost/muj-ucet/detail-objednavky/1501 a výsledek odkazu na handle je: http://localhost/muj-ucet/detail-objednavky?customerOrders-invoiceId=6219316&do=customerOrders-CustomerOrders-downloadInvoice

Po parameteru presenteru ani vidu.

Routa:

<?php
$public[] = new Routers\Route('[<locale=cs cs|sk>/]muj-ucet[/<action>[/<id>]]', [
	'module' => 'Shopping',
	'presenter' => 'Customer',
	'action' => [
		Routers\Route::VALUE => 'default',
		Routers\Route::FILTER_TABLE => [
			'prihlasit' => 'login',
			'odhlasit' => 'logout',
			'zapomenute-heslo' => 'forgottenPassword',
			'registrovat' => 'registration',
			'obnovit-heslo' => 'recoveryPassword',
			'zakladni-informace' => 'basicInformation',
			'objednavky' => 'orders',
			'detail-objednavky' => 'orderDetail',
		],
	],
	'id' => NULL,
], $this->httpSecured ? Routers\Route::SECURED : 0);
?>

Zkoušel jsem není problém, ale nepomohlo:

  1. nevoalt komponentu s renderDetail() ale nechat ten výchozí render()
  2. upravit routu aby action a id byly povinné
  3. dát do odkazu na handle parametr ID, ale ten se správně propíše jako parameter pro komponentu

A tady mi došly nápady…

David Matějka
Moderator | 6445
+
+6
-

Hm, dokumentace neni uplne presna. Prenaseji se

  1. persistetni parametry vzdy (respektive pokud spadaji do scope)
  2. v pripade odkazovani na this (coz je fakticky i signal) se prenaseji parametry uvedene v prislusne action*, resp render* metode v presenteru.

v tvem pripade tedy pridej do metody renderOrderDetail parametr $id

ZahorskyJan
Člen | 59
+
0
-

@DavidMatějka díky! Už to funguje jak má :-)