2

I am trying to add the default selected option to multiple select2 with remote data. But the title is set instead of the option text. This is my code:

Html

<select class="form-control select_medicines" id="select_medicines" name="medicines[]" multiple="multiple">
    @foreach($medicines as $medicine)
        <option value="{{$medicine->id}}" selected="selected">{{$medicine->fa_name . "(" . $medicine->en_name . ")"}}</option>
    @endforeach
</select>

Js

$(document).ready(function() {
$(".select_medicines").select2({
    ajax: {
        url: 'url',
        dataType: 'json',
        delay: 250,
        data: function (params) {
            return {
                search: params.term, // search term
                page: params.page
            };
        },
        processResults: function (data, params) {
            params.page = params.page || 1;

            return {
                results: $.map(data.data, function(obj) {
                    return {
                        id: obj.id,
                        fa_name: obj.fa_name,
                        en_name: obj.en_name,
                        is_for_diabetes: obj.is_for_diabetes
                    };
                }),
                pagination: {
                    more: (params.page * 15) < data.total_count
                }
            };
        },
        cache: true
    },
    placeholder: 'search',
    width: '100%',
    minimumInputLength: 3,
    escapeMarkup: function(markup) {
        return markup;
    },
    templateResult: formatRepo,
    templateSelection: formatRepoSelection
});

function formatRepo (repo) {
    if (repo.loading) {
        return repo.text;
    }

    var markup = "<div class='select2-result-repository clearfix'>" +
        "<div class='select2-result-repository__meta'>" ;

    markup += "<div class='mt-0 mb-2 text-dark'>";

    if (repo.is_for_diabetes === "1"){
        markup+= "<i class='mdi mdi-star mr-1'></i>";
    }

    markup += repo.fa_name + "(" + repo.en_name + ")";
    markup += "</div>";

    markup += "</div></div>";
    return markup;
}

function formatRepoSelection (repo) {
    return repo.fa_name || repo.en_name;
}
});

and this is the result: enter image description here

the title of option is set but text of option is empty. how can I set text of option? default selected options must be shown like "select after search" enter image description here

I try to add value like {id: 12, text: metformin} to select but the default options were not selected and the remote data did not work for the options and only showed the data in Json instead of the remote data.

I did this as another solution but no option was selected.

Controller

$medicines_id = $user->medicines()->pluck('medicines.id')->all();
$medicines_fa_name = $user->medicines()->pluck('medicines.fa_name')->all();

HTML

<select class="form-control select_medicines" id="select_medicines" name="medicines[]" multiple="multiple"></select>
@if(count($medicines_id) > 0)
    @foreach($medicines_id as $k => $medicine_id)
        <input value='{{json_encode("{id: $medicine_id, text: $medicines_fa_name[$k]}")}}' class="checked_medicines" readonly hidden>
    @endforeach
@endif

These lines were added to the JavaScript file.

JS

$('.checked_medicines').each(function () {
    var val = $(this).val();
    var json  = JSON.parse(val);
    //json = {id: 12, text: گلی پیزاید}
    $(".select_medicines").select2('data',json);
});
Negar Javadzadeh
  • 325
  • 7
  • 11
  • I am not sure what's wrong but in your `processResult` you have not set `text` which will be display when any option is selected . i.e : Just add `text : obj.fa_name +" :"+obj.en_name` in your json here `return { id: obj.id,..` – Swati May 29 '21 at 05:50
  • Thanks @Swati but that part is for after select. and after select is works right. my problem is for before select. before select I want to have default select option and that default selected options dose not have text and this is wrong. – Negar Javadzadeh May 29 '21 at 07:10
  • Anyway, I tried the code you said, but it didn't work. @Swati – Negar Javadzadeh May 29 '21 at 07:12
  • 1
    If you are loading *option* from ajax call ..then , why you have added them in dom by defaults ? Try removing them(your options inside select-box) completely and setting selected value after ajax call.See [this](https://stackoverflow.com/a/27964808/10606400) should be helpful. – Swati May 29 '21 at 14:50
  • I tried this code but no option was selected. In the HTML section, I deleted the lines related to foreach and added this line . if(count($medicines_id) > 0) foreach($medicines_id as $k => $medicine_id) endforeach endif. And I added this code in the JavaScript file. $('.checked_medicines').each(function () {var val = $(this).val(); var json=JSON.parse(val); //json = {id: 12, text: گلی پیزاید} $(".select_medicines").select2('data',json); }); @Swati – Negar Javadzadeh May 30 '21 at 07:45
  • I edit my question and add these codes there – Negar Javadzadeh May 30 '21 at 07:45
  • 1
    Use `trigger('change');` as well after setting value . – Swati May 30 '21 at 13:19
  • Thank you @Swati . This part worked right on a similar project. But in this project, again, after adding the code you mentioned, it set the title only for the selected options, and the text of the option was displayed blank again. My last code after the correction was as follows. `var $newOption = $("").val("TheID").text("The text") $("#myMultipleSelect2").append($newOption).trigger('change');` – Negar Javadzadeh Jun 01 '21 at 05:10
  • Still not sure why that doesn't work . If i try creating jsfiddle for this its working there just fine . Is this online somehere or you can replicate that behaviour? – Swati Jun 01 '21 at 13:23

2 Answers2

2

I don't know if I understand you well. Are you trying to store JSON data inside the value attribute of the option tag?

<select class="form-control select_medicines" id="select_medicines" name="medicines[]" multiple="multiple">
    @foreach($medicines as $medicine)
        <option value='{{json_encode($medicine)}}' selected="selected">{{$medicine->fa_name . "(" . $medicine->en_name . ")"}}</option>
    @endforeach
</select>

Be careful to use single quotes on the value attribute to avoid mixing it with the dobleqoutes of the JSON string

Chico3001
  • 1,853
  • 1
  • 22
  • 43
  • 1
    Hi @Chico3001 Thanks for the reply. But for the value of these choices must be medicine -> id. And this part works right. The problem is that the text of the option is not displayed correctly and only the title is set. I edited my question. look at the second picture. default selected options must be like "select after search" – Negar Javadzadeh May 29 '21 at 05:41
1

after 4month I found my answer. the problem was in "formatRepoSelection" function for select 2. I must change it to

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

I had deleted the "repo.text" code and the problem was that the label was not displayed. Now after adding this part, the problem is solved.

Negar Javadzadeh
  • 325
  • 7
  • 11