Jak na inject modelu ve formuláři děděném z control
- argosovo
- Člen | 54
Ahoj,
mám tu ještě snad jeden krátký dotaz – kvůli možnosti šablony mám
speciální komponentu na vytvoření formuláře která je rozšiřením
\Nette\Application\UI\Control a do této komponenty potřebuji nalinkovat
třídy z modelu, jak na to nejlépe?
Co nejde:
1.Metody s inject* v této komponentě nefungují – nehodí chybu ale
neprovedou se – tohle by dle mě bylo nejlepší kdyby to fungovalo.
2.Nemůžu model připojit přes parametry __construct() ani při
createComponentHledani(), protože pokud jsem správně pochopil, těmto dvěma
metodám presenter už při vytváření dosadí jiné parametry jsou už
z presenteru volány (u contruct je dosazena instance presenteru a
u createComponent nějaké označení toho daného formuláře/komponenty)
3.našel jsem konstrukci, která si sahá přes presenter na daný model
nastavený v presenteru, ale to se mi též úplně nezdá
Samozřejmě asi bych mohl udělat v komponentě setter, kterým si do nějaké
vnitřní proměnné nastavím daný model, ale to se mi nezdá jako nejlepší
řešení, protože při každé inicializaci formuláře musím zavolat ještě
tento setter. Jak se tohle tedy nejlíp řeší? Děkuji
- David Matějka
- Moderator | 6445
Inject* metody se defaultne volaji pouze u presenteru, necha se to ale zapnout, pokud pouzivas tovarny na komponenty (viz doc). v neonu pak mas:
services:
fooComponentFactory:
implement: IFooComponentFactory
inject: true #tohle to zapne
V masteru je pak decorator extension, kterym ten inject muzes zapnout treba pro vsechny potomky base controlu
EDIT:
Ale ty inject metody pouzivej pouze v base controlu, v konkretnich
komponentach si zavislosti predavej pres konstruktor prave s vyuzitim tech
generovanych tovarnicek
Editoval matej21 (2. 1. 2015 14:01)
- argosovo
- Člen | 54
Asi z toho nejsem úplně moudrý – jsem přece jen pořád začátečník – takže jestli můžu – komponentu z presenteru volám takhle:
<?php
protected function createComponentHledaniMain($name)
{
$form = new \App\FrontModule\Forms\HledaniMain($this,$name);
return $form;
}
?>
komponenta vypadá takhle:
<?php
namespace App\FrontModule\forms;
use \Nette\Application\UI,
Nette\ComponentModel\IContainer,
Nette\Forms;
use Nette\Application\UI\form;
use Nette\Diagnostics\Debugger;
class HledaniMain extends \Nette\Application\UI\Control
{
private $select,$form;
private $inzeratyModel, $ciselnikyModel;
private $databaseOne = ['1', '2', '3'];
private $databaseTwo = [
['11', '12', '13'],
['22', '23', '24'],
['33', '34', '35'],
];
private $databaseThree = [
[
['111', '112', '113'],
['121', '122', '123'],
['131', '132', '133'],
],
[
['222', '223', '224'],
['232', '233', '234'],
['242', '243', '244'],
],
[
['333', '334', '335'],
['343', '344', '345'],
['353', '354', '355'],
],
];
//tohle nefunguje
//public function injectModel(\Model\AdminModule\Ciselniky $ciselniky){
// $this->ciselniky = $ciselniky;
//}
public function __construct()
{
}
public function render()
{
$template = $this->createTemplate();
$template->setFile(__DIR__ . '/templates/hledaniMain.latte');
$template->registerFilter(new \Nette\Latte\Engine());
$template->render();
}
protected function createComponentHledaniMain($name){
$this->form = new \Nette\Application\UI\Form;
$this->template->__form = $this->form;
$this->form->addSelect('one', 'One', $this->databaseOne)->setDefaultValue(1);
$this->form->addSelect('two', 'Two', $this->databaseTwo[$this->form['one']->value])->setDefaultValue(1);
$this->form->addSelect('three', 'Three', $this->databaseThree[$this->form['two']->value][1])->setDefaultValue(1);
$this->form->addSubmit('send', 'Odeslat');
$this->form->onSuccess[] = $this->success;
return $this->form;
}
public function success(UI\Form $form, $vals) {
dump($vals);
}
public function handleInvalidateTwo($value) {
$this['hledaniMain']['two']->setItems($this->databaseTwo[$value]);
$this['hledaniMain']['three']->setItems($this->databaseThree[$value][0]);
$this->redrawControl();
}
public function handleInvalidateThree($valueOne, $valueTwo) {
$this['hledaniMain']['three']->setItems($this->databaseThree[$valueOne][$valueTwo]);
$this->redrawControl('three');
}
}
?>
co a jak mám upravit abych například u handleInvalidateTwo($value){} mohl použít \Model\Ciselniky $ciselniky – tak abych mohl plnit selecty reálnými daty a ne pouze fiktivní databází uvnitř komponenty… jestli na to někdo můžete kouknout prosím, jsem fakt zmaten. (do __construct() což mi asi bylo porazeno to nelze přidat, napíše to že byla předána instance Presenter a ne \Model\Ciselniky.