Závislý select box (AJAX – kuchařka)

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

Ahoj, snažím se na aktuální verzi Nette zprovoznit závislý select box z kuchařky (https://blog.nette.org/…-and-pure-js). Nedaří se mi příklad dotáhnout do konce. Mohl bych poprosit o radu?

@layout.latte

{block scripts}
	<script src="{$basePath}/js/jquery.js"></script>
	<script src="{$basePath}/js/netteForms.js"></script>
	<script src="{$basePath}/js/nette.ajax.js"></script>
	<script src="{$basePath}/js/main.js"></script>
	{/block}

HomepagePresenter

<?php

namespace App\Presenters;

use Nette;
use App\Model;
use Nette\Application\UI\Form;


class HomepagePresenter extends BasePresenter
{

    public function handleFirstChange($value)
    {
        if ($value) {
            $secondItems = [
                1 => 'First option ' . $value . ' - second option 1',
                2 => 'First option ' . $value . ' - second option 2'
            ];

            $this['selectForm']['second']->setPrompt('Select')
                ->setItems($secondItems);

        } else {
            $this['selectForm']['second']->setPrompt('Select from first')
                ->setItems([]);
        }

        $this->redrawControl('wrapper');
        $this->redrawControl('secondSnippet');
    }

    protected function createComponentSelectForm()
    {
        $firstItems = [
            1 => 'First option 1',
            2 => 'First option 2'
        ];

        $form = new Form;
        $form->addSelect('first', 'First select:', $firstItems)->setPrompt('Select');
        $form->addSelect('second', 'Second select:')->setPrompt('Select from first');
        $form->addSubmit('send', 'Submit');
        $form->onSuccess[] = [$this, 'processSelectForm'];

        return $form;
    }

    public function processSelectForm(Form $form)
    {
        // $form->getValues() ignores invalidated input's values
        $values = $form->getHttpData();
        unset($values['send']);
        dump($values);

        // ...
    }

}

Homepage/default.latte

{define content}

{snippetArea wrapper}
    {form selectForm}
        {label first /} {input first}
        {snippet secondSnippet}
            {label second /} {input second}
        {/snippet}
        {input send}
    {/form}
{/snippetArea}

{include jsCallback, input => first, link => firstChange}

{/define}


{define jsCallback}
<script>

$('#' + {$control["selectForm"][$input]->htmlId}).on('change', function() {
    $.nette.ajax({
        type: 'GET',
        url: {link {$link}!},
        data: {
            'value': $(this).val(),
        }
    });
});

</script>
{/define}

main.js

$(function () {
    $.nette.init();
});

Prohlížeč mi sice formulář vypíše, ale žádné změny se po vybrání v prvním selectboxu nedějí. Navíc se mi na stránce objevuje toto:

array (3)
first ⇒ „1“
second ⇒ ""
_do ⇒ „selectForm-submit“ (17)

EDIT: Jakmile jsem přehodil v @layout.latte linkování scriptu před <include content> ajax se rozběhal.

Díky

Editoval iNyxLadis (18. 11. 2016 14:12)