Oznámení
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í :-)