Jak je to s novými moduly?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jtousek
Člen | 951
+
0
-

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
+
0
-

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.

Vyki
Člen | 388
+
0
-

Název metody ‚getHooker‘ mě vzhledem k anglickému významu slova hooker (děvka, šlapka) docela pobavil :D

Aurielle
Člen | 1281
+
0
-

Taky je to dle slovníku rybářský člun :D Nechám si to jako easter egg, ale díky, takhle jsem o názvu opravdu nepřemýšlel :D