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
+
0
-

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
+
0
-

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
+
0
-

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