Jak je to s novými moduly?
- jtousek
- Člen | 951
Ahoj,
chci se zeptat, v jakém stavu jsou nyní nové moduly, mám dojem, že se o nich za poslední dva měsíce úplně přestalo mluvit. David v jednom vláknu i psal tohle:
Moduly včetně Application budou implementovat IModule. Ještě nevím, jestli to pojmu i jako komponenty. Moduly si budou také určovat vlastní ErrorPresenter.
Od té doby jsem ale nikde nenašel žádné zmínky, nové moduly se tedy chystají až do Nette 2.0 stable a budou implementovány až po napsání dokumentace?
Jak se moduly mají používat nyní? Napadlo mě třeba, že každý modul by mohl potřebovat nějakou vlastní konfiguraci, tedy config.ini. Je tahle myšlenka dobrá nebo naopak nesmyslná? Používáte to někdo? Kde a jak takové configy loadovat?
- Aurielle
- Člen | 1281
Používám vylepšenou standartní implementaci, a o to tak, že si načítané moduly určuji v databázi (případně pomocí enabled/disabled) a ty pak v onStartup od Application navěšuji na funkcionalitu. Moduly mají vlastní loader, který nastavuje potřebné věci (asi obdoba toho config.ini). Díky hooku v globálním ErrorPresenteru se mi povedlo udělat i ErrorPresenter pro moduly.
// Globální ErrorPresenter
public function actionDefault($exception)
{
$e = $exception;
// AJAX request? Just note this error in payload.
if($this->isAjax())
{
$this->payload->error = TRUE;
$this->terminate();
}
$this->template->lang = \PHPin\Tools::getTranslator()->lang;
// Call hooks
\PHPin\Tools::getHooker()->onErrorPresenter($this, $e);
// Dál normální zpracování výjimky
}
// loader (bootstrap) modulu:
// kontanta NAME obsahuje název modulu, př. BaseAdmin
/**
* Hook-em-up!
* Setup hook for per-module errorPresenter
*/
public static function setupHooks()
{
$name = static::NAME;
$errorPresenter = static::ERROR_PRESENTER;
if($errorPresenter)
{
\PHPin\Tools::getHooker()->onErrorPresenter[] = function($presenter, $e) use($name, $errorPresenter) {
$requests = $presenter->application->requests;
$lastRequest = $requests[sizeof($requests) - 2];
$lastPresenter = $lastRequest->getPresenterName();
$lastPresenter = explode(':', $lastPresenter);
unset($lastPresenter[sizeof($lastPresenter) - 1]);
$lastPresenter = implode('\\', $lastPresenter);
if($lastPresenter === $name)
{
$presenter->forward(':' . $name . ':' . $errorPresenter . ':', array('exception' => $e));
return;
}
};
}
}
Hooker je jen třída sdružující všechny události, časem nejspíš přidám i podporu pro přidávání událostí za běhu.