Ověření existence komponenty při překlepu v šabloně
- eudard
- Člen | 15
Zdravím všechny,
řeším problém, jak jednoduše zajistit ošetření překlepu kodéra v šabloně, když zadá jméno neexistující komponenty.
Kodér napíše chybně
{control "textBlok-default"}
správně má být
{control "textBlock-default"}
Celá šablona se zhroutí do vyjímky… já ale potřebuji vyjímku zachytit a napsat něco jako „komponenta [textBlok] neexistuje“ a vyrenderovat to do místa v šabloně, kde byla vložena.
Mužete mě prosím navést jak na to ?
Ještě doplňuji, že řešení by mělo zachovat použití makra control a vyjímku odchytávat v prezenteru, nikoli v šabloně. Kodér nebude obalovat makra pomocí try / catch.
Editoval eudard (23. 5. 2013 11:10)
- Michal Vyšinský
- Člen | 608
Ahoj. Nechápu smysl tohoto počínání. Když upravím šablonu tak hned refreshnu stránku a vidím, zda se něco nepokazilo. A vyhozená výjimka mě ihned řekne, že komponenta neexistuje. Ale jestli to vážně chceš tak dělat, tak by se dala přepsat v presenteru metoda createComponent.
- eudard
- Člen | 15
Jak píšu.. jedná se o to, že já jsem programátor a vím kde je chyba, nicméně kodér který pracuje pouze s šablonama a má tam nasázených desítky komponent, tak pak musí hledat kde udělal chybu, případně mě potřebuje k tomu, aby tu chybu lokalizoval.
vytvořil jsem komponentu „errorBlock“, která renderuje <div>Tato komponenta neexistuje</div> a do šablony jsem dal..
{control "nesmysl-x"}
v presenteru jsem přepsal metodu takto..
public function createComponent($name) {
$fn = "createComponent".ucfirst($name);
if (!method_exists($this, $fn)) {
$name = "errorBlock";
}
return parent::createComponent($name);
}
nicméně Nette stejně vyhodí chybu Component with name
‚nesmysl‘ does not exist
Přitom když to debuguju, tak se blok s if provede.
- Michal Vyšinský
- Člen | 608
Tak jsem to celé přepsal, toto by mohlo být funkční:
public function createComponent($name) {
$component = parent::createComponent($name);
if(!($component instanceof IComponent)) {
return new ErrorBlock($this, $name);
}
return $component;
}
Editoval CherryBoss (23. 5. 2013 14:45)
- eudard
- Člen | 15
Díky, to je plně funkční řešení!
Finální kód..
public function createComponent($name) {
$component = parent::createComponent($name);
if(!($component instanceof Nette\ComponentModel\IComponent)) {
return new ErrorBlock($this, $name);
}
return $component;
}
Paradoxně jsem tam nechal jen IComponent a nejelo to. Házelo to chybu, že komponenta už existuje. Jakmile jsem dal celou cestu k IComponent, rozjelo se to tak jak má.
Jen doplním, že do šablony ErrorBlock komponenty jsem dal něco takového..
Komponenta <strong>{$control->parent->name}/{$control->name}</strong> neexistuje!
Editoval eudard (23. 5. 2013 15:46)
- Filip Procházka
- Moderator | 4668
Takhle je to lepší :)
class ErrorBlock extends Nette\Application\UI\PresenterComponent
{
public function render()
{
if ($this->presenter->context->parameters['debugMode']) {
$name = htmlspecialchars($this->lookupPath('Nette\Application\UI\Presenter'));
echo "<div class='error'>Komponenta $name neexistuje.</div>";
}
}
}
A ještě to má jednu mušku, na neexistujících signálech to taky umře.