Radiolist s textovým inputem

andrstom
Člen | 21
+
0
-

Ahoj,

pátral jsem po fóru a googlil jsem, ale nenašel jsem vhodné řešení, které by fungovalo. Potřeboval bych nakopnout s nastavením radiolistu. Cílem je, aby poslední item v radiolistu byl textové pole kam uživatel zadá číslo (Other). Rád bych se kvůli validaci vyhnul manuálnímu rendrování.

Za každou radu nebo nasměrování moc děkuju.

<?php
$form->addRadioList('dilution', 'Dilution:', ['101' => '101x (serum)', '2' => '2x (CSF)', '81' => '81x (synovia)', '' => 'Other'])
       ->setDefaultValue('101');
?>
Pavel Kravčík
Člen | 1180
+
+2
-

Uděláš samostatný textový input, tomu nastavíš přes HTML pro div nějaké id. A pak u tvého radiolistu dáš ->toggle('nazevid') s podmínkou na konkrétní název klíče. Příklad je tady: https://doc.nette.org/…s/validation#…

andrstom
Člen | 21
+
0
-

Pavel Kravčík napsal(a):

Uděláš samostatný textový input, tomu nastavíš přes HTML pro div nějaké id. A pak u tvého radiolistu dáš ->toggle('nazevid') s podmínkou na konkrétní název klíče. Příklad je tady: https://doc.nette.org/…s/validation#…

Ahoj Pavle,
děkuju za nasměrování. Tvou variantu jsem také zkoušel a zdá se být ideální. Jen mám problém s togglovaní. Resp. mám ve formuláři selectbox a v závislosti na optionu se mi formulář dynamicky překreslí – v tomto momentě už mi nefunguje toggle().

Nějaký nápad?

Presenter:

...

public function renderDefault() {
    $dilutions = ['101' => '101x (serum)', '2' => '2x (CSF)', '81' => '81x (synovia)', 'x' => 'Jiné / Other'];
    $this->template->dilutions = $dilutions;
}

...

public function createComponentCalculatorForm() {
    $form = new Form;
    $form->addRadioList('dilution', '* Ředění vzorku / Dilution:', $dilutions)
        ->setDefaultValue('101')
        ->addCondition(Form::EQUAL, 'x')
            ->toggle('other_dilution', true)
            ->endCondition()
        ->addCondition(Form::NOT_EQUAL, 'x')
            ->toggle('other_dilution', false)
            ->endCondition(); // + další validacni pravidla

    $form->addText('other_dilution', 'Jiné/Other:')
        ->setHtmlId('other_dilution')
        ->addConditionOn($form['dilution'], Form::EQUAL, 'x')
            ->setRequired('Vyplnit Jiné / Set Other')
            ->endCondition();
...

Latte:

{snippetArea wrapper}
	{snippet paramSnippet}
    	{form calculatorForm}
        	<p>{label assay /} {input assay}</p>    <!-- prekresly formular -->
        	<p n:foreach="$dilutions as $item => $key"><label for="{$item}"><input type="radio" n:name="dilution" id="{$item}" value="{$item}"> {$key}</label></p>
        	<p>{input other_dilution}</p>
		{/form}
	{/snippet}
{/snippetArea}

...

{include jsCallback, input => assay, link => loadAssayDetails}
{define jsCallback}
<script>
$('#' + {$control["calculatorForm"][$input]->htmlId}).off('change').on('change', function () {
    $.nette.ajax({
        type: 'GET',
        url: {link {$link}!},
        data: {
            'value': $(this).val(),
        }
    });
});
</script>
{/define}