Как установить начальный выбор для блока Select2, управляемого AJAX, с помощью CakePHP?

Я использую select2, чтобы пользователь мог выбирать вещи из списка из ajax. При добавлении в db он отлично работает, но я хочу отредактировать материал. Так что я все еще могу выбирать вещи из моего select2, но пользователь должен видеть, каково текущее значение select2.

Я пытался что-то сделать с InitSelect, но это не сработало, даже после того, как я только что передал данные из php.

Это мой Select2:

    $(".personid").select2({
    ajax: {
        type: "post",
        url: '/' + APP_PATH + '/Projects/find_person.json',
        datatype: 'json',
        quietMillis: '100',
        data: function (term, page) {
            return {
                q: term.toUpperCase(), // wprowadzony ciag znakow - zawsze na uppercase
                page_limit: 10,
            };
        },
        results: function (data, page) {
            var dane = {results: []};
            $.each(data['data'], function (i, item) {
                dane.results.push({
                    id: item['Person']['id'],
                    text: item['Person']['displayName']
                });
            });
            return dane;
        }
    }

});

И это мой ввод формы торта:

echo $this->Form->input('person_id', array(
    'type' => 'text',
    'value' => $projectcontact['Person']['id'],
    'Placeholder' => 'Wybierz osobę',
    'empty' => 'Wybierz osobę ',
    'class' => 'form-control personid',
    'label' => array(
        'class' => 'col-md-4 control-label',
        'text' => 'Osoba'
    )
));

Может ли кто-нибудь помочь заставить Select.js отображать текущие данные имени Persona из базы данных в этом?


person Aksebkit    schedule 29.03.2017    source источник


Ответы (1)


С Select2 4.x

С Select2 4.x вы больше не должны использовать текстовый элемент input, а использовать элемент select. Цитата из документов:

При использовании Select2 с удаленными данными HTML-код, необходимый для select, такой же, как и для любого другого Select2. Если вам нужно предоставить выбор по умолчанию, вам просто нужно включить option для каждого выбора, который содержит значение и текст, которые должны отображаться.

<select class="js-data-example-ajax">
    <option value="3620194" selected="selected">select2/select2</option>
</select>

https://select2.github.io/examples.html#data-ajax

Итак, как описано, создайте правильный вход select с одним выбранным элементом option, что-то вроде строк:

echo $this->Form->input('person_id', array(
    'type' => 'select',
    'options' => array(
        $projectcontact['Person']['id'] => $projectcontact['Person']['displayName']
    ),
    'selected' => $projectcontact['Person']['id'],
    'class' => 'form-control personid',
    'label' => array(
        'class' => 'col-md-4 control-label',
        'text' => 'Osoba'
    )
));

Кроме того, вам необходимо убедиться, что $projectcontact заполняется человеком в соответствии с возможным отправленным значением person_id, иначе выбранное значение не останется при рендеринге формы после отправки.

Обычно при создании элемента select вы используете полный список параметров, чтобы помощник формы мог автоматически выбрать соответствующий параметр на основе отправленного значения. Без такого списка вам придется читать и указывать конкретного человека.

Вот некоторый фиктивный код, демонстрирующий принцип:

$personId = $defaultPersonId;
if($this->request->is(array('post', 'put'))) {
    $personId = $this->request->data('ModelName.person_id');
    // ...
}

$projectcontact = $this->Person->findById($personId);
$this->set('projectcontact', $projectcontact);

Смотрите также

person ndm    schedule 29.03.2017
comment
Я бы не использовал selected, а default :) В противном случае репост приведет к потере данных только что опубликованного значения. Это не очень приятный пользовательский опыт. - person mark; 29.03.2017
comment
@mark Я думаю, что в любом случае это потребует некоторого дополнительного foo, независимо от того, используете ли вы default или selected, например, заполните $projectcontact в соответствии с возможно переданным значением person_id в данных запроса, иначе опубликованный выбор, вероятно, не будет сохранен ... I проверю это и обновлю свой ответ. - person ndm; 29.03.2017
comment
Спасибо попробую завтра. Разве select2 в v4 не использовал select? Поскольку в моем приложении я использую более старую версию, я думаю, 3.X. Это не будет проблемой? - person Aksebkit; 30.03.2017
comment
@Aksebkit Не уверен, что понимаю, что вы пытаетесь сказать, но, насколько мне известно, Select2 всегда предназначался для использования с элементом <select>, хотя в некоторых ситуациях он может работать и с элементами <input>. - person ndm; 30.03.2017
comment
Да, это не работает для меня. Это дает мне ошибку: опция «ajax» не разрешена для Select2 при прикреплении к элементу «select». Я думаю, они исправили это в Select2 в версии 4. Вы знаете, как это исправить для более старой версии? - person Aksebkit; 03.04.2017
comment
@Aksebkit Глядя на старые документы, вам придется использовать initSelect, пожалуйста, добавьте к своему вопросу код (JS, а также PHP), который, как вы сказали, предположительно не работает, и объясните, что именно происходит вместо отображения первоначального выбора . - person ndm; 03.04.2017
comment
Я исправил init Select, отправив с ним еще один ajax и вернув свои данные об успехе, что я отправляю значение (идентификатор человека) в контроллер, и он получает то, что я хочу сейчас. Я опубликую ответ позже. Спасибо за помощь. - person Aksebkit; 03.04.2017