Odeslání formuláře s propojenými selectboxy
- kashpi
- Člen | 48
Zdravím, narazil jsem na problém. Konečně se mi podařilo rozchodit
propojení selectboxů, ale hned potom přišel zádrhel, když jsem potřeboval
data uložit do databáze.
Vstupní formulář:
<?php
public function createComponentEditCalcForm($name) {
...
$form = new AppForm($this, $name);
...
$form->addSelect('energie_typ_id', 'Typ odběru', $typOdb)->setDefaultValue($row->energie_typ_id)->skipFirst('Vyberte typ odběru');
$form->addSelect('sazba_id', 'Sazba za distribuci', $sazba)->setDefaultValue($row->sazba_id)->skipFirst('Vyberte sazbu');
$form->addSubmit('send', 'Uložit');
$form->onSubmit[] = callback($this, 'editCalcFormSubmitted');
return $form;
}
?>
Při výběru prvního selectboxu se z databáze natáhnou data podle toho co se vybere, to funguje jak má.
V šabloně je:
<script>
$(function() {
$('#frmeditCalcForm-energie_typ_id').change(function () {
loadData($(this).val());
});
function loadData(value) {
jQuery.get({link loadSazby!}, {"value": value}, function(data) {
jQuery('#frmeditCalcForm-sazba_id').replaceWith(data);
}, "html");
}
});
</script>
A nakonec asi kámen úrazu je tato funkce která se stará o načítání závislého selectboxu
<?php
public function handleLoadSazby() {
$form = $this->getComponent('editCalcForm');
$sazba_id = $this->getParam('value');
$data = \dibi::query("SELECT id, name FROM [energie_sazba] WHERE typ_id=%i", $sazba_id)->fetchPairs("id", "name");
$form['sazba_id']->setItems($data)->skipFirst('Vyberte sazbu');
echo $form['sazba_id']->getControl();
$this->terminate();
}
?>
V šabloně se data naplní jak mají, hodnoty selectboxu mají např
data
<option value=„10“>C01d</option>
ale problém je asi v <?php $form[‚sazba_id‘] ?> protože při
odeslíná formuláře vrací prázdnou hodnotu. Pokud se nenačte pomocí
JavaScriptu tak se vše uloží jak má, ale pokud se změní první selectbox,
tak i když vyberu hodnotu „10“, tak do databáze posílá
[sazba_id] = >
Nevítete někdo prosím proč to dělá? Předem děkuji za
jakoukoli radu.
- Honza Kuchař
- Člen | 1662
O to prave jde. ;) Je to bezpecnostni osetreni vstupu, ktere dependent selecbox jiste resi.