linky – syntax nette:xxx

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

Ahoj,

pri pouziti

<a href='nette:Test:boo?id=10'>nette:Test:boo?id=10</a>

v template dostavam vystup:

<a href="/?id=10&amp;action=boo&amp;presenter=Test%27">nette:Test:boo?id=10</a>

teda vcetne toho apostrofu nakonci (%27).

Bug, moje chyba nebo feature ? (dvojite uvozovky jsou v pohode)

/**
	public static function netteLinks($s)
	{
		return preg_replace_callback(
			'#(src|href|action|on[a-z]+)\s*=\s*["\'](nette:.*?)([\#"\'])#',
			array(__CLASS__, 'tnlCb'),
			$s)
		;
	}

	private static function tnlCb($m)
	{
		list(, $attr, $uri, $fragment) = $m;
		$parts = parse_url($uri);
		if (isset($parts['scheme']) && $parts['scheme'] === 'nette') {
			return $attr . '="<?php echo $template->escape($control->'
				. (strncmp($attr, 'on', 2) ? 'link' : 'ajaxLink')
				. '(\''
				. (isset($parts['path']) ? $parts['path'] : 'this!')
				. (isset($parts['query']) ? '?' . $parts['query'] : '')
				. '\'))?>'
				. $fragment;
		} else {
			return $m[0];
		}
	}

Editoval vlna (18. 5. 2009 18:53)

vlki
Člen | 218
+
0
-

Podívej se do tempu, co ti z toho netteLinks filtr vygeneruje.
Pokud takovou možnost nemáš, tak aspoň zachyť, co ti callback tnlCb vrátí.

private static function tnlCb($m)
{
    ...
    $retval = $attr . '="<?php echo $template->escape($control->'
        . (strncmp($attr, 'on', 2) ? 'link' : 'ajaxLink')
        . '(\''
        . (isset($parts['path']) ? $parts['path'] : 'this!')
        . (isset($parts['query']) ? '?' . $parts['query'] : '')
        . '\'))?>'
       . $fragment;
    Debug::fireLog($retval);
    return $retval;
    ...
}

A z toho by snad mělo jít poznat, o co jde… Hodně štěstí:)

vlna
Člen | 34
+
0
-

Jeste jsem se na to dival a zda se mi, ze tam skutecne muze bejt chybka:

	private static function tnlCb($m)
	{
		list(, $attr, $uri, $fragment) = $m;
		$parts = parse_url($uri);
		if (isset($parts['scheme']) && $parts['scheme'] === 'nette') {
                      return $attr . '="<?php echo $template->escape($control->' //puvodni
//                    return $attr . '='.$fragment.'<?php echo $template->escape($control->' //takle?

Neni to ono ?

Editoval vlna (18. 5. 2009 19:10)

David Grudl
Nette Core | 8228
+
0
-

fixed

kravčo
Člen | 721
+
0
-

Tento tvoj fix dosť zblbne v prípade, ak máš v linke fragment.

Podľa toho, na čo som prišiel je problém v tom, že pri nahradzovaní sa prvá úvodzovka nastaví natvrdo na dvojitú, pričom druhá je ponechaná pôvodná (ak je dvojitá – pohodka, ak jednoitá – máme problém).

Najrozumnejší fix asi bude zapamätať si i prvú úvodzovku a nechať ju rovnakú aká bola (totiž, ak linka obsahuje fragment, k druhej úvodzovke ani nemáme prístup)

vlki
Člen | 218
+
0
-

Řešení je víc… Třeba zvážit v reguláru i samotný fragment. Nahrazení za dvojtou uvozovku už je pak jen estetika.

Myslím si, že David určitě vybral tu nejefektivnější úpravu;)

vlna
Člen | 34
+
0
-

Ahoj, o te dire v # jsem vedel, myslel jsem to jako ukazani mista s chybou, ne jako reseni.
Nerozumim uplne presne, jak se ma zachazet s fragmentem v pripade ‚#‘, taky verim, ze David vymyslel to spravny orechovy :-)
Apropos Diky za bleskovy fix Davide :-)

vlna
Člen | 34
+
0
-

Kazdopadne priste si s tim dam vic prace, spechal jsem.

crempa
Člen | 198
+
0
-

Ahoj, pridam to sem at nedelam nove tema

jak prosim docilim vypnuti kontextoveho escapovani pri vkladani linku do javascriptu, napr.

window.open({plink :Presenter:default},"popup","width=400,height=600");

vygeneruje neco jako

window.open("\/project\/htdocs\/presenter\/default","popup","width=400,height=600");

vykricnik nepomaha a v dokumentaci sem nic nenasel (nebo se v ni po te restrukturalizaci proste nevyznam)

Diky

Jan Tvrdík
Nette guru | 2595
+
0
-

A v čem je problém? Mělo by to fungovat, ne?

crempa
Člen | 198
+
0
-

jaj spatnej priklad, pro zjednoduseni jsem to napsal zrovna tak ze to jde :-)

pouzivam to v jinem kontextu s jednim pluginem pro jQuery ktery to nejak nemuze zkousnout, slo me o to vypsat tu cestu v ramci JS i bez zpetnych lomitek… asi ale spis upravim ten plugin

David Grudl
Nette Core | 8228
+
0
-

Ale v JS to musíš vypsat se zpětnými lomítky.