Ověření existence komponenty při překlepu v šabloně

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

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

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

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

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

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)

Michal Vyšinský
Člen | 608
+
0
-

Přepsal jsem předchozí příspěvek.

Filip Procházka
Moderator | 4668
+
0
-

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.