blog احترافي ب laravel 5.4 الجزء الثالت

فهاد الجزء الثالت من  blog احترافي ب laravel 5.4 غادي نكملو الملفات الخاصين ب les posts ديالنا ولي غادي يمكنوا الأدمن من إضافة تعديل أو حدف post معين كما غادي نوشوفو كيفاش نحدفو post فقط من الموقع ولكن غادي يبقى فقاعدة البيانات وغادي نشوفو كيفاش نمسحوه فخطرة.

نظرة سريعة بالفيديو


1- الملف PostsController.php


كنمشي ل app/Http/Controllers كنزيد ملف جديد كنسميه PostsController.php لي غادي تكون فيه fonction index لي كتسترجع les posts من قاعدة البيانات وكترسلهم للملف index ديال الأدمن ولي غادي نزيدوه من بعد ثم كاين fonction store لي كتمكن من إضافة post لقاعدة البيانات من بعد مكتحقق بلي حتى شي حقل ما خاوي وبلي المستخدم زاد الصورة ديال ل post ثم كاين fonction show لي كتسترجع post واحد بواسطة ل id وكتعرضو فالملف view لي غادي نزيدو من بعد بالإضافة للروابط لي كيمكنونا باش نتحركو للpost التالي والسابق ثم كاين fonction edit لي كتسترجع ل post بال id ديالو وكتوجه الأدمن للملف الخاص بالتعديل ثم  fonction update لي كتعدل المعلومات الخاصة ب post من بعد مكتحقق بلي حتى شي حقل ما خاوي ثم كاين fonction destroy لي كتسترجع post واحد بواسطة ل id ديالو وكتمسحو من الموقع وكيبقى فقاعدة البيانات ثم كاين killPost لي كاتاخد ل id ديال ل post وكتمسحو بصفة نهائية من قاعدة البيانات ثم كاين restore لي كتمكن الأدمن من إعادة إرجاع post تمسح مؤقتا من الموقع ثم كاين postByCategory لي كترجعنا les posts ديال كل categorie اختارها المستخدم الكود النهائي هو :

                                    
                                        <?php

namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request;
use App\Category;
use App\Post;
use App\Tag;
class PostsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
        return view('admin.posts.index')->with(['posts'=>Post::all()]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
        $this->validate($request,[
            'title'=>'required',
            'body'=>'required|max:1000',
            'category_id'=>'required',
            'file'=>'required|image',
            'tags'=>'required'
        ]);
        $file = $request->file('file');
        $name = time().$file->getClientOriginalName();
        $file->move('images',$name);
        $post = new Post();
        $post->title = $request->title;
        $post->body = $request->body;
        $post->image = $name;
        $post->category_id = $request->category_id;
        $post->user_id = Auth::user()->id;
        $post->slug = str_slug($request->title);
        $post->save();
        $post->tags()->attach($request->tags);
        return redirect()->route('posts.index')->with(['success'=>'Post ajouté avec succés']);
        
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($slug)
    {
        //
        $post = Post::whereSlug($slug)->first();
        $nextPost = Post::where('id','>',$post->id)->min('id');
        $previousPost = Post::where('id','<',$post->id)->max('id');
        return view('view')->with(['categories'=>Category::all(),
                                    'post'=>$post,
                                    'next'=>Post::find($nextPost),
                                    'previous'=>Post::find($previousPost)]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
        return view('admin.posts.edit')->with(['post'=>Post::find($id),'categories'=>Category::all(),'tags'=>Tag::all()]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
        $this->validate($request,[
            'title'=>'required',
            'body'=>'required|max:1000',
            'category_id'=>'required',
            'file'=>'required|image',
            'tags'=>'required'
        ]);
        $file = $request->file('file');
        $name = time().$file->getClientOriginalName();
        $file->move('images',$name);
        $post = Post::find($id);
        $post->title = $request->title;
        $post->body = $request->body;
        $post->image = $name;
        $post->category_id = $request->category_id;
        $post->user_id = Auth::user()->id;
        $post->slug = str_slug($request->title);
        $post->update();
        //delete post's old tags and add new ones
        $post->tags()->sync($request->tags);
        return redirect()->route('posts.index')->with(['success'=>'Post modifié avec succés']);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
        Post::find($id)->delete();
        return redirect()->route('posts.index')->with(['success'=>'Post déplacé vers la corbeille avec succés']);
    }
    public function killPost($id){
        $post = Post::withTrashed()->whereId($id)->first();
        $post->forceDelete();
        return redirect()->route('posts.index')->with(['success'=>'Post supprimé avec succés']);
    }
    public function restore($id){
        $post = Post::withTrashed()->whereId($id)->first();
        $post->restore();
        return redirect()->route('posts.index')->with(['success'=>'Post restitué avec succés']);
    }
    public function postByCategory($id){
        return view('category-post')->with(['categorie'=>Category::find($id),'categories'=>Category::all()]);
    }
}

                                    
                                

2- الملف Post.php


من بعد ف app كنزيد ملف كنسميه Post.php ولي عبارة عن model فيه الكود لي غادي يمكني باش ندير les relations ما بين جدول posts والجداول الأخرى فكاين fonction user لي كتقولنا بلي كل post تابع لمستخدم واحد و كاين fonction category لي كتقولنا بلي كل post تابع ل categorie وحدة ثم كاين tags لي كتقولنا بلي كل post تابع ل tag أو بزاف ديال les tags أخير حاجة وهي المهمة فعندنا use SoftDeletes لي كنستعملوها باش نتمكنو من استخدام الحدف المؤقت ديال les posts ديالنا وعندنا ل variable dates لي كانعطيوها le champ لي عندنا فالجدول posts ولي هو deleted_at الكود ديال الملف هو :

                                    
                                        <?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
    //
    use SoftDeletes;
    protected $dates = ['deleted_at'];
    public function user(){
        return $this->belongsTo('App\User');
    }
    public function category(){
        return $this->belongsTo('App\Category');
    }
    public function tags(){
        return $this->belongsToMany('App\Tag');
    }
}

                                    
                                

3- الملف admin/posts/add.blade.php


منبعد ف views/admin كنزيد مجلد جديد كنسميه posts فيه زيد ملف جديد سميه add.blade.php هادا الملف لي غادي يمكن الأدمن من إضافة post من بعد ما كيدخل المعلومات ديالو فل form ثم كترسل للfonction store لي ف PostsController الكود ديال الملف هو :

                                      
                                        @extends('layouts.app-layout')

@section('styles')

@endsection

@section('header')
  @include('includes.header')
@endsection

@section('content')
    <div class="row">
       @include('includes.sidebar')
        <div class="col-md-6 col-md-offset-1">
            <h1 class="text-primary">
                Ajouter un post
            </h1>  
            <hr>
            <form action="{{route('posts.store')}}" method="post" class="form-vertical" enctype="multipart/form-data">
                {{csrf_field()}}
                 <div class="form-group">
                    <label for="category">Catégorie*</label>
                    <select name="category_id" id="category_id" class="form-control">
                        <option  selected="" disabled="">Veuillez choisir une catégorie</option>
                        @foreach($categories as $categorie)
                            <option value="{{$categorie->id}}">{{$categorie->name}}</option>
                        @endforeach
                    </select>
                </div>
                <div class="form-group">
                    <label for="tag">Tags:</label>
                    <div class="form-group">
                        @foreach($tags as $tag)
                            <div class="row">
                                <div class="col-md-1">
                                     <input type="checkbox" name="tags[]" value="{{$tag->id}}" class="checkbox"> {{$tag->name}}
                                </div>
                            </div>
                        @endforeach
                    </div>
                </div>
                <div class="form-group">
                    <label for="title">Titre*</label>
                    <input type="text" class="form-control" name="title" id="title" placeholder="Titre">
                </div>
                <div class="form-group">
                    <label for="image">Photo*</label>
                    <input type="file" name="file">
                </div>
                <div class="form-group">
                    <label for="body">Description*</label>
                    <textarea name="body" id="body" cols="30" rows="10" class="form-control" placeholder="Déscription"></textarea>
                </div>
                <div class="form-group">
                    <button class="btn btn-success" type="submit" name="submit">Valider</button>
                </div>
            </form>  
        </div>
    </div>
@endsection

@section('footer')
  @include('includes.footer')
@endsection

@section('scripts')

@endsection

                                      
                                    

4- الملف admin/posts/edit.blade.php


دائما فالمجلد posts فيه زيد ملف جديد سميه edit.blade.php هادا الملف لي غادي يمكن الأدمن من تعديل post من بعد ما كيدخل المعلومات ديالو فل form ثم كترسل للfonction update لي ف PostsController الكود ديال الملف هو :

                                        
                                            @extends('layouts.app-layout')

@section('styles')

@endsection

@section('header')
  @include('includes.header')
@endsection

@section('content')
    <div class="row">
       @include('includes.sidebar')
        <div class="col-md-6 col-md-offset-1">
            <h1 class="text-primary">
                Modifier un post
            </h1>  
            <hr>
            <form action="{{route('posts.update',['id'=>$post->id])}}" method="post" class="form-vertical" enctype="multipart/form-data">
                {{csrf_field()}}
                 <div class="form-group">
                    <label for="category">Catégorie*</label>
                    <select name="category_id" id="category_id" class="form-control">
                        <option  selected="" disabled="">Veuillez choisir une catégorie</option>
                        @foreach($categories as $categorie)
                            <option value="{{$categorie->id}}"
                                @if($post->category->id == $categorie->id)
                                    selected
                                @endif
                            >{{$categorie->name}}</option>
                        @endforeach
                    </select>
                </div>
                <div class="form-group">
                    <label for="tag">Tags:</label>
                    <div class="form-group">
                        @foreach($tags as $tag)
                            <div class="row">
                                <div class="col-md-1">
                                     <input type="checkbox" name="tags[]" value="{{$tag->id}}" class="checkbox"
                                       @foreach($post->tags as $t)
                                            @if($tag->id == $t->id)
                                                checked
                                            @endif
                                       @endforeach
                                     />{{$tag->name}}
                                </div>
                            </div>
                        @endforeach
                    </div>
                </div>
                <div class="form-group">
                    <label for="title">Titre*</label>
                    <input type="text" class="form-control" name="title" id="title"  value="{{$post->title}}" laceholder="Titre">
                </div>
                <div class="form-group">
                    <label for="image">Photo*</label>
                    <input type="file" name="file">
                </div>
                <div class="form-group">
                    <label for="body">Description*</label>
                    <textarea name="body" id="body" cols="30" rows="10" class="form-control" placeholder="Déscription">{{$post->body}}</textarea>
                </div>
                <div class="form-group">
                    <button class="btn btn-success" type="submit" name="submit">Valider</button>
                </div>
            </form>  
        </div>
    </div>
@endsection

@section('footer')
  @include('includes.footer')
@endsection

@section('scripts')

@endsection

                                        
                                    

5- الملف admin/posts/index.blade.php


دائما فالمجلد posts  فيه كنزيد ملف جديد سميه index.blade.php هادا الملف لي غادي يتعرضوا فيه كل les posts لي عندنا ولي غادي يكون عند الأدمن الصلاحية باش يمسح post أو يزيد وكاين  les posts لي كيجيونا من ل fonction index لي كاينة فالملف PostsController.php وكنخدم ب foreach باش كنعرض كل المعلومات فبلاصتها بالإضافة للروابط لي كيمكنوا من تعديل وحدف les posts ديالنا الكود ديال الملف هو :

                                        
                                            @extends('layouts.app-layout')

@section('styles')

@endsection

@section('header')
  @include('includes.header')
@endsection

@section('content')
    <div class="row">
        @include('includes.sidebar')
        <div class="col-md-9">
           <table class="table">
                <thead>
                    <tr>
                        <th>Id</th>
                        <th>Titre</th>
                        <th>Déscription</th>
                        <th>Image</th>
                        <th>Url</th>
                        <th>Ajouté par</th>
                        <th>Le:</th>
                        <th>Actions</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach($posts as $post)
                        <tr>
                           <td>{{$post->id}}</td>
                           <td>{{$post->title}}</td>
                           <td>{{str_limit($post->body)}}</td>
                           <td><img src="{{URL::to('images/'.$post->image)}}" height="60" width="60"/></td>
                           <td>{{$post->slug}}</td>
                           <td>{{$post->user->name}}</td>
                           <td>{{$post->created_at}}</td>   
                           <td>
                             <a href="{{route('posts.edit',$post->id)}}" class="btn btn-warning btn-xs"><i class="glyphicon glyphicon-pencil"></i></a>
                             <a href="{{route('posts.destroy',$post->id)}}" class="btn btn-danger btn-xs"><i class="glyphicon glyphicon-trash"></i></a>
                           </td>
                        </tr>
                    @endforeach
                </tbody>
            </table>
        </div>
    </div>
@endsection

@section('footer')
  @include('includes.footer')
@endsection

@section('scripts')

@endsection

                                        
                                    

كلمات مفاتيح :