Ajax Snippety vše se odesílá, ale nic se nevrací

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

Zdravím, už jsem zoufalej, prošel jsem snad všechny vlákna kde se řeší snippety, ale můj problém to nevyřešilo. Prostě chci na základě změny jednoho selectu, změnit ten druhý. Mám toto:

V presenteru:

/**
* @param $brand
*/
public function handleFirstChange($brand)
    {

        if($brand){
            $items = [1 => "Řada 5"];
            $this['filterForm']['model']->setPrompt('Vyberte Model')
                ->setItems($items);
        } else {
            $this['filterForm']['model']->setPrompt('Nejdříve vyberte model')
                ->setItems([]);
        }
        $this->redrawControl('wrapper');
        $this->redrawControl('modelSnippet');
    }

    protected function createComponentFilterForm(){
        $form = new Form;
        $form->addSelect('brand', NULL, [1 => "BMW"])->setPrompt('Značka');
        $form->addSelect('model')->setPrompt('Nejdříve vyberte značku');

        return $form;
    }

Šablona:

{snippetArea wrapper}
				<form n:name=filterForm action="" method="post" novalidate>
					<div id="car-form">
						<div class="form-group">
							<select n:name=brand class="form-control">
								<option value="" selected>Značka</option>
							</select>
						</div>
						{snippet modelSnippet}
						<div class="form-group">
							<select n:name=model class="form-control">
							</select>
						</div>
						{/snippet}
						{include js}
					</div>
				</form>
{/snippetArea}
{define js}
    {include jsCallback, input => brand, link => firstChange}
    {/define}
	{define jsCallback}
		<script>
				$('#' + {$control["filterForm"][$input]->htmlId}).on('change', function () {
					$.nette.ajax({
						url: {link {$link}!},
						data: {'brand': $(this).val()},
						type: 'get',
						datatype: "json"
					});
				});
		</script>
	{/define}

Po výběru z prvního Selectu se pouze v konzoli vypíše: „XHR finished loading: GET "http://localhost/fajnauto/www/offer/cars?do=firstChange&brand=1“."
A tím to končí, netušíte někdo kde dělám chybu. Děkuji za odpovědi

iguana007
Člen | 970
+
+1
-

Dvě věci:

  1. Console je sice fajn, ale spíše se podívej do panelu Network, co se ti v té odpovědi vrátilo a hoď to sem
  2. Osobně by jsem radši použil nějaký dependent select addon, protože si myslím, že až dořešíš Ajax, tak budeš heště bojovat s validací atd. Zde máš dva addony, které toto řeší: https://github.com/…entselectbox + https://github.com/…entSelectBox Nasadíš to za pár minut a budeš ready třeba i na 3 vzájemně závislé selecty bez větších úprav kódu ;)
Rudolf247
Člen | 38
+
0
-

Dobře, v Network v záložce Preview mám tohle

{state: [], snippets: []}
snippets:[]
state:[]

Jinak NasExt DependentSelectBox jsem zkoušel a taky se mi nějak nechytal, hlavně mi už z dokumentace nevyhovovala funkčnost.
Já tady v příkladu mám sice statické data, ale ve výsledku se mají data tahat z databáze. Takže když jako značku vyberu Škodu, která bude mít třeba value=„3“(id), tak se pošle do presenteru brand=3, kde bude dotaz do databáze a vytáhne mi to z tabulky všechny zapsaný modely Škody. Což by v tom NasExt asi nešlo, nebo jsem to jenom nepochopil. Kouknu na to druhé. Děkuji.

Rudolf247
Člen | 38
+
0
-

Tak už mi to funguje. Stačilo tam dát pouze

$this->redrawControl();

Prostě bez názvu snippetu, upřímě teda nechápu proč a nerozumím tomu, ale když to funguje…