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