Oznámení

Provoz fóra byl ukončen

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

  1. constructed from TexyHtml elements (NHtml analogy)
  2. string (it will be processed by Texy (escaping, typographical corrections, etc)
  3. „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);