Jak se v kódu odkázat na snippet

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

Na formuláři mám snippet, který se správně vykreslí
v latte je tento kód

	{form $form}
		<dt>{label userinterpret /}</dt> <dd>{input userinterpret}</dd>
		{snippet userFilter}
			{var $_form = $form}
			<dt>{label interpret /}</dt> <dd>{input interpret}</dd>
			{include #js}
		{/snippet}
	{/form}

když se podívám na vygenerovaný html kód tak ho tam vidím

<dt>
    <label for="frm-filterForm-userinterpret">Jméno uživatele</label></dt>
<dd><select name="userinterpret" id="frm-filterForm-userinterpret">
    <option value="4044" selected="">Option 1</option>
    <option value="4636">Option 2</option>
    <option value="5145">Option 3</option></select>
</dd>
<div id="snippet-grid-filter-userFilter">
    <dt><label for="frm-filterForm-interpret">Umělec/soubor</label></dt>
    <dd><select name="interpret" id="frm-filterForm-interpret">
        <option value="4044" selected="">Option1_1</option></select>
    </dd>
<script type="text/javascript">
    $('#frm-filterForm-interpret').on('change', function (event) {
        $.ajax({
            type: 'GET',
            url: '/?do=userChange',
            data: {
                'userinterpret': $('#frm-filterForm-userinterpret').val(),
            }
        });
    });
</script>
</div>

PHP pro ten handle.

	public function handleUserChange($userinterpret, $interpret, $years) {
		if ($userinterpret) {
			$interpretSelect = $this->getInterpretSelect($userinterpret);
			$interprets = $interpretSelect->fetchPairs('Id', 'Name');
			$interpretKod = array_keys($interprets);

			$this['filterForm']['interpret']
				 ->setItems($interprets);
		} else {
			$this['filterForm']['interpret']->setPrompt('Vyberte nejdříve umělce')
				 ->setItems(array());
		}

		$this['grid']['filter']['userFilter']->redrawControl();
	}

Když se ten hande vyvolá, tak skončí chybou
Component with name ‚userFilter‘ does not exist.

Když ten poslední řádek upravím

		$this['grid']['filter']->redrawControl('userFilter');

tak k chybě nedojde, ale snippet se nepřekreslí.

Jak mám zavolat to překreslení snippetu, aby se opravdu překreslil.

Editoval svobodai (24. 11. 2014 12:55)

David Matějka
Moderator | 6445
+
0
-

Nemas tam totiz callback, ktery by to zpracoval. Pokud pouzivas nette.ajax.js, volej

$.nette.ajax({....})

namisto toho $.ajax a provede se to spravne

svobodai
Člen | 136
+
0
-

V tom problém není. Používám jquery.nette.js Takže ten zápis mám dobře. Ostatně ten callback se zavolá, ale skončí buď chybou, že neexistuje komponenta, nebo se vlastně nevrátí v JSON odpovědi to co se má překreslit.
Jde mi vlastně o to jak PHP dotlačit k tomu aby v JSON předalo pod grid-filter-userFilter to čím se to má překreslit, když mi to nevyhodí chybu, tak se to v JSON odpovědi stejně neobjeví.

Jiří Nápravník
Člen | 710
+
0
-

Nemáš
{form form}

{snippet}
{/snippet}

{/form}

?

Pokud ano, tak je to taková nemilá vlastnost. Dej tedy tam, dke tvoříš formulář tohle: $this->template->__form = $form;

svobodai
Člen | 136
+
0
-

Jiří Nápravník napsal(a):

Nemáš
{form form}

{snippet}
{/snippet}

{/form}

?

Pokud ano, tak je to taková nemilá vlastnost. Dej tedy tam, dke tvoříš formulář tohle: $this->template->__form = $form;

Mám tam {form $form} a při tvorbě formuláře mám $this->template->form = $form;

David Matějka
Moderator | 6445
+
0
-

co se vraci v response ze serveru?

svobodai
Člen | 136
+
0
-

matej21 napsal(a):

co se vraci v response ze serveru?

V JSON je vidět, že se vrátí toto

{"state":
	{"ajax":null,
        "grid-ordering-settings":{"ordering":{"BroadcastName":"ASC"}},
        "grid-translator-settings":null,
        "grid-export-settings":null,
        "grid-filter-settings":{"userinterpret":"4044","interpret":"4044","years":"2013"},
        "grid-pager-number":null,
        "grid-pager-settings":{"page":"3"}
    }
}