Injektování do modelu formuláře
- kleinpetr
- Člen | 480
Ahoj, asi se zeptám blbě, ale je nějaká možnost injektovat mimo presenter například do formuláře ?
mám např. třídu
class MyForm extends UI\Form
{
//a tohle bych potřeboval zprovoznit
/**
* @var Model\DbTable\Articles
* @inject
*/
public $articles;
.
.
.
}
Jde mi o to, že potřebuju naplnit selecty nějakými daty, které tahám z db. Určitě je možnost si tydata předávat v konstruktoru již z presenteru nebo v setteru, ale já bych to chtěl mít pouze čistě v tom modelu. Abych nemusel pokaždé při vytváření toho formuláře ještě předávat ty data. Díky
- David Matějka
- Moderator | 6445
neded UI\Form, bud si na form vytvor tovarnu, nebo komponentu. Oba zpusoby jsou popsany na planette
- kleinpetr
- Člen | 480
aha..
mám totiž něco takového
class MyForm extends UI\Forms
{
//tohle potřebuji
/**
* @var Model\DbTable\Authors
* @inject
*/
public $authors;
.
.
.
public function getElement($type){
if($type == 'authors'){
return $this->addSelect('authors','Autoři',$this->authors->getAll());
} elseif(...){
}
.
.
.
}
}
class MyCustomForm extends MyForm
{
.
.
.
public function renderForm(){
$this->getElement('authors');
$this->getElement('dalsi');
$this->getElement('dalsi');
$this->getElement('dalsi');
}
}
Takhle dědím několik formů od MyForm, protože u všech používám třeba stejné elementy pouze jinak poskládané, atp. a teď hledám tedy způsob jak nejlépe vyřešit ty závislosti..
Editoval kleinpetr (31. 3. 2015 20:09)
- kleinpetr
- Člen | 480
Takže jsem to vyřešil takto:
Tohle je Model kterej se stará o takový to obecný nastavení elementů
class FormParser extends Nette\Object
{
protected $authors;
protected $articles;
protected $form;
public function __construct(Model\DbTable\Authors $authors, Model\DbTable\Articles $articles)
{
$this->authors = $authors;
$this->articles = $articles;
$this->form = new Nette\Application\UI\Form;
}
protected final function getElement($type,$form)
{
$values = [];
if ($type == 'authors') {
foreach ($this->authors->getAll() as $value) {
$values[$value->id] = $value->name;
}
$element = $form->addSelect('authors','Autoři', $values);
} elseif ($type == 'articles') {
foreach ($this->articles->getAll() as $value) {
$values[$value->id] = $value->title;
}
$element = $form->addSelect('articles', 'Články', $values);
}
.
.
.
return $element;
}
}
Nepředávám si jen připojení k db, protože v těchto modelech ještě řeším cachování atp, takže si je musím předávat postupně, dle použití.
Poté už jen napíši nějaký vlastní form
class MyCustomForm extends FormParser
{
public function render(){
$form = $this->form;
$element = $this->getElement($form,'authors');
$element->setOption(..);
$element = $this->getElement($form,'articles');
$element->setOption(..);
.
.
.
return $form;
}
}
Zaregistruju službu do configu a v presenteru si pak injectnu MyCustomForm a vytvořím z něho komponentu
/**
* @var Forms\MyCustomForm
* @inject
*/
public $myCustomForm;
protected function createComponentMyCustomForm()
{
$form = $this->myCustomForm;
return $form->render();
}
Kdyby měl někdo nějakou radu na vylepšení nebo cokoliv, tak budu jedině rád ;)
Editoval kleinpetr (1. 4. 2015 1:57)