Laravel редактирование формы
В общем, я делаю мини-прилку которая пока что может добавлять товары, выводить список товаров, выводить один товар и последнее - редактировать, то , в чем у меня проблемы. Собественно, у меня есть контроллер он должен быть рабочий, но в нем даже если и есть ошибка, до нее дело не дошло. У меня есть несколько вариантов JS кода, один через ajax(через него должно редактироваться как и сама форма, так и теги) , второй просто через добавление класса и отправление запроса на сервер на удаление атрибута с классом todelete, и просто форма отправляется. Так вот, оно не работает, вообще. При нажатии на кнопку "сохранить изменения" не происходит ничего, кроме выполнения JS кода(логи пишут). Что-ж , дальше я кину код. Вот мой контроллер(в нем набросано все, но это только для тестов)
``` <?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use App\Models\Product;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class ProductController extends BaseController
{
public function isedit($id)
{
// Проверяем, залогинен ли пользователь
if (auth()->guest()) {
// Если пользователь не залогинен, перенаправляем его на страницу регистрации
return redirect('/register');
}
$product = Product::find($id);
// Проверяем, имеет ли пользователь право редактировать этот продукт
if ($product->user_id != auth()->id() && auth()->user()->role != 'admin') {
// Если пользователь не является владельцем продукта и не является администратором, перенаправляем его обратно на страницу продукта
return redirect('/product/' . $id)->with('error', 'У вас нет прав для редактирования этого продукта.');
}
if ($product) {
return view('edit_product', ['product' => $product]);
} else {
return redirect('/')->with('error', 'Product not found.');
}
}
public function indexOfProducts()
{
$statuses = [
'available' => 'Доступен',
'unavailable' => 'Недоступен'
];
$products = Product::all();
return view('products_list', ['products' => $products,'statuses'=>$statuses]);
}
public function get()
{
$products = Product::available()->get();
$users = User::where('role','user')->get();
return response()->json([
'products' => $products,
'users' => $users
]);
}
public function showProduct($id)
{
$product = Product::with('attributes')->find($id);
$statuses = [
'available' => 'Доступен',
'unavailable' => 'Недоступен'
];
if ($product) {
return view('show_product', ['product' => $product,'statuses'=>$statuses]);
} else {
return redirect('/')->with('error', 'Продукт не найден.');
}
}
public function update(Request $request, $id)
{
$product = Product::find($id);
// Обновляем продукт с помощью данных из $request
$product->name = $request->name;
$product->status = $request->status;
// Обновляем атрибуты продукта
foreach ($request->attributes as $attributeData) {
$attribute = \App\Models\Attribute::find($attributeData['id']);
if ($attribute) {
$attribute->name = $attributeData['name'];
$attribute->value = $attributeData['value'];
$attribute->save();
}
}
// Удаляем атрибуты, помеченные для удаления
foreach ($request->toDelete as $attributeId) {
$attribute = \App\Models\Attribute::find($attributeId);
if ($attribute) {
$attribute->delete();
}
}
$product->save();
return redirect('/product/' . $id);
}
public function deleteAttribute(Request $request, $id)
{
$attribute = \App\Models\Attribute::find($id);
// Проверяем, существует ли атрибут
if (!$attribute) {
return response()->json(['error' => 'Атрибут не найден.'], 404);
}
// Удаляем атрибут
$attribute->delete();
// Возвращаем ответ в формате JSON с сообщением об успехе
return response()->json(['success' => 'Атрибут успешно удален.']);
}
} ```
вот мои роуты
``` <?php
use App\Http\Controllers\ProfileController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProductAddController;
use App\Http\Controllers\ProductsViewController;
use App\Http\Controllers\ProductUpdateController;
use App\Http\Controllers\ProductAttributeController;
use App\Http\Controllers\ProductController;
Route::get('/product',[ProductController::class, 'indexOfProducts'])->name('product');
Route::get('/', [ProductController::class, 'indexOfProducts']);
Route::post('/add', [ProductAddController::class, 'addProduct'])->middleware('auth')->name('add');
Route::get('/add', [ProductAddController::class, 'showForm']);
Route::get('/product/{id}', [ProductController::class, 'showProduct'])->name('show_product');
Route::get('/product/{id}/edit', [ProductController::class, 'isedit']);
Route::put('/product/{id}/edit', [ProductController::class, 'update']);
Route::delete('/product/attribute/{id}', [ProductController::class, "deleteAttribute"]);
Route::get('/add', function () {
return view('add_product');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
});
require __DIR__.'/auth.php'; ```
первый вариант JS кода, через ajax ``` $(document).ready(function() {
var attributeIndex = 0;
$(document).on('click', '#add-attribute', function() {
$('#attributes').append(`
<div class="attribute">
<div class="fields">
<label for="attributes[${attributeIndex}][name]">Имя атрибута:</label><br>
<input type="text" id="attributes[${attributeIndex}][name]" name="attributes[${attributeIndex}][name]"><br>
<label for="attributes[${attributeIndex}][value]">Значение атрибута:</label><br>
<input type="text" id="attributes[${attributeIndex}][value]" name="attributes[${attributeIndex}][value]"><br>
</div>
<button type="button" class="delete-attribute">X</button>
</div>
`);
attributeIndex++;
});
$(document).on('click', '.delete-attribute', function() {
$(this).parent().addClass('todelete');
});
$('#save-changes-button').click(function(event) {
console.log('Button clicked');
var button = $(this); // Сохраняем ссылку на кнопку
if ($('.todelete').length > 0) {
console.log('Найдены атрибуты, помеченные для удаления');
$('.todelete').each(function() {
var attributeId = $(this).data('id');
console.log('1 st: ' + attributeId)
});
} else {
// Если нет атрибутов, помеченных для удаления, просто отправляем форму
console.log('Нет атрибутов, помеченных для удаления. Отправка формы...');
button.closest('form').submit();
}
});
});```
и второй, попроще
``` $(document).ready(function() { var attributeIndex = 0;
$(document).on('click', '#add-attribute', function() {
$('#attributes').append(`
<div class="attribute">
<div class="fields">
<label for="attributes[${attributeIndex}][name]">Имя атрибута:</label><br>
<input type="text" id="attributes[${attributeIndex}][name]" name="attributes[${attributeIndex}][name]"><br>
<label for="attributes[${attributeIndex}][value]">Значение атрибута:</label><br>
<input type="text" id="attributes[${attributeIndex}][value]" name="attributes[${attributeIndex}][value]"><br>
</div>
<button type="button" class="delete-attribute">X</button>
</div>
`);
attributeIndex++;
});
$(document).on('click', '.delete-attribute', function() {
$(this).parent().addClass('todelete');
});
$('#save-changes-button').click(function() {
console.log('Button clicked');
var button = $(this); // Сохраняем ссылку на кнопку
if ($('.todelete').length > 0) {
console.log('Найдены атрибуты, помеченные для удаления');
$('.todelete').each(function() {
var attributeId = $(this).data('id');
console.log('1 st: ' + attributeId)
});
} else {
// Если нет атрибутов, помеченных для удаления, просто отправляем форму
console.log('Нет атрибутов, помеченных для удаления. Отправка формы...');
button.closest('form').submit();
}
});
}); ```
так, ну и блейд страницы
``` <x-app-layout>
<header>
<link href="{{ asset('css/editPage.css') }}" rel="stylesheet">
<meta name="csrf-token" content="{{ csrf_token() }}">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</header>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
{{ __('Edit Product') }}
</h2>
</x-slot>
<body>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 text-gray-900 dark:text-gray-100">
<div>
<h2>Редактировать продукт</h2>
<form method="POST" action="/product/{{ $product->id }}/edit">
@csrf
@method('PUT')
<label for="article">Артикул:</label><br>
<input type="text" id="article" name="article" value="{{ $product->article }}" disabled><br>
<label for="name">Название:</label><br>
<input type="text" id="name" name="name" value="{{ $product->name }}" required minlength="10"><br>
<label for="status">Статус:</label><br>
<select id="status" name="status" required>
<option value="available" {{ $product->status == 'available' ? 'selected' : '' }}>Доступен</option>
<option value="unavailable" {{ $product->status == 'unavailable' ? 'selected' : '' }}>Недоступен</option>
</select><br>
@foreach ($product->attributes as $index => $attribute)
<div class="attribute" id="attribute-{{ $attribute->id }}" data-id="{{ $attribute->id }}">
<div class="fields">
<!-- Добавьте это скрытое поле -->
<input type="hidden" name="attribute_ids[]" value="{{ $attribute->id }}">
<label for="attributes[{{ $index }}][name]">Имя атрибута:</label><br>
<input type="text" id="attributes[{{ $index }}][name]" name="attributes[{{ $index }}][name]" value="{{ $attribute->name }}"><br>
<label for="attributes[{{ $index }}][value]">Значение атрибута:</label><br>
<input type="text" id="attributes[{{ $index }}][value]" name="attributes[{{ $index }}][value]" value="{{ $attribute->value }}"><br>
</div>
@if (auth()->id() == $product->user_id && auth()->user()->role == 'user')
<button type="button" class="delete-attribute" data-id="{{ $attribute->id }}">✖</button>
<button type="button" class="cancel-delete" data-id="{{ $attribute->id }}" style="display: none;">Отменить удаление</button>
<form method="POST" action="/product/attribute/{{ $attribute->id }}" id="delete-form-{{ $attribute->id }}" style="display: none;">
@csrf
@method('DELETE')
</form>
@endif
</div>
@endforeach
<div id="attributes" class="attribute-container">
<!-- Здесь будут добавляться поля для атрибутов -->
</div>
@if (auth()->id() == $product->user_id && auth()->user()->role == 'user')
<button type="button" id="add-attribute">Добавить атрибут</button><br>
@endif
<input id="save-changes-button" style="cursor:pointer" type="submit" value="Сохранить изменения">
</form>
</div>
</div>
</div>
</div>
</div>
<script src="{{ asset('scripts/JSeditPage.js') }}"></script>
</body>
</x-app-layout>```
, если надо скинуть это в зипак- скину, надо залить на гит - залью, только прощу помочь, мне нужен либо работающий метод редактирования, либо понять как исправить мой код, сейчас просто удаление атрибутов это отдельная функция, т.к в таблице атрибуты отдельно, и передаются через массив, соответственно я и поставил их отдельно. Если что-то не достает, пишите, скину быстро как смогу