非同期処理

laravelです。下記コードのいいねのところに非同期処理を組み込んでほしいです。 <!DOCTYPE html> <html lang="ja"> <head> <title>ヘルマネ</title> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-..." crossorigin="anonymous"> <style> .navbar { position: fixed; top: 0; left: 0; width: 100%; z-index: 999; background-color: #388e3c ; border-radius: 0; margin-bottom: 20px; } .navbar-brand { font-size: 2rem; color: #ffffff ; font-weight: bold; } .navbar-brand:hover { color: #0077cc ; } .navbar-nav { margin-left: auto; } .nav-link { color: #ffffff ; font-weight: bold; } .nav-link:hover { color: #0077cc ; } .post-img { cursor: pointer; } .post-img img { width: 60px; position: fixed; right: 10px; bottom: 10px; } .news-feed { margin-top: 160px; margin-bottom: 80px; margin-right: 120px; margin-left: 120px; } .post { background-color: #ffffff ; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3); padding: 20px; margin-bottom: 20px; border-radius: 10px; } .user-name:hover { cursor: pointer; color: #0077cc ; } .post-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .post-content p { font-size: 16px; color: #666666 ; word-wrap: break-word; } .post-actions a { color: #333333 ; text-decoration: none; font-size: 16px; margin-right: 10px; } .post-actions a:hover { color: #0077cc ; } .post-time p { color: #333333 ; text-decoration: none; font-size: 12px; margin-right: 10px; text-align: end; margin-top: 10px; } @media screen and (max-width: 896px) { .news-feed { margin-bottom: 0; margin-right: 0; margin-left: 0; } } </style> </head> @php session_start(); @endphp <body> <nav class="navbar"> <div class="container-fluid"> <a class="navbar-brand" href="./main.php">ヘルマネ</a> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" href="./main.php">トップ</a> </li> @if (session('login_flag')) <li class="nav-item"> <a class="nav-link" href="./profile.php">プロフィール</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('logout') }}">ログアウト</a> </li> @else <li class="nav-item"> <a class="nav-link" href="{{ route('login') }}">ログイン</a> </li> <li class="nav-item"> <a class="nav-link" href="./signup.php">新規登録</a> </li> @endif </ul> </div> </nav> <main> @if (session('login_flag')) <div class="post-img"> <a href="./post.php"><img src="{{ asset('storage/images/post_img.png') }}" alt="post_img"></a> </div> @endif <div class="news-feed"> @foreach ($contents as $content) <div class="post"> <div class="post-header"> <div class="user-name"> <h3>UserName</h3> </div> @if (session('login_flag')) <div class="post-actions"> <a href="#"><span class="heart">♡</span>いいね</a> </div> @endif </div> <div class="post-content"> <p>・食事内容<br>{{ $content->meal_content }}</p> </div> <div class="post-time"> <p>投稿日時 {{ $content->created_at }}</p> </div> </div> @endforeach </div> </main> @include('footer') </body> </html>

ChatGPT

非同期処理を組み込むには、JavaScriptを使用して、クリックイベントに対応する関数を作成し、その関数内でAjaxを使用して、サーバーにリクエストを送信して、いいねを付ける処理を行います。

以下は、JavaScriptを使用して非同期処理を実現する例です。

  1. ページにjQueryを読み込む

非同期処理を実現するために、jQueryを使用します。jQueryを読み込むために、以下のコードをheadタグ内に追加してください。

htmlCopy code<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  1. クリックイベントに対応する関数を作成する

以下のコードを、headタグ内に追加してください。

htmlCopy code<script>
  $(function() {
    $('.heart').on('click', function() {
      var post_id = $(this).data('id');
      var user_id = $(this).data('user-id');
      var token = $('meta[name="csrf-token"]').attr('content');

      $.ajax({
        type: 'POST',
        url: '/like',
        data: {
          'post_id': post_id,
          'user_id': user_id,
          '_token': token
        },
        success: function(data) {
          console.log(data);
        },
        error: function(data) {
          console.log(data);
        }
      });
    });
  });
</script>
  1. サーバーにリクエストを送信する

クリックイベントに対応する関数を作成したら、サーバーにリクエストを送信します。以下のように、ルートを作成して、コントローラーのメソッドでいいねを付ける処理を行います。

phpCopy codeRoute::post('/like', 'LikeController@store');

コントローラーのメソッドでいいねを付ける処理を行うために、以下のようにコントローラーを作成してください。

phpCopy codenamespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Like;

class LikeController extends Controller
{
    public function store(Request $request)
    {
        $like = new Like;
        $like->post_id = $request->post_id;
        $like->user_id = $request->user_id;
        $like->save();

        return response()->json(['success' => 'いいねを付けました。']);
    }
}

以上の手順を行うことで、いいねの非同期処理が実現されます。

<script> $(function() { $('.heart').on('click', function() { var post_id = $(this).data('id'); var user_id = $(this).data('user-id'); var token = $('meta[name="csrf-token"]').attr('content'); $.ajax({ type: 'POST', url: '/like', data: { 'post_id': post_id, 'user_id': user_id, '_token': token }, success: function(data) { console.log(data); }, error: function(data) { console.log(data); } }); }); }); </script> ここの意味教えて

ChatGPT

このスクリプトは、jQueryを使用して「いいね!」ボタンをクリックすると、Ajaxを使用してサーバーにデータを送信するためのものです。

$('.heart').on('click', function() {...}); は、.heartというクラスを持つHTML要素がクリックされたときに関数を実行するように設定しています。

var post_id = $(this).data('id'); は、クリックされた要素のdata-id属性から投稿のIDを取得しています。

var user_id = $(this).data('user-id'); は、クリックされた要素のdata-user-id属性からユーザーのIDを取得しています。

var token = $('meta[name="csrf-token"]').attr('content'); は、CSRF(Cross-Site Request Forgery)トークンを取得しています。

次に、Ajaxリクエストが行われます。 typeはHTTPリクエストのタイプ(POST)、urlは送信先のURL(/like)、dataは送信するデータのオブジェクト(投稿ID、ユーザーID、CSRFトークン)です。

successコールバック関数は、リクエストが成功した場合に実行されます。この関数では、サーバーからのレスポンスデータをコンソールに表示するようになっています。

errorコールバック関数は、リクエストがエラーとなった場合に実行されます。この関数では、エラーデータをコンソールに表示するようになっています。

この記事が気に入ったらサポートをしてみませんか?