x-editable на laravel: изменения не видны

Делаю x-editable снимок с моего сайта Laravel 5.1. У меня есть список текстовых заголовков, перечисленных в виде строк таблицы. Я следовал за документацией. Я вижу всплывающую форму редактирования текстового поля, когда я нажимаю на заголовок. Я изменяю текст и отправляю. Всплывающее окно исчезает, как и ожидалось, новый текст показывает. Но база данных не была обновлена. Я удостоверился, что установил data-url к действию публикации, в котором я нуждаюсь. Обязательно добавьте маршрут для него. Убедитесь, что в моем контроллере есть метод для обработки запроса, обновления базы данных и перенаправления (не уверен, если перенаправление необходимо). Вот фрагмент из одной строки, я жестко закодировал название и его идентификатор для простоты.

<a href="#" class="task-editable-name" id="task-editable-name" data-type="textarea" data-url="/task/2/edit" data-title="">Solve x-editable bug</a>


$(document).ready(function() {
$.fn.editable.defaults.mode = 'popup';

$('.task-editable-name').editable({
placement: 'bottom',
rows: 3
});
});


Route::post('/task/{task}/edit', 'TaskController@edit');


public function edit(Request $request, Task $task)
{
$task->name = $request['value'];
$task->save();
return redirect('/tasks');
}

1

Решение

Я также использую Laravel 5.1 с x-editable, и вот как я добиваюсь своих обновлений, чтобы вы могли найти какое-то применение в вашей проблеме:

Ссылка на сайт:

<div class="myupdate">
<a data-name="database_column_name" href="#" data-type="text" data-url="update-row" data-pk="1" class="pUpdate" data-title=""></a>
</div>

Маршрут:

Route::post('update-row', 'HomeController@updateRow');

контроллер:

public function updateRow(Request $request)
{
// get database row id
$pk = $request->input('pk');

// get column name
$col = $request->input('name');

// get new value
$value = $request->input('value');

// get id row of line item and edit/save
if ($finditem = Items::where('id', $pk)->update([$col => $value]))
{
return \Response::json(array('status' => 1));
}
else
{
return \Response::json(array('status' => 0));
}
}

JQuery:

$(document).ready(function(){
$.fn.editable.defaults.mode = 'popup';
$('.myupdate').editable({
selector: '.pUpdate',
validate: function(value) {
if($.trim(value) == '') {
return 'Value is required.';
}
},
placement: 'top',
send:'always',
ajaxOptions: {
dataType: 'json'
}
});
});

Как сказал Джеймс, вы проверяли, указан ли столбец, который вы пытаетесь обновить, под массивом $ fillable в вашей табличной модели?

Модель таблицы базы данных:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Items extends Model {

protected $connection = 'mysql';
protected $primaryKey = 'id';
protected $table = 'items_table';
protected $fillable = array(
'name',
'description',
'quantity'
);

public $timestamps = true;

}

Можете ли вы открыть свои инструменты разработчика браузеров, чтобы отслеживать, есть ли какие-либо ошибки, появляющиеся во время всего этого?

Я нахожу это странным, что x-editable будет действовать так, как будто все в порядке и не отображает ошибку прямо сейчас.

Вышесказанное работает для меня, так что, как только вы отрегулируете свои настройки, я уверен, что вы должны начать.

2

Другие решения

Я решил свою проблему. Я должен был сделать три вещи:

добавьте это к js, который обрабатывает x-editable:

$.fn.editable.defaults.send = "always";

включите следующую мета и скрипт для документации laravel:

<meta name="csrf-token" content="{{ csrf_token() }}" />
<script type="text/javascript">
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>

получить доступ к значению x-editable напрямую из $ request в моем контроллере:

public function edit(Request $request, Task $task)
{
$task->name = $request->value; // instead of $request->input('value')
$task->save();
}

Спасибо, ребята, за ваши ответы, и надеюсь, что это поможет кому-то там!

1

Простой способ использования xeditable с laravel

HTML

<link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/jqueryui-editable/css/jqueryui-editable.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/jqueryui-editable/js/jqueryui-editable.min.js"></script>

<div id="_token" class="hidden" data-token="{{ csrf_token() }}"></div>
<a href="#" id="industryName" data-type="text" data-pk="{{ $industry->id }}" data-title="Edit industry">{!! $industry->name !!}</a>

Javascript

    $(document).ready(function() {

$.fn.editable.defaults.mode = 'inline';

$.fn.editable.defaults.params = function (params)
{
params._token = $("#_token").data("token");
return params;
};

$('#industryName').editable({
validate: function(value) {
if($.trim(value) == '')
return 'Value is required.';
},
type: 'text',
url:'/updateIndustry',
send:'always',
ajaxOptions: {
dataType: 'json'
}

} );
} );

маршрут Ларавель

Route::post('/updateIndustry',  'SettingsController@updateIndustry');

контроллер Laravel

public function updatePosition(Request $request)
{
$id= $request->pk;
$position = $request->value;

$count = DB::table('designations')->whereRAW("position LIKE '%".$position."%'")->where('id','!=',$id)->count();
if($count)
echo "Similar position exists.";

else
{
DB::table('designations')->where('id',$id)->update(['position' => $position]);
echo "1";
}
}
1
По вопросам рекламы [email protected]