AJAX a formuláre – hodnoty v selectboxe neakceptovane
- plab
- Člen | 1
Mám problém s dynamicky pridanými položkami do selectboxu. Po odoslaní formuláru mám v zmenených selectboxoch NULL namiesto pridaných položiek. Vychádzal som z Davidovho príkladu spojenie formulárov s Ajaxom.
Formulár je klasicky vytvorený cez továrničku.
Šablóna:
{snippet iform}
{control invform}
{/snippet}
Javascript:
<script type="text/javascript">
$("#frminvform-Select_id").livequery('change', function(e){
$.get("?do=loaddata", {"value": $(this).val()});
});
</script>
Signál, ktorý upravuje hodnoty selectboxov:
<?php
public function handleLoadData($value)
{
$form = $this->getComponent('invform');
// naplníme select box prvky
$itypes = new Model();
$zoznamit = $itypes->findAll()->fetchPairs('id', 'name');
$form['I_types_id']->setItems($zoznamit)->skipFirst('Vyberte');
...
$this->validateControl();
$this->invalidateControl('iform');
}
?>
Formulár sa mi prekreslí, select boxy sa naplnia prvkami ale po odoslaní je ich hodnota vždy NULL.
Editoval plab (8. 1. 2010 6:58)
- mach2roman
- Člen | 22
Mám stejný problém. Comba se přes AJAX korektně naplní položkami, ale po odeslání formuláře mají všechny comba naplněná přes AJAX hodnotu NULL a ne tu vybranou? Taky bych uvítal radu.
- mach2roman
- Člen | 22
Jelikož jsem nikde na fóru nenašel řesení problému jak comba naplněná přes ajax odeslat, vymyslel jsem toto (asi poněkud neprantické) funkční řešení.
- do formuláře přidat obyčejné tlačítko
<?php
$form->addButton('odeslat','B - Uložit smlouvu')
->getControlPrototype()
->onclick('saveForm();');
?>
- skrýt submit tlačítko třeba přes jquery (tlačítko nerušit ve formuláři, aby se vygenerovala validace)
<script>
$(document).ready(function(){
$('#frmsmlouvyNova2Form-pridej').css('display','none');
});
</script>
- doplnit JS který „ručně“ odešle formulář např.
<script>
function saveForm(){
if (validateSmlouvyNova2Form()) {
chs1 = $('#frmsmlouvyNova2Form-chs1').val();
chs2 = $('#frmsmlouvyNova2Form-chs2').val();
chs3 = $('#frmsmlouvyNova2Form-chs3').val();
chs4 = $('#frmsmlouvyNova2Form-chs4').val();
chs5 = $('#frmsmlouvyNova2Form-chs5').val();
$.getJSON({link saveForm2!}, { chs1: chs1, chs2: chs2, chs3: chs3, chs4: chs4, chs5: chs5 }, function(payload) {
if (payload.code == 1) {
/* tady bude redirect při úspěšném zpracování */
}
else {
/* tady bude zpracování chyby */
}
});
}
}
</script>
- obsloužení hodnot stejně jako při odeslání formu před handle
<?php
public function handleSaveForm2($chs1, $chs2, $chs3, $chs4, $chs5) {
$sql_values = array (
'chs1' => $chs1,
'chs2' => $chs2,
'chs3' => $chs3,
'chs4' => $chs4,
'chs5' => $chs5,
);
$result = SqlBase::saveObjSmlouvaHlavicka($sql_values);
if ($result) {
$this->payload->code = 1;
}
else {
$this->payload->code = 0;
}
$this->sendPayload();
$this->terminate();
}
?>
to je vše. Vyzkoušeno a funguje. Pokud najdete jednodušší řešení budu rád.
- iguana007
- Člen | 970
Tak jsem dnes byl donucen taky řešit combo select … tady je moje řešení, myslím, že o něco jednodušší:
komponenta formuláře:
$this->addSelect('parentId', _('Rodič položky'));
$this->addSelect('order', _('ID v pořadí'));
akce na vykreslení formuláře (naplnění prvního selectu):
//naplněno pomocí dibi::fetchPairs
$form['parentId']->setItems($categories);
javascript v template, kde vykresluju form:
$(function()
{
$('#frmeditCategoryForm-parentId').comboSelect('#frmeditCategoryForm-order',{plink Article:getCategoryChildren});
});
javascript includovaný v hlavičce layoutu:
jQuery.fn.comboSelect = function( target, url )
{
return this.each( function()
{
$(this).change( function( )
{
ajaxCallback = function(data, textStatus)
{
$(target).empty();
$.each(data,
function() {
//funguje pouze v jQuery 1.4
$("<option/>",{value:this.id,text:this.name}).appendTo(target);
}
);
};
//prijimam toto: [{"id":"1","name":"Polozka 1"},{"id":"2","name":"Polozka 2"},{"id":"3","name":"Polozka 3"}]
//pomoci: (array)dibi::fetchAll
$.getJSON(url+$(this).val(), ajaxCallback );
});
});
};
submit formuláře:
Zde nahrazuju NULL hodnotu tím, co přijímám přes _POST u dynamicky vytvořeného druhého selectu, nevím jestli je to uplně čisté řešení, ale každopadně mi to funguje …
$values = $form->getValues();
$values['order'] = $_POST['order'];
Snad to někomu pomůže.
igi