BaseComponent – renderování Error template – jak na to?

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

Ahoj, potřeboval bych poradit jak udělat následující tak, aby to bylo správně. Jedná se spíše problém s OOP.
Mám takovou sadu specifických komponent a potřeboval bych vždy, když se bude komponenta vykreslovat, aby si nejdříve zkontrolovala konzistenci/úplnost svých vstupních dat a poté se buď vykreslila, nebo v případě chyb vypsala proč se nevyrenderovala korekntě.

No nebudu tady popisovat moje myšlenkové pochody (které určitě nejsou správně zajeté), ale vyhodím sem rovnou to, co mi z hlavy vylezlo.

Toto je předek:

namespace App\Model\RecordComponents;

abstract class RecordComponent extends \Nette\Application\UI\Control{

      /** @return array of errors*/
      abstract function getErrors();


      public function render(){
            if($this->getErrors()) $this->renderErrors();
      }


      public function renderErrors(){
            $this->template->setFile(__DIR__.'/errors.latte');
            $this->template->errors = $this->getErrors();
            $this->template->render();
      }
}

V potomkovi volám

public function render(){
            parent::render(); //Toto bych pak měl uvádět v každém potomkovi, aby došlo na kontrolu

            $this->template->setFile(__DIR__.'/header.latte');
            $this->template->authority = $this->authority;
            $this->template->organization = $this->organization;

            $this->template->render();
      }

Jenže komponenta vyrenderuje v případě chyb i header.latte :) Ale to nechci. V případě presenteru bych to udělal setView(), tady nevím. A navíc si myslím, že to vůbec asi není celé dobře. Jak byste toto řešili vy?

Editoval thm (12. 10. 2015 10:35)

David Matějka
Moderator | 6445
+
+2
-

treba:

abstract class RecordComponent extends \Nette\Application\UI\Control
{

	public function render()
	{
		if($this->getErrors()) {
			$this->renderErrors();
		} else {
			$this->doRender();
		}
	}

	abstract protected function doRender();
}

a v potomkovi tu metodu pojmenuj doRender

thm
Člen | 147
+
0
-

Jasný! Díky moc. Že mě něco takového nenapadne :-/