在laravel

时间:2018-06-04 02:44:42

标签: ajax laravel jquery-ui jquery-ui-sortable

我尝试为我的类别设置可排序功能,并且我使用JQuery UI

逻辑

  1. 如果类别category_id为空,则表示该类别为父级。 (就我而言,我只使用category_id代替parent_id 不同的命名)
  2. 类别最大2深,如Parent->child 1->child 1 childs
  3. 我尝试做什么

    当我通过Ajax删除其中一个类别时,

    更新category_id

    问题

    1. 我在网络上收到404错误
    2. 我的功能不支持null category_id
    3. @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:我发现我category_id中的li's数据丢失了   之所以我没有说这是因为我不知道该如何使用   确切地说,就像我之前在我的问题中提到的那样,我的功能并没有   支持(所以我需要你的帮助)。

      screenshot

      screen1 感谢。

2 个答案:

答案 0 :(得分:1)

可能是因为你没有保护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个id,所以我想你要做的就是根据父级进行排序,因此你应该只选择父级的li,这样你的控制器就会收到1个id而不是2,因为你现在正在做的是/categorysort/{parentId}/{childId},你需要的是/categorysort/{id},所以不要选择所有类别,只需选择顶级父类别:

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

答案 1 :(得分:1)

看到您对encodeURI(itemID)的评论后,我知道您的问题是route.php

  

我在网络上收到404错误

您需要使用optional parameters更新路线:

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?}

  

我的函数不支持null 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..
}