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.