Мультиселект с плагином select2 с данными через AJAX в nette возвращает пустой массив - PullRequest
0 голосов
/ 08 марта 2019

У меня есть этот код в JS. Результаты данных загружаются через дескриптор из Presenter.

      $('.selectTypeAhead').select2({
            multiple: true,
            ajax: {
                url: url,
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    return {
                        query: params.term,
                        page: params.page || 1
                    };
                },
                processResults: function (data, params) {
                    return {
                        results: JSON.parse(data.results),
                        pagination: {
                            more: true
                        }
                    };
                },
                cache: true
            },
            escapeMarkup: function (markup) {
                return markup;
            },
            minimumInputLength: 2,
            language: 'cs',
            templateResult: function (result) {
                return '<div>' + result.text + '</div>'
            },
            templateSelection: formatRepoSelection
        });

        function formatRepoSelection(repo) {
            return repo.full_name || repo.text;
        }


    }
});

Обработка отправки данных в JS:

public function handleSelect2Array()
{

    $testData[] = [
        'id'=> '1',
        'text' => 'example'
    ];
    $this->payload->results = json_encode($testData);
    $this->sendPayload();
}

Форма фабрики в нетте

 public function createForm()
{
    $form = new Form();
    $form->addMultiSelect('multiselect', 'label description' );
    $form->addSubmit('send', 'Uložit');
    return $form;
}

Ведущий материал

   protected function createComponentForm()
{
    $form = $this->FormFactory->createForm();
    $form->onSuccess[] = [$this, 'FormSucceeded'];     
    return $form;
}

И, наконец, вот мой шаблон латте в nette:

     <div class="container">
        {snippet examplesnippet}
            {form Form, class=>'form'}
            <div class="modal-body">

                <div n:class="form-group">
                    <div class="input-group" id="select2example" data-link=" 
                     {link select2Array!}">
                        <div class="input-group-addon">
                            {label multiselect}
                        </div>
                            {input multiselect, class=>' form-control selectTypeAhead'}
                    </div>
                </div>
            {/form}
        {/snippet}
      </div>

Все работает хорошо. Я могу выбрать несколько контентов в своем окне множественного выбора на странице. Проблема в том, когда я нажимаю кнопку «Отправить». Я получаю все остальные значения из формы, но множественный выбор возвращает пустой массив. Я пытался играть с фрагментами и прочим вокруг ajax в nette, но обнаружил, что проблема, скорее всего, заключается в конфигурации select2 ... что я делаю не так?

1 Ответ

1 голос
/ 16 июня 2019

У меня была такая же проблема.Когда вы используете множественный выбор, вы также должны указать значения на стороне Nette (вероятно, по некоторым причинам безопасности).Убедитесь, что у вас одинаковые идентификаторы с обеих сторон.:)

Форма Nette:

$form->addMultiSelect('multiselect', 'label description', [
1 => 'item',
2 => 'another item'
] );

JSON-ответ для select2:

{
  "results": [
    {
      "id": 1,
      "text": "item"
    },
    {
      "id": 2,
      "text": "another item"
    }
  ],
}
...