Параметры обновления выбирают атрибуты в соответствии с другим тегом выбора с помощью Ajax и Laravel?

У меня есть тег выбора и ряд параметров выбора атрибутов с их значениями и внутренним текстом, хранящимися в базе данных.

Вот так я отображаю данные в представлении, вызывая foreach для каждого тега select, всего 2:

{!! Form::label('category_id', 'Category:') !!}
<select class="form-control category_id" name="category_id">
    @foreach($categories as $category)
        <option value='{{ $category->id }}'> {{ $category->name }}</option>
    @endforeach
</select>

{!! Form::label('subcategory_id', 'Subcategory:') !!}
<select class="form-control" name="subcategory_id" label="Subcategory">
    @foreach($subcategories as $subcategory)
        <option value='{{ $subcategory->id }}'> {{ $subcategory->name }}</option>
    @endforeach
</select>

Проблема в том, что я застрял со следующей идеей: категория и подкатегория находятся во взаимосвязи один-ко-многим, это означает, что когда пользователь нажимает определенную категорию, выбранная подкатегория должна заполняться только значениями, связанными с категорией. выбрал.

Как мне найти решение этой проблемы? Я думаю о создании запроса ajax, но не могу понять, как заполнить атрибуты выбора опции. Или создайте переменную JSON (вся работа над интерфейсом) для хранения подкатегорий и просто обновите тег select в соответствии с тем, какую категорию выбрал пользователь.

Любая помощь будет оценена.

РЕШЕНИЕ:

ПРОСМОТР:

{!! Form::label('category_id', 'Category:') !!}
<select class="form-control" id="categories" name="category_id">
    @foreach($categories as $category)
        <option value='{{ $category->id }}'> {{ $category->name }}</option>
    @endforeach
</select>

<div id="displayCategories" style="display:none">
    {!! Form::label('subcategory_id', 'Subcategory:') !!}
    <select class="form-control" id="subcategories" name="subcategory_id" label="Subcategory">
        @foreach($subcategories as $subcategory)
            <option value='{{ $subcategory->id }}'> {{ $subcategory->name }}</option>
        @endforeach
    </select>
</div>

JS, JQUERY и AJAX:

<script
 src="https://code.jquery.com/jquery-3.1.1.js"
 integrity="sha256-16cdPddA6VdVInumRGo6IbivbERE8p7CQR3HzTBuELA="
 crossorigin="anonymous"></script>

<script>
$('#categories').on('change',function(e) {
    var cat_id = e.target.value;
    //ajax
    $.ajax({
        url: '../ajax-subcat/{cat_id}', //note:that the path can be different for different purpose used, in a simple page -> '/ajax-subcat/{cat_id}' so use the console of your browser
        type: 'GET',
        data: {cat_id : cat_id},
        success: function(response)
        {
            $('#subcategories').empty();
            $('#displayCategories').show();
            $.each(response, function(index, subcatObj) {
                $('#subcategories').append('<option value="' + subcatObj.id + '">' + subcatObj.name + '</option>');
                console.log(subcatObj);
            });
        }
    });
});
</script>

МАРШРУТ:

Route::get('ajax-subcat/{cat_id}', 'PostController@getAjax');

КОНТРОЛЛЕР:

public function getAjax() 
{
   $cat_id = Input::get('cat_id');
   $subcategories = Subcategory::where('category_id', '=', $cat_id)->get();
   return Response::json($subcategories);
}

Не забудьте ввести в контроллер соответствующие модели фасадов для Input и Response. В моем случае:

use Illuminate\Support\Facades\Input;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response;
use App\Category;
use App\Subcategory;

person DomainFlag    schedule 26.01.2017    source источник


Ответы (1)


Вы не упоминаете версию Laravel, которую используете, поэтому реализация может немного отличаться. Вы можете сделать это с помощью метода ajax. Вы можете заглянуть в Axios для вызовов внешнего интерфейса, но вам нужно будет настроить прослушиватели событий в элементе select для когда пользователь делает новый выбор.

person Flyingearl    schedule 26.01.2017
comment
Последняя версия Laravel, 5.4 - person DomainFlag; 26.01.2017