Oznámení
Vkládání externích dat {{ getPrice(produkt) }}
před 14 lety
- David Grudl
- Nette Core | 6806
Nyní je možné do Texy! vkládat externí data, volat externí funkce. Příklad:
Poznámka: V Texy2 doporučuji použít novější postup
Syntaxe
Aktuální cena Vitamínu C je {{ getPrice(vitamin-c) }} Kč
Nebo alternativně cena Vitamínu C je {{ getPrice: vitamin-c }} Kč
Implementace
class myTemplateClass {
public function getPrice($parser, $argument1)
{
$cenik = array (
'vitamin-c' => 130,
'alveo' => 180,
);
$cena = $cenik[$argument1];
// vrátíme obyčejný řetězec:
return (string) $cena;
// nebo vrátíme nějakou HTML strukturu
$el = TexyHtml::el('strong');
$el->title = 'Cena včetně DPH';
$el->setText($cena);
return $el;
}
}
$myTemplate = new myTemplateClass();
$texy->scriptModule->handler = $myTemplate;
TexyHtml je obdoba NHtml
Sponzorem vývoje této funkce je společnost Internet Mall, a.s.
před 12 lety
- krwelll
- Člen | 1
Dá se jako výsledek vrátit složitější HTML konstrukce? Třeba tabulka … nebo třeba celá stránka?
před 12 lety
- Gringo
- Člen | 32
Ano, dá. Dá se to poskládat přes TexyHTML anebo takto: https://forum.texy.info/…iewtopic.php?…
před 12 lety
- David Grudl
- Nette Core | 6806
Nebo Texy2-like postup pomocí addHandler
(více zde)
$texy->addHandler('script', 'scriptHandler'); // druhý parametr je PHP pseudotyp callback
/**
* @param TexyHandlerInvocation handler invocation
* @param string command
* @param array arguments
* @param string arguments in raw format
* @return TexyHtml|string|FALSE
*/
function scriptHandler($invocation, $cmd, $args, $raw)
{
switch ($cmd) {
case 'nofollow':
$invocation->getTexy()->linkModule->forceNoFollow = $args[0]==='yes';
return '';
default: // neumime zpracovat, zavolame dalsi handler v rade
return $invocation->proceed();
}
}
Pak můžeme do textu vložit {{nofollow: yes}}
, čímž se
lokálně aktivuje doplňování rel=nofollow do odkazů, a zase je vypnout
přes {{nofollow: no}}
.
před 12 lety
- markus
- Člen | 11
hi.
i have tested your code 128-vkladani-externich-dat-getprice-produkt#p1954
but! – it's not exactly what i need
there's only you can help me with the problem
<?php
$texy->addHandler('script', 'scriptHandler');
function scriptHandler($invocation, $cmd, $args, $raw)
{
$macros = Array('macro1'=>'<table><tr><td>Some text</td><td>Some text2</td></tr>',
'macro2'=>'<b>The information on MACRO2</b>',);
switch ($cmd) {
case 'macro':
$el = TexyHtml::el('span');
$el->setText($macros[arg[0]]);
return $el;
default:
return $invocation->proceed();
}
}
?>
i need the following:
TEXY fragment:
{{macro: macro1}}
HTML output:
<table><tr><td>Some text</td><td>Some text2</td></tr>
but the code returns ESCAPED html output…
hellp, i need to finish the project this week, but see no API docs…
před 12 lety
- David Grudl
- Nette Core | 6806
Handler output must be
- constructed from TexyHtml elements (NHtml analogy)
- string (it will be processed by Texy (escaping, typographical corrections, etc)
- „protected“ string (via $texy->protect() method, will stay unchanged)
In your case use protected output:
$arg = $args[1]; // maybe...
$html = $macros[$arg];
return $invocation->texy->protect($html, Texy::CONTENT_BLOCK);
The second parameter is hint:
- Texy::CONTENT_MARKUP – string contains only HTML comments or inline elements (B, I, EM, …), which are „invisible“ (but no text!)
- Texy::CONTENT_REPLACED – in addition contains „visible“ inline elements (IMG, INPUT, OBJECT, BR too)
- Texy::CONTENT_TEXTUAL – in addition contains any text (spaces is text too)
- Texy::CONTENT_BLOCK – in addition contains some block HTML elements (DIV, P, TABLE, TD, …)
před 12 lety
- markus
- Člen | 11
Thanks, Dave! I'll try this code tonight. It's very nice of you. The more I try to learn Texy the more i see that's not so simple…
před 12 lety
- markus
- Člen | 11
Maybe this way:
return $invocation->getTexy()->protect($html, Texy::CONTENT_BLOCK);