Contributte\Form-multiplier + snippets, data podle selectboxu (Component with name ‚x‘ does not exist)

andrstom
Člen | 21
+
0
-

Ahoj lidi,
prosím o pomoc v nouzi – bohužel jsem zde nenašel odpověď která by mi pomohla. Používám v projektu (jakýsi kalkulátor) Contributte\Form-multiplier, který mi generuje potřebný počet řádků, resp. formulářů, ve kterém je selectbox a několik textových inputů. V závislosti na selectboxu chci do textových inputů nahrát odpovídající data. Což si myslím, že mám OK, ale současně mám několik problémů. Ten hlavní je, že si né moc dobře rozumím se snippetama a ajaxem celkově:-) a další jsou pak:

  1. když zavolám handle tak se nepřekreslí správný formulář, ale vznikne nový „řádek“ mimo tabulku s inputama, který obsahuje odpovídající data z db.
  2. pokud přidám více řádků a zavolám handle tak mi to skončí chybou „Component with name ‚xy‘ does not exist“.

Nejsem si jistý, jestli k tomu celkově nepřistupuju špatně – např. je-li definice jsCallback volaná na správném místě apod. I za odkaz na podobný funkční formulář budu vděčný;-)

Předem moc děkuju.
Tomáš

Presenter

class MonoPresenter extends BasePresenter {
	// ...
	public function renderDefault() {
        $this->template->assayIterator = 0;
    }
    public function handleLoadAssayDetails(int $value = null, int $snippetId = null) {
        if ($value) {
            // load assay details
            if ($this->getUser()->isLoggedIn()) {
                $assaydetail = $this->dbHandler->getUsersAssaysMono()->where('assays_id', $value)->where('users_id', $this->getUser()->id)->fetch();
                $this['monoForm']['formValues'][$snippetId]['batch']->setDefaultValue($assaydetail['batch']);
                $this['monoForm']['formValues'][$snippetId]['kf']->setDefaultValue(str_replace(".", ",", $assaydetail['kf']));
                $this['monoForm']['formValues'][$snippetId]['blank_max']->setDefaultValue(str_replace(".", ",", $assaydetail['blank_max']));
                $this['monoForm']['formValues'][$snippetId]['cal_min']->setDefaultValue(str_replace(".", ",", $assaydetail['blank_max']));
                $this['monoForm']['formValues'][$snippetId]['std_bmax']->setDefaultValue(str_replace(".", ",", $assaydetail['std_bmax']));
                $this['monoForm']['formValues'][$snippetId]['a1']->setDefaultValue(str_replace(".", ",", $assaydetail['a1']));
                $this['monoForm']['formValues'][$snippetId]['a2']->setDefaultValue(str_replace(".", ",", $assaydetail['a2']));
                $this['monoForm']['formValues'][$snippetId]['c']->setDefaultValue(str_replace(".", ",", $assaydetail['c']));
                $this['monoForm']['formValues'][$snippetId]['c_min']->setDefaultValue(str_replace(".", ",", $assaydetail['c_min']));
                $this['monoForm']['formValues'][$snippetId]['c_max']->setDefaultValue(str_replace(".", ",", $assaydetail['c_max']));
            }
        }
        $this->redrawControl('wrapper');
        $this->redrawControl('monotestSnippet-'.$snippetId);
    }

    public function createComponentMonoForm() {
        //  ...
		$form = new Form;
        $copies = 1;
        $maxCopies = 24;
        $dilutions = ['101' => '101x (serum)', '2' => '2x (CSF)', '81' => '81x (synovia)', '505' => '505x (A. fumigatus IgG)', 'x' => 'Jiné / Other'];
        $this->userassay = $this->dbHandler->getAssaysMono()->where('active', 'ANO')->fetchPairs('id', 'assay_short');

        $multiplier = $form->addMultiplier('formValues', function (Container $container, Form $form) {
            $container->addSelect('assay', '* Vyberte soupravu / Select assay:', $this->userassay)
                ->setPrompt('Select');
            $container->addSelect('dilution', '* Ředění / Dilution', $dilutions)
                ->setPrompt('Select');
            $container->addText('sample_id', 'Sample ID: ');
            $container->addText('batch', 'LOT:');
            $container->addText('blank_max', 'Blank maximum:');
            $container->addText('cal_min', 'CAL minimum:');
            $container->addText('kf', 'Corr. factor:');
            $container->addText('std_bmax', 'CAL B/Bmax:');
            $container->addText('a1', 'A1:');
            $container->addText('a2', 'A2:');
            $container->addText('c', 'C:');
            $container->addText('c_min', 'Cmin:');
            $container->addText('c_max', 'Cmax:');
            $container->addText('blank_od', 'BLANK:');
            $container->addText('sample_od', 'SAMPLE:');
            $container->addText('cal_od', 'CAL:');
        }, $copies, $maxCopies);
        $multiplier->addCreateButton('Přidat / Add')
                ->setValidationScope([]);
        $multiplier->addRemoveButton('Smazat / Delete')
                ->addClass('btn btn-danger');
        $form->addSubmit('sendMonoPdf', 'Spočítat / Calculate (PDF)')
                ->setHtmlAttribute('class', 'btn btn-primary');
        $form->onSuccess[] = [$this, 'monoCalcFormSuccesed'];
        return $form;
    }
	// ...
}

Latte

{snippetArea wrapper}
	{form monoForm}
        <table id="samplesTable" class="table-responsive monotest-table">
        	<thead>
                 <!-- ... -->
            </thead>
            <tbody>
                <tr n:multiplier=formValues>
                {var $assayIterator = $_multiplier->name}
                {define jsCallback}
                <script>
                	$('#' + {$control[monoForm][formValues]->components[$assayIterator][$input]->htmlId}).off('change').on('change', function () {
                    	$.nette.ajax({
                        	type: 'GET',
                            url: {link {$link}!},
                            data: {
                            	'value': $(this).val(),
                                'snippetId': {$assayIterator}
                            }
                        });
                    });
                    </script>
                    {/define}
                    {snippet monotestSnippet-$assayIterator}
                    <tr>
                    	<td>{$assayIterator+1}</td>
                        <td>{input assay}</td>
                        <td>{input dilution}</td>
                        <td>{input batch}</td>
                        <td>{input sample_id}</td>
                        <td>{input blank_max}</td>
                        <td>{input std_bmax}</td>
                        <td>{input a1}</td>
                        <td>{input a2}</td>
                        <td>{input kf}</td>
                        <td>{input blank_od}</td>
                        <td>{input sample_od}</td>
                        <td>{input cal_od}</td>
                    	<td>{input cal_min}</td>
                        <td>{input c}</td>
                        <td>{input c_min}</td>
                        <td>{input c_max}</td>
                    </tr>
                    {/snippet}
                    {include jsCallback, iterator => $assayIterator, input => assay, link => loadAssayDetails}
                    <tr><td>{btnRemove 'class' => 'btn btn-danger col-lg-12'}</td></tr>
                </tr>
            </tbody>
        </table>
        {btnCreate formValues 'class' => 'btn btn-primary'} |
        {btnCreate $form[formValues]:5 'class' => 'btn btn-primary'}
        {input sendMonoPdf}
        {input sendMonoXls}
        {input sendMonoText}
    </div>
{/form}
{/snippetArea}
andrstom
Člen | 21
+
0
-

Ahoj, stále se mi nepodařilo najít řešení. Zkouším vše možné. Poradíte, prosím, někdo jak co nejjednodušeji udělat dynamické přidávání řádků formuláře, vč. ajaxového doplnění dat podle selectu?