Сортируемый по нулевому идентификатору в laravel - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь сделать сортируемую функцию для своих категорий и использую JQuery UI

Логика

  1. Если категория category_id равна нулю, это означает, что категория является родительской.(в моем случае я использовал category_id вместо parent_id просто другое именование)
  2. Категории идут максимум на 2 глубины, как Parent->child 1->child 1 childs

Что я пытаюсь сделать

обновить category_id столбец, когда я перетаскиваю одну из моих категорий по Ajax

Проблемы

  1. Я получаю 404 ошибку в сети
  2. Моя функция не поддерживает нуль category_id

Коды

@foreach($Categorys as $cat)
//parent (deep 0)
<li class="parent" id="{{$cat->id}}">
{{$cat->title}}

//first child (deep 1)
@if(count($cat->childs))
@foreach($cat->childs as $child)
<li style="margin-left:20px !important;" class="firstchild" id="{{$child->id}}">
{{$child->title}}

//first child child (deep 2)
@if(count($child->childs))
@foreach($child->childs as $childdd)
<li style="margin-left:40px !important;" class="secondchild" id="{{$childdd->id}}">
{{$childdd->title}}
</li>
@endforeach

@endif
</li>
@endforeach

@endif
</li>
@endforeach

Ajax

$(function() {
    $('.mytest').sortable({
        stop: function() {
            $.map($(this).find('li'), function(el) {
                var itemID = el.id;
                var itemIndex = $(el).index();


                if (itemID) {
                    $.ajax({
                        url: '{{ url('
                        categorysort ') }}/' + encodeURI(itemID),
                        type: 'POST',
                        dataType: 'json',
                        data: {
                            itemID: itemID,
                            itemIndex: itemIndex
                        },
                    });
                } else {
                    console.log(data);
                }

            });
        }
    });
});

route

Route::post('/categorysort/{id}','CategoryController@UpdatecategoryparentByAjax')->name('categorysort');

controller

public function UpdatecategoryparentByAjax(Request $request, $id)
    {
      $categories = Category::orderby('id', 'desc')->get();

      $itemID = $request->input('itemID');
      $itemIndex = $request->input('itemIndex');

      foreach ($categories as $category) {
        $category->where('id', $itemId)->update([
          'category_id' => $itemIndex,
        ]);
      }
    }

PS: я знаю, что в моих li's отсутствуют данные category_id, причина, по которой я их не указал, потому что я не сделалЯ не знаю, как правильно его использовать, как я уже упоминал ранее в своих выпусках, моя функция этого еще не поддерживает (поэтому мне нужна ваша помощь, пожалуйста).

screenshot

screen1 Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

После просмотра ваших комментариев о encodeURI(itemID) я знаю, что проблема в вашем route.php.

Я получаю 404 ошибку в сети

Вам нужночтобы обновить маршрут с необязательными параметрами :

Route::post(
    // Add {second_id?}. This is an "optional parameter".
    'categorysort/{first_id}/{second_id?}', 
    'CategoryController@UpdatecategoryparentByAjax'
)->name('categorysort');

Итак, вы можете получить доступ к:

  • mydomain.test/categorysort/1
  • mydomain.test/categorysort/1/2

Если вам нужно 3 id, добавьте еще необязательных параметров , например:

Route::post(
    'categorysort/{first_id}/{second_id?}/{third_id?}', 
    'CategoryController@UpdatecategoryparentByAjax'
)->name('categorysort');

Итак, вы можете получить доступ:

  • mydomain.test/categorysort/1
  • mydomain.test/categorysort/1/2
  • mydomain.test/categorysort/1/2/3

Если вы хотите сделать first_id, сделайтето же самое, просто добавьте ? после first_id как {first_id?}.


Моя функция не поддерживает нулевой category_id

После обновления вашего маршрутаВам просто нужно позвонить:

public function UpdatecategoryparentByAjax(Request $request, $first_id, $second_id, $third_id)
{
    // $first_id      access your 1st ID
    // $second_id     access your 2nd ID 
    // $third_id      access your 3rd ID

    // Do some logic here..
}
0 голосов
/ 09 июня 2018

Это может быть связано с тем, что вы не защищаете agaisnt csrf, что является обязательным при выполнении пост-запроса, поэтому laravel docs объясняет, что вы можете решить, добавив это в html:

<meta name="csrf-token" content="{{ csrf_token() }}">

Тогда в вашем ajax вам нужно будет только добавить его в качестве заголовка.

$.ajax({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
        url: '/categorysort/'+ itemID ,
        type: 'POST',
        dataType: 'json',
        data: {itemID: itemID, itemIndex: itemIndex},
      });

Также вы получаете только 1 идентификатор, поэтому я предполагаю, что вы пытаетесь сделать сортировку в зависимости отродительский, поэтому вы должны выбрать li только с родительским классом, таким образом ваш контроллер получит 1 идентификатор вместо 2, потому что сейчас вы делаете /categorysort/{parentId}/{childId}, а вам нужно /categorysort/{id}, поэтому вместовыбрав все категории, просто выберите верхние родительские категории:

$.map($(this).find('.parent'), function(el)
...