I'm trying to keep the sort order for each article in the help center for my new site using Laravel 5, and with a few problems getting it to work. I use jQuery UI .sortable to place elements on the page, and since there will be several sections on the site where the areas will be sorted, my jQuery script is built in such a way that it has one script for all purposes. Therefore, the use of data-* attributes and route references.
Here is the code that I still have:
routes.php
Route::post('admin/help-centre/category/{category_id}/section/{section_id}/article/sort-order', ' AdminHelpCentreArticleController@sortOrder ');
AdminHelpCentreArticleController.php
public function sortOrder($category_id, $section_id) { return [ 'category_id' => $category_id, 'section_id' => $section_id ]; }
show.blade.php (list of articles for guidance)
<ul id="help-center-articles-sort" class="sortable"> @foreach ($helpCentreArticles as $helpCentreArticle) <li class="sortable-element" data-sortable-element-id="{{ $helpCentreArticle->id }}"> <a href="{{ action(' AdminHelpCentreArticleController@show ', array($helpCentreCategory->id, $helpCentreSection->id, $helpCentreArticle->id)) }}" target="_self">{{ $helpCentreArticle->title }}</a> </li> @endforeach </ul> <a href="{{ $helpCentreSection->id }}/article/sort-order" target="_self" class="button bm-remove w-full sortable-save" data-sortable-id="help-center-articles-sort">Save Order</a>
scripts.js (includes CSRF token _token )
var csrfToken = $('meta[name="csrf-token"]').attr('content'); $.ajaxPrefilter(function(options, originalOptions, jqXHR) { if (options.type.toLowerCase() === 'post') { options.data += options.data?'&':''; // add leading ampersand if `data` is non-empty options.data += '_token=' + csrfToken; // add _token entry } }); $(document).ready(function() { $('.sortable').sortable(); $('.sortable-save').on('click', function(e) { e.preventDefault(); var route = $(this).attr('href'), sortableID = $(this).attr('data-sortable-id'); var data = $('#' + sortableID + ' .sortable-element').map(function() { return $(this).attr('data-sortable-element-id'); }).get(); $.ajax({ type: 'POST', url: route, dataType: 'json', data: { id_array: data }, success: function(data) { console.log(data); }, error: function(data) { console.log(data); }, }); }); });
Everything still works in terms of a response in the console, which is Object {category_id: "1", section_id: "1"} . But no matter what I try, I can not pass the data card to the controller to use it.
I tried a bunch of guesses, since I cannot find any decent AJAX tutorial in Laravel 5 anywhere, and I tried things like adding the $data parameter to the sortOrder() method, I tried Input::all() and Request::all , but all this returns errors (I assume this is not the actual form?).
Once I get the data that will be passed to the controller, I can easily save the sort order in the database. But I canβt get to this stage, any ideas?
EDIT
I should probably point out that I have a HelpCentreArticle model and a HelpCentreArticleRequest request, here are some of the code from each file, if they are also needed:
HelpCentreArticle.php
class HelpCentreArticle extends Model { protected $fillable = [ 'category_id', 'section_id', 'title', 'content', 'excerpt', 'is_visible', 'sort_order', 'created_by', 'updated_by', ]; }
HelpCentreArticleRequest.php
class HelpCentreArticleRequest extends Request { public function authorize() { return true; } public function rules() { $rules = [ 'title' => 'required|min:3', 'content' => 'required|min:10', ]; return $rules; } }
I was not sure that I needed to add HelpCentreSectionRequest $request as the last parameter of the sortOrder() method, so I could use $request->all() , but it just returns 422 (Unprocessable Entity) to the console log.