Oznámení

Provoz fóra byl ukončen

Nový systém handlerů

před 12 lety

David Grudl
Nette Core | 6806

Od revize 155 jsem vytvořil zcela nový a mnohem dokonalejší systém handlerů. Původní řešení na bázi listeneru $texy->handler je odstraněno (přístup k této proměnné vygeneruje výjimku).

Nový systém dovoluje na každou událost mapovat handlery samostatně, pro jednu událost jich může být i více. Handler se nastaví voláním např:

$texy->addHandler('block', 'blockHandlerFirst');  // volá fci blockHandlerFirst()
$texy->addHandler('block', 'blockHandlerSecond'); // volá fci blockHandlerSecond()

$texy->addHandler('image', array('myClass', 'imageHandler')); // volá metodu myClass::imageHandler()
$texy->addHandler('image', array($myObj, 'imageHandler')); // volá metodu $myObj->imageHandler()

Jako první parametr je každému around-handleru předán parametr $invocation. Pomocí něj lze předat řízení dalšímu handleru:

function imageHandler($invocation, $image, $link)
{
    // pozměníme vstupní parametry
    $image->URL = 'newUrl';

    // předáme řízení předchozímu handleru v řadě
    $res = $invocation->proceed($image, $link);

    // pozměníme výsledek
    $res->attrs['alt'] = 'popisek';
    return $res;
}

Pokud nechceme vstup vůbec zpracovávat, uděláme to takto:

function imageHandler($invocation, $image, $link)
{
    if (...) return $invocation->proceed();
}

Všimněte si, že při volání $invocation->proceed() není potřeba předávat žádné parametry. Dřívější technika return Texy::PROCEED je nepodporovaná.

Tímto způsobem lze ovládat i tzv. skripty.

Tzv. after-handlerům (afterList, …) se parametr $invocation nepředává. Seznam parametrů všech handlerů najdete v příkladu „handler“ v distribuci.

Ještě poznámka: zatímco after-handlery jsou volány v takovém pořadí, v jakém byly zaregistrovány metodou $texy->addHandler(), tak around-handlery jsou volány v pořadí opačném. Tedy nejprve je volán posledně zaregistrovaný handler, a postupně skrze $invocation->proceed(...) se dostáváme k dříve registrovaným handlerům a nakonec k výchozímu handleru Texy.

před 12 lety

Havran
Člen | 20

Jednoducho parada. Vdaka!

před 12 lety

Milanov
Člen | 50

Zdravím. Při pokusu v handler-funkci v objektu použít kontext $this mi PHP 4 vrátí fatal error. Mám něco špatně, nebo se to takto nedá použít? Děkuji. Příklad:

include 'texy.compact.php'; // revize 165

class myClass {
    var $cesta = '../';

    function phraseHandler($invocation, $phrase, $content, $modifier, $link) {

        // modifiy link
        if ($link) $link->URL = $this->cesta . $link->URL;

        return $invocation->proceed();
    }
}

$texy = new Texy();
$myClass = new myClass();

$texy->addHandler('phrase', array('myClass', 'phraseHandler'));

echo $texy->process( '"moje kniha":moje_kniha.html' );

Editoval Milanov (27. 8. 2007 8:57)

před 12 lety

Acci
Člen | 83

Milanov:
Tento řádek

$texy->addHandler('phrase', array('myClass', 'phraseHandler'));

zaměň za

$texy->addHandler('phrase', array($myClass, 'phraseHandler'));

před 12 lety

Milanov
Člen | 50

Děkuji, sexy řešení :-)