Latte makro {link !} generuje link s &

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

Zdravím,

v šabloně mám tento kód:

{define #jsCallback}
	$('#{$control["newRuleForm"]['rule'][$id][$input]->htmlId}').on('change', function(){
		$.nette.ajax({
			type: 'GET',
			url: '{link {$link}! |noescape}',
			data: {
				'value': $(this).val(),
			}
		});
	});
{/define}

Ten vygeneruje link: /_mailing_nette/www/rule/new?siteId=22&amp%3Bdo=tableChange&value=ps_attribute_group

To je ale špatně, protože v odkazu nemá být &amp%3B, ale má tam být &. Kvůli tomu se celý GET neprovede.

Pokud však použiju signál na odkaz bez GETu siteId=22, který je tam už z předešla, odkaz se naparsuje správně.

Nevíte někdo, jak to spravit?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nechápu tuto sekvenci: {link {$link}! |noescape} Co to značí? Používat takto vnořeně složené závorky mi přijde jako nesmysl a divím se, že to nevyhazuje chybu.

kastanekdavid
Člen | 39
+
0
-

vojtech.dobes napsal(a):

Nechápu tuto sekvenci: {link {$link}! |noescape} Co to značí? Používat takto vnořeně složené závorky mi přijde jako nesmysl a divím se, že to nevyhazuje chybu.

Díky za reakci :)

Raději sem kód hodím celý:

{block content}
    <h1 n:block=title>New Rule</h1>

	{snippet rulesForm}
		{form newRuleForm}
			{$form}
			<script type="text/javascript">
				{foreach $form['rule']->containers as $i => $rule}
					{include #jsCallback, id => $i, input => $rule['table']->name, link => tableChange}
					{include #jsCallback, id => $i, input => $rule['column']->name, link => tableChange}
				{/foreach}
			</script>
		{/form}
	{/snippet}

{/block}

{define #jsCallback}
	$('#{$control["newRuleForm"]['rule'][$id][$input]->htmlId}').on('change', function(){
		$.nette.ajax({
			type: 'GET',
			url: '{link {$link}!}',
			data: {
				'value': $(this).val(),
			}
		});
	});
{/define}

Link je proměnná, která se naplní názvem daného selektu, pokud se selekt změní. Mohl bys teda, prosím, navrhnout nějaké zkrocení toho zápisu? :)

kastanekdavid
Člen | 39
+
0
-

vojtech.dobes napsal(a):

Nechápu tuto sekvenci: {link {$link}! |noescape} Co to značí? Používat takto vnořeně složené závorky mi přijde jako nesmysl a divím se, že to nevyhazuje chybu.

Ok, zjistil jsem, že to funguje, když nahradím tohle:

url: '{link {$link}!}',

tímhle:

url: '{link "$link!"}',

Pořád to ale neřeší můj problém, a to že je ve vygenerovaném odkazu &amp ; místo samotného & :-/

Nevíte někdo?

David Zadražil
Člen | 62
+
0
-

Tu proměnnou tam můžeš dávat bez složený závorek, tedy –

{link $link!}

Edit: Byl jsi rychlejší :-)

Editoval David Zadražil (19. 12. 2013 16:17)

kastanekdavid
Člen | 39
+
0
-

David Zadražil napsal(a):

Tu proměnnou tam můžeš dávat bez složený závorek, tedy –

{link $link!}

Edit: Byl jsi rychlejší :-)

Pokud toto udělám, zařve laděnka:

syntax error, unexpected ‚!‘

kastanekdavid
Člen | 39
+
0
-

Problém je ale pořád v tom, že se mi do odkazu generuje html special char (ampersand) a link kvůli tomu nefunguje. Nedá se to v rámci toho makra {link} nějak potlačit?

Editoval kastanekdavid (19. 12. 2013 16:39)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Zkus {link $link."!"}. Co ale vlastně obsahuje to $link?

kastanekdavid
Člen | 39
+
0
-

vojtech.dobes napsal(a):

Zkus {link $link."!"}. Co ale vlastně obsahuje to $link?

Link obsahuje název signálu, v tomto případě (string) tableChange, který potom v presenteru zpracuju pomocí metody handleTableChange.

Zkusil jsem tvoje řešení, překladač to požeře, ale problém s amp ; stále přetrvává :-/

Editoval kastanekdavid (19. 12. 2013 16:42)

kastanekdavid
Člen | 39
+
0
-

Tak jsem to vyřešil takhle a je to! … Škoda, že jsme se nedobrali k tomu, proč to takhle blbe :/

{define #jsCallback}
	$('#{$control["newRuleForm"]['rule'][$id][$input]->htmlId}').on('change', function(){
		link = '{link $link."!"}';
		link = link.replace("&amp;","&");
		alert(link);
		$.nette.ajax({
			type: 'GET',
			url: link,
			data: {
				'value': $(this).val()
			}
		});
	});
{/define}
Aurielle
Člen | 1281
+
0
-

A nebude náhodou jádro problému v tom, že díky tvé definici bloků nepozná Nette správně kontext a proto escapuje nesprávně? Protože už jen generování odkazu do apostrofů, což by se dělat nemělo, mi smrdí.

Mesiah
Člen | 240
+
0
-

Chápu-li správně Aurielle, URL vygeneruj do proměnné a tu jen vypiš do var link = {$link}.

vvoody
Člen | 910
+
0
-

Ten link si vygeneruj popredu v presenteri a ideálnejšie by bolo ho predať cez nejaký data atribút.

Aurielle
Člen | 1281
+
0
-

@Mesiah: Pokud by Nette správně poznalo kontext (zrovna tenhle případ nemám odzkoušený, ale tipuju, že ho nepozná díky chybějícím <script> tagům), tak by stačilo přímo i var link = {link whatever}. A jak píše @vvoody, data atribut je taky dobré řešení.

IlCommendatore
Člen | 8
+
0
-

Zrovna dneska jsem se setkal s identickým problémem a bohužel popsané řešení @Aurielle: (1) neprojde, jak tedy řešit?
Viz příklad:

{var $link = mySignal}

{define #frk1}
    '{link $link."!"}'
{/define}
{define #frk2}
<script>
    var c = '{link $link."!"}'
</script>
{/define}

<a href="{link $link."!"}">Link</a>
<!-- správně: '/my-app/presenter/action?task=persistentParameter&do=mySignal' -->

<script>
    var a = '{link $link."!"}'
	// takhle ne: '"\/my-app\/presenter\/action?task=persistentParameter&do=mySignal"'
    var b = {include #frk1, link => $link}
	// skoro, až na ten amp: '/my-app/presenter/action?task=persistentParameter&amp;do=mySignal'
    var correct = b.replace('&amp;', '&');
</script>
{include #frk2, link => $link}
<!-- var c == var a, taky špatně -->

Nejradši bych to dělal bez toho .replace()

Editoval IlCommendatore (12. 8. 2014 16:17)

David Grudl
Nette Core | 8147
+
+1
-
<script>
{define #frk1}
    {link $link."!"}
{/define}
    var a = {link $link."!"};
    var b = {include #frk1, link => $link};
</script>