Podivné chování n:href, nefiltruje link v proměnné

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

Mám problém s překladem url v šabloně.

Mám např. takový presenter:

class MainPresenter extends Presenter {
	public $path;
	public function renderCategory($categoryId)
	{
		// $path se vezme z modelu, zde priklad
		$path = array(
			12 => 'Školní potřeby',
			13 => 'Sešity'
		);

		foreach ($path as $id => $text) {
			$this->path[] = array(
				// toto nebude fungovat
			 	'link' => "Main:category $id",

				// toto funguje
				//'link' => $this->link("this", $id),

				'text' => $text,
			);
		}
	}

V šabloně pak:

		<div n:inner-foreach="$presenter->path as $bread">
			{* toto nefunguje => filtruje se to jen na '#' *}
			<a n:href="$bread['link']">{$bread['text']}</a> ›

			{* tato druha varianta funguje => spravne se to vyfiltruje v presenteru*}
			{* <a href="{$bread['link']}">{$bread['text']}</a> › *}

			{* kdyz to sem dam natvrdo, tak to funguje => routy jsou spravne *}
			<a n:href="Main:category 12">Školní potřeby</a>
		</div>

Prostě mě to nefiltruje v šabloně link který mám v proměnné.
Když ho filtruji v presenteru tak je vše ok.

Zapnul jsem i Presenter::INVALID_LINK_EXCEPTION ale nic to nevyhazuje.

Teoreticky bych mohl použít ten způsob, který funguje, ale pak by bylo zase složitější kešování.

Nějaký bug?

ldown
Člen | 29
+
0
-

Nejde ani:

{var $link = 'Main:category 12'}
<a n:href="$link">test</a>
Jan Tvrdík
Nette guru | 2595
+
0
-

To je zcela v pořádku. Fungovat ale mohlo:

{var $destination = 'Main:category', $id = 12}
<a n:href="$destination, $id">test</a>

Oprava: $presenter$destination

ldown
Člen | 29
+
0
-

Mě to právě v pořádku nepřijde, ale to je asi věc názoru.
Jinak to tvoje řešení funguje, použiji ho tedy :)

22
Člen | 1478
+
0
-

co to máte za Nette prosím?

<a n:href="Homepage:default 12">test</a> //nefunguje, ale autor vlákna tvrdí, že ano
<a n:href="Homepage:default, id => 12">test</a> //funguje


{var $presenter = 'Main:category', $id = 12}
<a n:href="$presenter, $id">test</a> //nefunguje -> Call to a member function link() on a non-object


{var $link = 'Main:category', $id = 12}
<a n:href="$link, $id">test</a> //nefunguje
<a n:href="$link, id => $id">test</a> //funguje

default nastavení routeru ze sandboxu

Editoval 22 (28. 6. 2011 13:03)

ldown
Člen | 29
+
0
-

Tak to jsou asi nějaké Nette z paralelních vesmírů :)

Verzi mám oficiální 2.0 beta

Čárka by měla být volitelná

22
Člen | 1478
+
0
-

mno já nevím, já mám poslední release… s čárkou jako problém není, spíš mě zajímá, proč některé zápisy u vás fungují? Jako např.:

<a n:href="Homepage:default 12">test</a>

nechápu to…
ještě to někomu krom mě nefunguje? Stačí to akorát hodit do @layout.latte v sandboxu

ldown
Člen | 29
+
0
-

V sandboxu nemá funkce Homepage::renderDefault žádný parametr, proto se mu to asi nelíbí

Když tam dáš to id ⇒ 12 , tak to asi projde, protože předpokládá, že si to vytáhneš přest getParam(‚id‘)

P.S. jen tipuji :)

Editoval ldown (28. 6. 2011 13:46)

22
Člen | 1478
+
0
-

aha, jsem si nevšiml, že máš parametr v render metodě:

public function renderCategory($categoryId)
...

to pak jo..

Jan Tvrdík
Nette guru | 2595
+
0
-

ldown wrote:

Mě to právě v pořádku nepřijde, ale to je asi věc názoru.

Kdybych chápal, jak funguje Latte, chápal bys, proč to nefunguje. To tvoje by totiž znamenalo $presenter->link($link), což je blbost. To moje znamená $presenter->link($destination, array(12)).

ldown
Člen | 29
+
0
-

Právě že považuji Nette za inteligentní, a když mu předám řetězec, který obsahuje mezeru za názvem Presenteru (nebo čárku), tak zbytek považuje jako argument fuknce.

Ale když to tak není, nevadí, jen je potřeba s tím počítat. Třeba to bude ve verzi 2.2. :)

P.S.: příspěvek byl psán pod vlivem vína

Aurielle
Člen | 1281
+
0
-

Můžeš si přetížit link() a popsané chování doprogramovat…

ldown
Člen | 29
+
0
-

To je pravda, ale snadnější cesta je přidat do mého pole další prvek:

$this->path[] = array(
                             'link' => "Main:category",
                             'param' => $id,
                             'text' => $text,
                     );
<a n:href="$bread['link'],$bread['param']">{$bread['text']}</a>
bojovyletoun
Člen | 667
+
0
-

Makro link má jednu vlastnost: Nijak jím nelze dostat link('Dest', array(POLE). Je sice možné zapsat {link Dest: , a=>b,c=>d}, ale mám li parametry někde v poli předem mám smůlu, prostě {link Dest: $POLE} nejde.
Protože UIMacros::Macrolink ...'->link(%node.word, %node.array?))' %node.array vždy vyrobí pole, takže vznikne link('Dest', array(array(POLE)).

  1. Buď by bylo možné přidat podobnou kontrolu jako je v PrsenterComponent::link do makra (přes nějaké $args=fetchWord(); $linkParams=is_array($args)?$args:fetchAll()+$args). Trochu lépe využít tokenizer a použít scan(advance =false)
  2. BC change: změna na %node.args, pak by bylo ale nutné všechny parametry uzavírat do pole
  3. nepožívat makro a psát href={$presenter->link(dst,$POLE)}
David Grudl
Nette Core | 8218
+
0
-

Mělo by fungovat {link Dest: (expand) $array}

bojovyletoun
Člen | 667
+
0
-

Tojeono. Akorát je to tedy dost tajné.

22
Člen | 1478
+
0
-

některé věci v nové dokumentaci prostě chybí :-) taky jsem to našel náhodou..

David Grudl
Nette Core | 8218
+
0
-

A proč to tam teda nepřidáte?

22
Člen | 1478
+
0
-

nevěděl jsem, že už můžeme :-)
Někde jsem zahlídl, že úpravy zatím ne, že je to ve vývoji ještě, ale oficiální povolení k hrabání do doc jsem nějak minul asi..