Как я могу отправить данные в эту форму Laravel через AJAX?

Я делаю приложение Laravel 8 с сообщения и категории постов. Сейчас я работаю над формой Редактировать пост, и мне нужно предварительно заполнить ее текущими данными сообщения.

Столбец id в таблице catergories является внешним ключом category_id в таблице posts.

В Модель постов у меня есть:

class Posts extends Model {
   use HasFactory;
    
    protected $fillable = [
        'title',
        'category_id',
        'description',
        'body'
    ];
}

Маршрут Route::get('/dashboard/posts/edit/{id}', [PostsController::class, 'editPost']).

Метод editPost в контроллере:

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Posts;

class PostsController extends Controller {

    // More code

    public function editPost($id) {

        $post = Posts::select (
            "posts.id",
            "posts.title",
            "posts.description",
            "posts.body",
            "catergories.name as category_name"
            )
            ->leftJoin("catergories", "posts.category_id", " = ", "catergories.id")
            ->where('posts.id', $id)
            ->first();

            echo $post->title . '<br>';
            echo $post->category_name . '<br>';
    }
}

В виде:

<input type = "hidden" id = "post_id" value = "">

<div class = "form-group mb-2 @error('title') has-error @enderror"> 
        <label for = "title" class = "text-muted">Title</label>       
        <input id = "title" type = "text" name = "title" placeholder = "Title" value = "{{ old('title', $post->title) }}" class = "form-control @error('title') is-invalid @enderror" autofocus>

        @error('title')<span class = "error-msg">{{ $message }}</span>@enderror
    </div>

    <div class = "form-group mb-2 @error('category_id') has-error @enderror">
        <label for = "category" class = "text-muted">Category</label>
        <select name = "category_id" id = "category" class = "form-control @error('category_id') is-invalid @enderror">
            <option value = "0">Select a category</option>
            @foreach($categorys as $category)
                <option value = "{{ $category->id }}" {{ $category->id == $post->category_id  ? 'selected' : '' }}>
                    {{ $category->name }}
                </option>
            @endforeach
        </select>
</div>

Цель

Форма помещена в модальное окно Bootstrap 5, а это значит, что я не могу получить доступ к https://myapp.test/dashboard/posts/edit/1 для получения необходимых данных. Я должен сделать это через AJAX.

Для этого у меня есть следующая функция JavaScript

function populateEditForm(event, entity) {
    var id = event.currentTarget.dataset.id;
    var url = `/dashboard/${entity}/edit/${id}`;
    console.info(url);

    var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == XMLHttpRequest.DONE) { 
                if (xmlhttp.status == 200) {
                    console.info(xmlhttp.responseURL);
                }
            }
    };

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

который я вызываю в шаблоне Blade:

<a onclick = "populateEditForm(event, 'posts')" href = "#" data-id = "{{ $post->id }}" title = "Edit post" data-bs-toggle = "modal" data-bs-target = "#edit_post_modal">
        <i class = "fa fa-edit"></i>
</a>

Эта проблема

В консоли правильно отображается путь к методу редактирования в контроллере: https://myapp.test/dashboard/posts/edit/1 (для поста с id равным 1), но я не знаю, как этим воспользоваться, чтобы получить нужные данные ( $post->title, $post->category_name и т.д.) и пройти это к форме.

Чего не хватает?
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно вернуть ответ в формате JSON и повторно заполнить форму.

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Posts;

class PostsController extends Controller {

    // More code

    public function editPost($id) {

        $post = Posts::select (
            "posts.id",
            "posts.title",
            "posts.description",
            "posts.body",
            "catergories.name as category_name"
            )
            ->leftJoin("catergories", "posts.category_id", " = ", "catergories.id")
            ->where('posts.id', $id)
            ->first();

           return response()->json(['post' => $post]);
    }
}

В вашем JavaScript

function populateEditForm(event, entity) {
    var id = event.currentTarget.dataset.id;
    var url = `/dashboard/${entity}/edit/${id}`;
    console.info(url);

    var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == XMLHttpRequest.DONE) { 
                if (xmlhttp.status == 200) {
                    console.info(xmlhttp.response);
                }
            }
    };

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

Как насчет формы, как заполнить ее данными?

Razvan Zamfir 17.03.2022 11:58

Вам нужно изменить значение каждого ввода с желаемыми данными, например, document.querySelector("#name").value = 'John Doe'. Это обновит значение этого ввода по его идентификатору, предполагая, что элемент с идентификатором имени является вход.

Gazmend Sahiti 17.03.2022 12:00

В вашем случае ваш ответ есть, вам просто нужно выяснить, что куда поставить. Вы также можете использовать xmlhttp.responseText вместо xmlhttp.response, проверьте этот developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…

Gazmend Sahiti 17.03.2022 12:00

Другие вопросы по теме