Я сделал приложение для ведения блога в Laravel 8.
Я работаю над функциональностью добавления ответов на комментарии.
В контроллере я добавляю такие комментарии:
$comment = [
'user_id' => Auth::user()->id,
'article_id' => $request->get( 'article_id' ),
'parent_id' => $request->get( 'parent_id' ),
'body' => $fields['msg'],
'approved' => 0
];
// Insert comment in the 'comments' table
$query = Comment::create( $comment );
if ( $query ) {
return redirect()->back()->with( 'success', 'Your comment is pending.' );
} else {
return redirect()->back()->with( 'error', 'Adding comment failed' );
}
Я добавил форму комментариев под каждым комментарием:
@foreach ($comments as $comment)
@if (null == $comment->parent_id)
<li class = "depth-1 comment">
<div class = "comment__avatar">
<img class = "avatar" src = "{{ asset('images/avatars/' . $comment->user->avatar) }}" alt = "<img class = "avatar" src = "{{ asset('images/avatars/' . $reply->user->avatar) }}" alt = "{{ $comment->user->first_name }} {{ $comment->user->last_name }}" width = "50" height = "50">" width = "50" height = "50">
</div>
<div class = "comment__content">
<div class = "comment__info">
<div class = "comment__author">{{ $comment->user->first_name }} {{ $comment->user->last_name }}</div>
<div class = "comment__meta">
<div class = "comment__time">{{ date('jS M Y', strtotime($comment->created_at)) }}</div>
@auth
<div class = "comment__reply">
<a class = "comment-reply-link" href = "#0">Reply</a>
</div>
@endauth
</div>
</div>
<div class = "comment__text">
<p>{{ $comment->body }}</p>
</div>
</div>
// Comments form template here!
@auth
<div class = "comment__reply">
<a class = "comment-reply-link" href = "#0">Reply</a>
</div>
@endauth
{{-- Comment replies --}}
@if (count($comment->replies))
<ul class = "children">
@foreach ($comment->replies as $reply)
<li class = "depth-2 comment">
<div class = "comment__avatar">
<img class = "avatar" src = "{{ asset('images/avatars/' . $reply->user->avatar) }}" alt = "" width = "50" height = "50">
</div>
<div class = "comment__content">
<div class = "comment__info">
<div class = "comment__author">{{ $reply->user->first_name }} {{ $reply->user->last_name }}</div>
<div class = "comment__meta">
<div class = "comment__time">{{ date('jS M Y', strtotime($reply->created_at)) }}</div>
</div>
</div>
<div class = "comment__text">
<p>{{ $reply->body }}</p>
</div>
</div>
</li>
@endforeach
</ul>
@endif
</li>
@endif
@endforeach
Форма комментариев (partials\comment-form.blade.php
):
@if (session('success'))
@include('themes/' .$theme_directory . '/partials/success')
@endif
@if (session('error'))
@include('themes/' .$theme_directory . '/partials/errors')
@endif
<form method = "post" action = "{{ route('comment.submit') }}" autocomplete = "off">
@csrf
<fieldset>
<input type = "hidden" name = "article_id" value = "{{ $article->id }}">
<input type = "hidden" name = "parent_id" value = "{{ $comment->id ?? '' }}">
<div class = "message form-field">
<textarea name = "msg" id = "message" class = "h-full-width" placeholder = "Your Message"></textarea>
@error('msg')
<p class = "help-block text-danger">{{ $message }}</p>
@enderror
</div>
<br>
<input name = "submit" id = "submit" class = "btn btn--primary btn-wide btn--large h-full-width" value = "Add Comment" type = "submit">
</fieldset>
</form>
Из-за того, что шаблон формы комментариев содержит внутри себя оповещение об успешном (или неудачном) завершении (шаблон) находится внутри @foreach
, который зацикливает комментарии при добавлении ответа, оповещение о подтверждении появляется под каждым комментарием.
Конечно, я хочу, чтобы он отображался только под комментарием, на который был дан ответ.
При попытке реализовать решение, предложенное @Alun Razvan, я получаю ошибку Undefined variable: comment
в comment-form.blade.php.
В вашем контроллере также передайте идентификатор родительского комментария следующим образом:
return redirect()->back()->with([
'success' => 'Your comment is pending.',
'success_comment_id' => $request->get('parent_id'),
]);
Затем в своем шаблоне comment-form.blade.php
проверьте, совпадают ли идентификаторы комментариев.
@if (session('success') && session('success_comment_id') == ($comment->id ?? null))
@include('themes/' .$theme_directory . '/partials/success')
@endif
Вы редактировали свой вопрос и удалили здесь // шаблон формы комментариев! @include('themes/' . $theme_directory . '/partials/comment-form') Как вы ожидаете, что другие будут правильно следовать вашему вопросу? ??