Изменение динамического состояния с помощью x-editable в laravel

у меня есть кнопка выбора, где я выбираю статус для своих записей. Этот статус происходит от statuses таблица, и это не столбец в каждой таблице (это общий вариант). Что я хочу сделать, так это изменить status_id столбец в моих таблицах с помощью х-редактируемые но я не знаю, как получить мои динамические данные в JavaScript.

вот моя текущая форма, чтобы показать статусы в индексной странице моих отзывов, например:

 <form action="{{route('updatebyajax', $rating->id)}}" method="post">
    {{csrf_field()}}
       <td class="text-center" style="width:100px;">
          <select class="form-control status" name="status_id">
            @foreach($statuses as $status)
              <option id="rating" class="rating" data-url="{{ route('updateratebyajax', $rating->id) }}" data-pk="{{ $rating->id }}" data-type="select" data-placement="right" data-title="Edit Rate" value="{{$status->id}}">{{$status->title}}</option>
           @endforeach
        </select>
    </td>
 </form>

так что мне нужно в основном получить информация из statuses таблица и изменение по select.

dropdown

обновление

по запросу вот мой скриншот таблицы:

table image

PS: вот пример кнопки выбора по умолчанию: пример ссылки

<a href="#" id="status" data-type="select" data-pk="1" data-url="/post" data-title="Select status"></a>
<script>
$(function(){
    $('#status').editable({
        value: 2,    
        source: [
              {value: 1, text: 'Active'},
              {value: 2, text: 'Blocked'},
              {value: 3, text: 'Deleted'}
           ]
    });
});
</script>

обновление 2

Обзор Базы Данных reviews

статус Таблица status

обновление 3

я просто добавляю свой метод контроллера и маршрут в случае

контроллер

public function updatebyajax(Request $request, $id)
  {
    return Rating::find($id)->update([
      'status_id' => $request->get('status_id'),
    ]);
  }

маршрут

Route::post('/updatebyajax/{id}', 'RatingController@updatebyajax')->name('updatebyajax');

обновление 4

я смешал несколько решений в интернете, пока я, наконец, получить status 200 OK в моей сети, но все равно ничего не меняется в моей базе данных, вот мой текущий коды:

controller

public function updatebyajax(Request $request, $id)
  {
    if (request()->ajax())
        {
            $ratings = DB::table('ratings')->select('status_id','id')->where('status_id', '=', $id)->get();
            return Response::json( $ratings );
        }
  }

AJAX

<script type="text/javascript">
$(".status").change(function() {
    $.ajax({
        type: "post", // for edit function in laravel
        url: "{{url('admin/updatebyajax')}}" + '/' + $(this).val(), // getting the id of the data
        data: {_token: "{{ csrf_token() }}",status: this.value }, //passing the value of the chosen status
        dataType: 'JSON',
        success: function (data) {
            console.log('success');
        },
        error: function (data) {
            console.log('error');
        }
    });
});
</script>

FORM

<form action="{{route('updatebyajax', $rating->id)}}" method="post">
                             {{csrf_field()}}
                              <td class="text-center" style="width:100px;">
                                <select id="{{ $rating->id }}" class="form-control status" name="status_id">
                                  @foreach($statuses as $status)
                                    <option value="{{$status->id}}">{{$status->title}}</option>
                                  @endforeach
                                </select>
                              </td>
                          </form>

обновление 5

в отношении leih ответ в настоящее время у меня есть это:

Controller

public function updatebyajax(Request $request, $id)
  {
    // Note: should probably use a $request->has() wrapper to make sure everything present

    try {
        // you can also use the ID as a parameter, but always supplied by x-editable anyway
        $id = $request->input('pk');
        $field = $request->input('name');
        $value = $request->input('value');

        $rating = Rating::findOrFail($id);
        $rating->{$field} = $value;
        $rating->save();
    } catch (Exception $e) {
        return response($e->getMessage(), 400);
    }
  }

Route

Route::post('/updatebyajax', 'RatingController@updatebyajax')->name('updatebyajax');

Blade

//Select
<a
  href="#"
  class="status"
  data-type="select"
  data-pk="{{ $rating->id }}"
  data-value="{{ $rating->status_id }}"
  data-title="Select status"
  data-url="{{ route('updatebyajax') }}"
></a>

//JS

<script type="text/javascript">

$.ajaxSetup({
      headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
      }
  });

$(function() {
    $('.status').editable({
      type:"select",
        source: [
            @foreach($statuses as $status)
                { value: {{ $status->id }}, text: {{ $status->title }} }
            @endforeach
        ],
    });
});
</script>

и вот результат, который я получаю:

screenshot5

PS: Если я не использую $.ajaxSetup({ headers: {.... и использовать java код в ответ я получу эту ошибку

ошибка синтаксического анализа: синтаксическая ошибка, неожиданный ','

есть идеи??

2 ответов


при использовании X-edtiable с <select> вариант, это хорошо, чтобы посмотреть на документация, но лучше посмотреть официальные примеры и проверяем FAQ для чего нужен задний конец. Вам не нужно создавать свои собственные формы или писать свои собственные запросы AJAX с возможностью редактирования X (в этом весь смысл). Основываясь на том, что вы спрашиваете, похоже, что код должен выглядеть похожим на это:

RatingController

public function UpdateByAjax(Request $request)
{
    // Note: should probably use a $request->has() wrapper to make sure everything present

    try {
        // you can also use the ID as a parameter, but always supplied by x-editable anyway
        $id = $request->input('pk');
        $field = $request->input('name');
        $value = $request->input('value');

        $rating = Rating::findOrFail($id);
        $rating->{$field} = $value;
        $rating->save();
    } catch (Exception $e) {
        return response($e->getMessage(), 400);
    }

    return response('', 200);
}

маршрут

Route::post('/updatebyajax', 'RatingController@UpdateByAjax')->name('updatebyajax');

посмотреть

примечание: Я не устанавливаю токен CSRF ниже, поскольку он уже должен быть установлен глобально для X-editable (например, для текстовых полей на скриншоте), если это необходимо, или через какой-либо другой механизм.

<a
  href="#"
  class="status"
  data-type="select"
  data-pk="{{ $rating->id }}"
  data-name="status_id"
  data-value="{{ $rating->status_id }}"
  data-title="Select status"
  data-url="{{ route('updatebyajax') }}"
></a>
<script>
$(function() {
    // using class not id, since likely used with multiple records
    $('.status').editable({
        // Note: cleaner to format in the controller and render using the @json directive
        source: [
            @foreach($statuses as $status)
                { value: '{{ $status->id }}', text: '{{ $status->title }}' }
                @unless ($loop->last)
                    ,
                @endunless
            @endforeach
        ]
    });
});
</script>

дополнительная ссылка: см. "рендеринг JSON" в отображение документации Data blade


Я думаю, что это будет полезно для вас.

  • поместите идентификатор значения, которое вы хотите изменить, в идентификатор окна выбора
  • функция ajax в jquery

    $(".status").change(function() {
        $.ajax({
            type: "PUT", // for edit function in laravel 
            url: "{{url('updatebyajax')}}" + '/' + this.id, // getting the id of the data 
            data: {_token: "{{ csrf_token() }}",status: this.value }, //passing the value of the chosen status
            dataType: 'JSON',
            success: function (data) {
                // some kind of alert or console.log to confirm change of status
            },
            error: function (data) {
                // error message
            }
        });
    });
    

надеюсь, что это помогает