createComponent pro komponenty z pole

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

Mám seznam možných komponent použitelných v článku a potřebuji v presenteru udělat na tyto komponenty továrničky, jak na to? Nevím, kolik jich tam bude, takže bych potřeboval nějaký foreach a připravit všechny createComponent, aby na ně bylo viděno ze šablon. Je to nějak řešitelné? Zkusil jsem si ve startup() projít foreachem a udělat si ->addComponent – ale to je problém, nejsou ty komponenty lazy a nemám tam ještě parametry z action…

akadlec
Člen | 1326
+
+3
-

a přetížit si metodu createComponent v tom daném presenteru?

vitkutny
Člen | 73
+
0
-

použij https://api.nette.org/…tiplier.html, jednoduchý příklad pro komponenty bez závislostí

$components = [
	‘a’ => My\Component\A::class,
	‘b’ => My\Component\B::class,
	‘c’ => My\Component\C::class
];
public function renderArticle(){
	$this->template->components = $this->components;
}
protected function createComponentComponents(){
	return new UI\Multiplier(function($key){
		if(isset($this->components[$key])){
			return new $this->components[$key];
		}
		throw new XXXException;
	});
}
{foreach array_keys($components) as $component}
	{control components-$component}
{/foreach}
Jiří Nápravník
Člen | 710
+
0
-

@vitkutny Díky, tohle vypadá super, přepisování createComponent jsem se chtěl raději vyhnouta tohle vypadá dobře.

David Matějka
Moderator | 6445
+
0
-

tak multiplier nedela nic jineho, nez ze prepisuje createComponent :) https://api.nette.org/…ier.php.html#…

akadlec
Člen | 1326
+
+2
-

No osobně bych pro ten daný presenter přepsal createComponent, přijde mi to čistší než tam cpát multiplier

Jiří Nápravník
Člen | 710
+
0
-

Ok, tak jsem to prepsal tedy na createComponent:-) Bylo by fajn se zbavit DI\Containeru, ale to me nenapda jak

protected function createComponent($name)
	{
		$component = parent::createComponent($name);
		if (!($component instanceof \Nette\ComponentModel\IComponent)) {
			$articleComponent = $this->articleComponents->findArticleComponentByTemplateName($name);
			$component = $this->getContext()->getByType($articleComponent->getType())->create($this->article);
		}
		return $component;
	}

Editoval Jiří Nápravník (6. 1. 2016 15:53)