Nefunkční filtr relativeLinks
- uestla
- Backer | 799
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
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
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)