Nefunkční filtr relativeLinks

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

Dobrý večer.

Češi prohrávají 1:2 a já řeším zapeklitý problém. V BasePresenteru nastavuji známým způsobem filtry šablon:

	public function templatePrepareFilters($template)
	{
		parent::templatePrepareFilters($template);

		$this->template->registerFilter('TemplateFilters::netteLinks');
		$this->template->registerFilter('TemplateFilters::relativeLinks');
	}

Dále mám ArticlePresenter coby potomka BasePresenteru a v něm v metodě renderDefault() předávám šabloně mj. text článku. Ten v šabloně klasicky vykresluji:

{!$article->text}

Text článku obsahuje HTML kód, čili jej vykresluji neescapovaně. V jednom konkrétním článku je také obrázek s atributem src="...", a sice s neabsolutně zadanou cestou. Očekával bych převedení na absolutní cestu díky filtru relativeLinks. Nicméně se tak neděje.

Napadá mě vysvětlení, že se filtr aplikuje pouze na „hrubý“ kód šablony a ne na obsah proměnných v ní (v tomto případě na proměnnou $article->text).

Dokonce když zkusím v ArticlePresenteru vydumpovat následující (regulár je převzat přímo z kódu metody relativeLinks()),

public function renderDefault($id)
{
	...
	preg_match_all('#(src|href|action)\s*=\s*(["\'])(?![a-z]+:|[\x01/\\#])#', $article->text, $matches);
	dump($matches);
	...
}

vypíše se podle očekávání pole se src atributem.

Mohl by mi prosím někdo poradit? Předem moc děkuji.


Nette 0.9.3-dev, 42e9ad2 released on 2010–01–23
PHP 5.2

Mikulas Dite
Člen | 756
+
0
-

Jo kdyby jenom 1:2… Filtry se aplikují jenom na tu templatu, ta proměnná je tam sice taky, ale ta se tam vloží až poté. Není lepší dát do toho textu ručně $basePath, který by měl presenter mít?

//EDIT: jestli je to vnitřní odkaz, je v Nette skoro povinnost použít $presenter->link, resp {plink}, jinak pokuď je ta adresa mimo, tak je absolutní rovnou.

Editoval Mikulas Dite (21. 2. 2010 23:08)

uestla
Backer | 799
+
0
-

Není lepší dát do toho textu ručně $basePath, který by měl presenter mít?

Ten text článku se tahá z databáze, kam se bohužel adresy ukládají relativně.

//EDIT: jestli je to vnitřní odkaz, je v Nette skoro povinnost použít $presenter->link, resp {plink}, jinak pokuď je ta adresa mimo, tak je absolutní rovnou.

Není to odkaz, nýbrž adresa obrázku.


EDIT:

Řešení (poněkud krkolomné), jsem objevil:

BasePresenter:

protected function beforeRender()
{
	...
	$this->template->registerHelper('relativeLinks', 'LayoutHelpers::relativeLinks');
	...
}

Vlastní třída LayoutHelpers:

abstract class LayoutHelpers extends Object
{
	public static function relativeLinks($s)
	{
		return preg_replace(
			'#(src|href|action)\s*=\s*(["\'])(?![a-z]+:|[\x01/\\#])#',
			'$1=$2' . Environment::getVariable('baseUri'),
			$s
		);
	}
}

A konečně šablona:

{!$article->text|relativeLinks}

Editoval uestla (22. 2. 2010 0:36)