Závislí select v addDynamic na datu mimo container
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- plasmo
- Člen | 66
Ahoj,
nedaří se mi 100% rozchodit zavislí select v addDynamic containeru. Problém
je následující:
- mám formuálář ve kterém mám definovanou komponentu dateTimePicker
$this->addDateTimePicker('date_vat', 'Datum zd.pln.', 8, 10)
->addRule($this::FILLED, 'Musíte zadat datum.');
- a dále dynamic, který je definovaný následovně
$vatRate = $this->loadVatRate();
$items = $form->addDynamic('items', function (\Nette\Forms\Container $container) use ($invalidateCallback, $vatRate) {
$container->addCheckbox('select');
$container->addText('description', 'Popis', 10, 100);
$container->addText('count', 'Počet', 5, 100);
$container->addText('price_unit', 'Cena za jednotku', 5, 100);
$container->addText('q_unit', 'MJ', 5, 100);
if ($this->getParameters()->vat_payer) {
$container->addSelect('vat', '')
->setItems($vatRate);
}
$container->addSubmit('remove', "Odebrat")
->addRemoveOnClick($invalidateCallback)
->setValidationScope(FALSE);
}, (is_null($this->inovice)) ? 1 : 0);
$items->addSubmit('add', 'Přidat položku')
->setValidationScope(FALSE)
->addCreateOnClick(TRUE, $invalidateCallback);
- metoda loadVatRate vypadá takto
private function loadVatRate($date = null) {
$vatRate = array();
foreach ($this->getService('vatRateService')->getValidVatRate($date)->fetchPairs('id') as $val)
$vatRate[$val->vat] = $val->vat . "% (" . $val->name . ")";
return $vatRate;
}
- signál pro zpracovní AJAX požadavku
public function handleVatRateLoad($date) {
$form = $this->getComponent("inoviceForm");
$time = strtotime($date);
$date = new \Nette\DateTime();
$date->setTimestamp($time);
foreach ($form['items']->containers as $item)
$item['vat']->setItems($this->loadVatRate($date));
$this->template->_form = $this['inoviceForm'];
$this->invalidateControl("inoviceFormItems");
}
Závislí selecet je „vat“ a závisí na komponentě „date_vat“. V momentě kdy mám načtený formulář s jednou položkou a změním datum daň. plnění tak se změní i sazby dph u položky, dle platnosti dané v číselníku sazeb, ale problém nastane, když kliknu na „Přidat položku“ a do formuláře naskočí další položka, tak se sazby resetují zpět na defaultní nastavení. Co udělat proto aby mi tam zůstali ty aktuálně načtené sazby? Děkuji
- plasmo
- Člen | 66
Tak jsem asi problém vyřešil, stačilo upravit callback takto
$invalidateCallback = function () use ($presenter) {
$form = $presenter->getComponent('inoviceForm');
$vatRate = $this->loadVatRate($form['date_vat']->value);
foreach ($form['items']->containers as $item)
$item['vat']->setItems($vatRate);
/** @var \Nette\Application\UI\Presenter $presenter */
$presenter->invalidateControl('inoviceFormItems');
};
- plasmo
- Člen | 66
Ještě doplním že je třeba položky následně načítat takto při zpracování:
//uložím položky do samostatné proměnné
$values = $form->getHttpData();
unset($values["save"]);
unset($values["_token_"]);
$inovice_item = $val->from($values['items']);
Jinak se nám může stát že proměná vat bude obahovat NULL