createComponent pro komponenty z pole
- Jiří Nápravník
- Člen | 710
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…
- vitkutny
- Člen | 73
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
@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
tak multiplier nedela nic jineho, nez ze prepisuje createComponent :) https://api.nette.org/…ier.php.html#…
- Jiří Nápravník
- Člen | 710
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)