Делаю 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');
}
Я также использую 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 будет действовать так, как будто все в порядке и не отображает ошибку прямо сейчас.
Вышесказанное работает для меня, так что, как только вы отрегулируете свои настройки, я уверен, что вы должны начать.
Я решил свою проблему. Я должен был сделать три вещи:
добавьте это к 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();
}
Спасибо, ребята, за ваши ответы, и надеюсь, что это поможет кому-то там!
Простой способ использования 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";
}
}