Zjištění existence presenteru a view

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

Ahoj,

jsem v nette začátečník a potřebuji vyřešit následující.

Mám klasický link, který se odkazuje na nějaký presenter a view. Když kliknu na odkaz, tak chci např. ve startupu kontrolovat zda presenter nebo view existuje. Jde to nějak ošéfovat?

Děkuji za odpověď.

redhead
Člen | 1313
+
0
-

možná ještě uveď k čemu to přesně potřebuješ, protože se to může řešit více způsoby.

Kevas
Člen | 12
+
0
-

Jde mě o to, že když uživatel změní ručně v url název view nebo presenter, tak to vyhodí, že template neexistuje. To se standartně vyřeší error presenterem.

Jelikož Nette integruji do jednoho CMS, tak nemůžu error presenter využívat nebo využívat kompletní funkčnosti Nette např routování a pod. – to za mě dělá už CMS. Nette mě pouze generuje obsah.

Panda
Člen | 569
+
0
-

Co blok try-catch kolem vytváření instance presenteru a volání metody run() a případné výjimky tak odchytit?

Jinak se s takovým „problémem“ bude radit opravdu hodně těžce, protože Nette roubuješ na něco jiného a nikdo kromě Tebe neví, jakým způsobem to tam roubuješ…

Jedno z řešení by mohlo vypadat takto:

<?php
// Tento kód vytváří instanci presenteru, takže pravděpodobně přjde tam,
// kde si ten presenter vytváříš.
try {
	$presenterLoader = new PresenterLoader();
	// Nebo pokud máš k dispozici Environment:
	// $presenterLoader = Environment::getService('Nette\Application\IPresenterLoader');

	// Pokud se presenter nepodaří načíst, vyhodí metoda InvalidPresenterException
	$class = $presenterLoader->getPresenterClass($presenter);

	$presenter = new $class;

	// Získáme seznam možných šablon
	$templates = $this->formatTemplateFiles($this->getName(), $view);

	// A ověříme, že alespoň jedna existuje
	$found = FALSE;
	foreach ($templates as $template) {
		if (file_exists($template)) {
			$found = TRUE;
			break;
		}
	}

	if (!$found)
		throw new InvalidPresenterException('Invalid view - template file does not exist.');

	$presenter->run();
} catch (InvalidPresenterException $e) {
	// ... neexistující presenter nebo view
}
?>
Kevas
Člen | 12
+
0
-

Děkuji moc takové nakupnutí jsem potřebovat. Poradil si mě velice dobře. Díky moc.

Jinak takovou rychlou reakci a ještě s napsaním kusu kódu jsem nečekal. Myslím, že přestanu integrovat Nette a rovnou na něho přejdu v plné síle.