AJAX a formuláre – hodnoty v selectboxe neakceptovane

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
plab
Člen | 1
+
0
-

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
+
0
-

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
+
0
-

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í.

  1. do formuláře přidat obyčejné tlačítko
<?php
$form->addButton('odeslat','B - Uložit smlouvu')
	->getControlPrototype()
		->onclick('saveForm();');
?>
  1. 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>
  1. 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>
  1. 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
+
0
-

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