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
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
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
}
?>