Injectnutí služby do formulářového prvku
- MikeLacroix
- Člen | 60
Ahojte,
vytvářím trochu složitější vlastní formulářový prvek a potřeboval bych v něm použít model. Jak do něj mohu dostat nějaký repozitář? Prvek mám udělaný přes:
class PeopleSelect extends \Nette\Forms\Controls\BaseControl {...}
Nebo to mám udělat nějak úplně jinak?
- Mistrfilda
- Člen | 76
Ahoj,
nikdy jsem prvek s modelem nepotřeboval/nedělal, takže v tomhle pomoct nemůžu. Já takovéto věci většinou řeším přes vlastní třídu (service), která mi tyto složitější prvky dokáže vytvořit. Tuto „továrnu“ si poté předávám do jednolivých formulářů, kde ji pořebuji.
Jednoduchý příklad:
<?php
class BirthdayContainerFactory
{
private $datetimeFactory;
public function __construct(DatetimeFactory $datetimeFactory)
{
$this->datetimeFactory = $datetimeFactory;
}
public function createBirthdayContainer(int $minAge, int $maxAge): Container
{
$container = $this->containerFactory->create();
$container->addSelect('day', 'Den', $this->datimeFactory->getMonthsOptions())
->setRequired()
->setPrompt('Den');
$container->addSelect('year', 'Rok', $this->datetimeFactory->getMonthsBetween($minAge, $maxAge))
->setRequired()
->setPrompt('Rok');
$container->addSelect('month', 'Měsíc', $this->datimeFactory->getMonthsOptions())
->setRequired()
->setPrompt('Měsíc');
return $container;
}
}
?>
a pak ve formuláři
<?php
class CustomForm
{
private $birthdayContainerFactory;
public function __construct(BirthdayContainerFactory $birthdayContainerFactory)
{
$this->birthdayContainerFactory = $birthdayContainerFactory;
}
protected function createForm(): Form
{
....
$form['birthday'] = $this->birthdayContainerFactory->createBirthdayContainer(1, 30);
}
}
?>
Editoval Mistrfilda (27. 6. 2019 12:49)