مدرسه آنلاین پیبانُ

زیر مجموعه ای از وب سایــت بزرگ pibano.com

مدرسه آنلاین پیبانُ

زیر مجموعه ای از وب سایــت بزرگ pibano.com

نمایش کامنت ها:

php artisan make:migration create_comments_table :

Schema::create('comments', function (Blueprint $table) {

$table->id();

$table->string('title');

$table->text('body');

$table->unsignedBigInteger('article_id');

$table->unsignedBigInteger('user_id');

$table->timestamps();

$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');

$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

});

چون بقیه تیبل ها مایگریت شده اند و اگر دوباره کلی مایگریت کنیم ارور خواهد داد، پس فقط همین تیبل را مایگریت میکنیم: (نام تیبل را کپی کرده و:)

php artisan migrate --path=database/migrations/2020_04_25_064004_create_comments_table.php

ساخت مدل آن:

php artisan make:model Comment

تعریف رابطه کامنت و یوسر که کامنت متعلق است به یوزر:

class Comment extends Model

{


protected $fillable = ['title','user_id','article_id','body'];

public function user()

{

return $this->belongsTo('App\User', 'user_id', 'id');

}

}

ارسال کامنت ها به ویو از کنترولر (همان کنترلر و فانکشنی که در web.php برای آن صفحه ویو یعنی Single.Article.blade.php تعریف کردیم:

...
use App\Comment;
...
public function showSingleArticle($id)

{

$article = Article::where('id',$id)->first();

$comments = Comment::where("article_id", $id)->get(); این اضافه شد و بالا باید یوزش کنیم

return view("SingleArticle" , ["article"=>$article , 'comments'=>$comments ]);
در بالا نیز این اضافه شد , 'comments'=>$comments 

}

ویو یعنی Single.Article.blade.php : (در جای دلخواه که می خواهیم کامنت ها نمایش داده شوند، معمولا زیر پست):

<section id="comments">

@foreach ($comments as $comment)

<div class="comment card">

<div class="card-title">

<h5 class="user_name">

{{ $comment->user->name }}

</h5>

<h6 class="title">

{{ $comment->title }}

</h6>

</div>

<div class="card-body comment_body">

<p>

{{ $comment->body }}

</p>

</div>

</div>

@endforeach

</section>

ساخت فرم برای ارسال کامنت مخصوص کاربران:

ساخت یک روت در web.php :

Route::post('/addComment', "CommentController@addComment");

ساخت کنترولر آن (روت تعریف شده در بالا):

php artisan make:controller CommentController

ساخت آن addComment@ در داخل کنترولر ساخته شده در بالا:

...
use App\Comment;
use Auth; دقت
...
public function addComment(Request $data) هر چی از فرم اومده رو بریز تو ظرفی به اسم دیتا

{

$data['user_id'] = Auth::user()->id;

یوزر اسم متد آن کلاس و سینتکس است
این خط مربوط به نکته 2 در پایین است

Comment::create($data->except('_token'));
تو تیبل کامنت یه ردیف ایجاد کن ستوناشم با استفاده از ظرف دیتا که در بالا تعرف شده پر کن (به جز توکن مخفی، که برای امنیت بود و قبلا توضیح داده شده)
return redirect()->back();
بعدش برش گردون به صفحه قبلش
}

نکته راجب کنترلر بالا: چون هر چی که از فرم میاد ممکنه چیزی داشته باشه که به دیتا بیس آسیب بزنه پس در مدلش عبارت ...protected $fillable (مثالش در بالا موجود است) را تایپ می کنیم.

نکته 2: در آن همه چی که از فرم می آید article_id و user_id که نیست! پس باید خودمان اضافه شان کنیم اولی را در همان تگ فورم به صورت یک ایمپوت مخفی اضافه می کنیم ولی دومی را به دلایل امنیتی (مثلا کسی نیاد تو اینسپکت آی دی رو عوض کنه و با اسم کس دیگه کامنت بزاره) در همان کنترلر مربوط که همه چی را از فم گرفته بودیم، اضافه میکنیم.

ویو یعنی Single.Article.blade.php : (در جای دلخواه که می خواهیم کامنت ها نمایش داده شوند، معمولا بالای کامنت ها):

<form action="{{ url('/addComment') }}" method="post" style="text-align: right">

@csrf

<input type="hidden" name="article_id" value="{{ $article->id }}">

این خط مربوط به نکته 2 در بالا است

<div class="form-group">

<label for="title">عنوان دیدگاه:</label>

<input type="text" name="title" class="form-control" id="title">

</div>

<div class="form-group">

<label for="body">متن دیدگاه:</label>

<textarea cols="" rows="5" type="text" name="body" class="form-control" id="body"></textarea>

</div>

<div class="form-group">

<button type="submit" class="btn btn-success">ثبت نظر</button>

</div>

</form>
  • امیررضا ابراهیمی

laravel

لاراول