Я редактировал свой исходный вопрос, так как я уточнил свой код, который поставил меня в гораздо лучшем положении, чтобы определить лучшую ошибку
Привет, я создаю прикованный блок выбора, который когда клиент будет выбран, найдет проекты клиентов.
Ajax выполняет свою работу, он знает, какой клиент был выбран, и моя консоль сообщает мне следующее:
Failed to load resource: the server responded with a status of 500 (Internal Server Error) http://itempus.dev/task/clientsprojects?option=5
Вышеуказанное значение опции относится к идентификатору клиента, который я хочу передать в проекты db и найти проекты клиентов. Я не уверен, что я делаю неправильно, и буду признателен за помощь в несколько сложной задаче для новичков.
public function create() { $tasks = Auth::user()->tasks; $client_options = DB::table('clients')->orderBy('client_name', 'asc')->lists('client_name','id'); $team_options = DB::table('teams')->orderBy('team_member_name', 'asc')->lists('team_member_name','id', 'team_member_category'); return View::make('tasks.create', array('project_options' => $project_options, 'team_options' => $team_options, 'client_options' => $client_options)); } public function clientsprojects() { $input = Input::get('option'); $client_id = Project::find($input); $projects = DB::table('projects')->where('client_id', $client_id->id) ->orderBy('project_name') ->lists('id','project_name'); $models = $project->projects(); return Response::eloquent($models->get(array('id','project_name'))); }
{{ Form::open(array('action' => 'TaskController@store', 'id' => 'createuser')) }} <div class="form-group"> @if(count($client_options)>0) {{ Form::label('select_client', 'Assign to Client', array('class' => 'awesome client_option')); }} {{ Form::select('client', $client_options , Input::old('client'), array('class' => 'tempus_select client_option', 'id' => 'select_client')) }} @endif </div> <div class="form-group deletegates"> {{ Form::label('select_client', 'Assign to Project', array('class' => 'awesome')); }} {{ Form::select('project', array_merge(array('default' => 'Please Select')), 'default', array('class' => 'tempus_select', 'id' => 'project_select')) }} </div> {{ Form::submit('Create the task!', array('class' => 'btn btn-primary')) }} {{ Form::close() }} <script> $(document).ready(function($){ $('#select_client').change(function(){ $.get("{{ url('task/clientsprojects')}}", { option: $(this).val() }, function(data) { var model = $('#project_select'); model.empty(); $.each(data, function(index, element) { model.append("<option value='"+ element.id +"'>" + element.name + "</option>"); }); }); }); }); </script>
Route.php
Я также определил свой маршрут:
Route::get('task/clientsprojects', function(){ $input = Input::get('option'); $client_id = Project::find($input); $projects = DB::table('projects')->where('client_id', $client_id->id) ->orderBy('project_name') ->lists('id','project_name'); $models = $project->projects(); return Response::eloquent($models->get(array('id','project_name'))); });
Я предполагаю, что функция create в TaskController работает правильно и создает первое выпадающее меню для клиентов.
Когда это падение изменит значение, на сервер будет отправлен запрос на получение ajax, но вы получите 500 (Internal Server Error), потому что с вашими запросами что-то не так.
Поэтому давайте попытаемся это исправить.
Route::get('task/clientsprojects', function(){ // Get the option value which is the client_id $client_id = Input::get('option'); // Get all projects that have client_id = $client_id $projects = DB::table('projects') ->where('client_id', $client_id) ->orderBy('project_name') ->lists('id','project_name'); //Return the response to the client return Response::json($projects); });
Теперь ответ возвращается клиенту. Замените JavaScript следующим образом.
$(document).ready(function($){ $('#select_client').change(function(){ $.get("{{ url('task/clientsprojects')}}", { option: $(this).val() }, function(data) { var projects = $('#project_select'); projects.empty(); $.each(data, function(key, value) { projects .append($("<option></option>") .attr("value",key) .text(value)); }); }); }); });
И тебе хорошо идти.
Для этого вам нужен JavaScript (AJAX)
, в основном, элемент select имеет событие change
которое срабатывает при изменении любого значения, я имею в виду, если пользователь выбирает элемент, тогда происходит событие change
и вы должны объявить обработчик события change
в JavaScript
для вашего client
combo/select
element. Существует так много способов использования обработчика событий, например (ваш выбор должен содержать id как id='select_client'
):
window.onload = function(){ document.getElementById('select_client').onchange = function(){ // ... }; };
Или вы можете использовать addEventListener, и если вы используете библиотеку jQuery
то вы можете сделать это, используя что-то вроде этого:
$(function(){ $( "#select_client" ).change(function(e) { // ie '/get_progects/{clientId}' e.preventDefault(); var clients = $(this); $.getJson('yuordomain/get_projects/' + clients.val(), function(response){ // id = 'projects' for projects combo.select var projects = $('#projects'); projects.empty(); $.each('response.projects', function(k, v){ var option = $('<option/>', {'id':v.id, 'text':v.projectName}); projects.append(option); }); }); }); });
Это просто позволит получить данные (проекты в зависимости от выбранного клиента) с сервера, когда пользователь выбирает раскрывающийся список client
и для выполнения этой работы вам необходимо объявить маршрут для извлечения проектов dasta, например:
Route::get('/get_progects', function($client_id){ // I'm using a closure here but you should use a class method $projects = Project::where('client_id', $client_id) ->orderBy('project_name') ->lists('id','project_name'); return Response::json(compact('projects')); });
Это основная идея и надеюсь, что вы сможете реализовать ее в своем проекте сейчас.