Bài 10. Sử dụng Eloquent trong Laravel 5 - phần 2

Bài trước mình đã giới thiệu về Eloquent trong Laravel 5 và hướng dẫn các bạn tạo trang quản lý loại tin cho dự án website tin tức. Bài hôm nay chúng ta sẽ ứng dụng Eloquent tạo trang quản lý tin tức cho dự án website tin tức.

Mục Lục:

4. Ứng dụng Eloquent tạo trang quản lý tin tức

Chuẩn bị giao diện:

Cái này mình đã chuẩn bị sẵn cho các bạn, bạn nào đã từng làm việc với adminlte rồi có thể tự thiết kế lại theo ý của minh tùy thích. Download: tại đây

Sau khi download load về các bạn giải nén vào thư mục resources/views/admin

route cho trang quản trị tin tức

        Route::group(['prefix' => 'article'], function () {
            // hiển thị danh sách tin
            Route::get('list', ['as' => 'getListArticle', 'uses' => 'Admin\ArticleController@getList']);

            // hiển thị form thêm tin tức
            Route::get('insert', ['as' => 'getInsertArticle', 'uses' => 'Admin\ArticleController@getInsert']);

            // nhận request method post từ trang thêm gủi về để tiến hành insert dữ liệu
            Route::post('insert', ['as' => 'postInsertArticle', 'uses' => 'Admin\ArticleController@postInsert']);

            // hiển thị form cập nhật dữ liệu
            Route::get('update/{id}', ['as' => 'getUpdateArticle', 'uses' => 'Admin\ArticleController@getUpdate']);

            // nhận request method post từ trang update gủi về để tiến hành update dữ liệu
            Route::post('update/{id}', ['as' => 'postUpdateArticle', 'uses' => 'Admin\ArticleController@postUpdate']);

            // xóa tin tức
            Route::get('delete/{id}', ['as' => 'getDeleteArticle', 'uses' => 'Admin\ArticleController@getDelete']);
        });
    

Tạo controller xử lý trang quản lý tin tức:

        $ php artisan make:controller Admin\ArticleController
    

Thêm mới một tin tức

Sử dụng route gủi request tới ArticleController cụ thể là function getInsert() trong ArticleController

function này sẽ return về view insert, cụ thể là file resources/views/admin/article/insert.blade.php

        public function getInsert(){
            $categories = Category::all();
            return view('admin.article.insert', compact('categories'));
        }
    

view thêm tin tức resources/views/admin/article/insert.blade.php có nội dung như sau:

        @extends('admin.base.base')
        @section('title')
            Thêm tin
        @endsection
        @section('css')
            
        @endsection
        @section('content')
            

Tin tức quản lý

Thêm tin tức

{{ empty($errors->messages()['txtTitle']) ? '' : showError($errors->messages()['txtTitle']) }}
{{ empty($errors->messages()['txtTag']) ? '' : showError($errors->messages()['txtTag']) }}
{{ empty($errors->messages()['txtDescription']) ? '' : showError($errors->messages()['txtDescription']) }}
{{ empty($errors->messages()['txtContent']) ? '' : showError($errors->messages()['txtContent']) }}
@endsection @section('javascript') @endsection

Validate Form

        $ php artisan make:request ArticleRequest
    

Mở file app/Http/ArticleRequest.php

        namespace App\Http\Requests;

        use Illuminate\Foundation\Http\FormRequest;

        class ArticleRequest extends FormRequest
        {
            /**
             * Determine if the user is authorized to make this request.
             *
             * @return bool
             */
            public function authorize()
            {
                return true;
            }

            /**
             * Get the validation rules that apply to the request.
             *
             * @return array
             */
            public function rules()
            {
                $postId = $this->route()->parameter('id');
                return [
                    'txtTitle' => 'required|unique:articles,title,'.$postId,
                    'txtTag' => 'required',
                    'txtDescription' => 'required',
                    'txtContent' => 'required',
                ];
            }
            public function messages()
            {
                return [
                    'txtTitle.required' => 'Bạn chưa nhập tiêu đề bài viết',
                    'txtTitle.unique' => 'Tiêu đề bài viết đã tồn tại',
                    'txtDescription.required' => 'Bạn chưa nhập mô tả',
                    'txtTag.required' => 'Bạn chưa nhập tag',
                    'txtContent.required' => 'Bạn chưa nhập nội dung'
                ];
            }
        }
    

Chú ý: action form phải gủi về route postInsertArticle

Sau khi nhấn submit sẻ sử dụng route postInsertArticle gủi request tới ArticleController cụ thể là function postInsert() trong ArticleController

function này có nhiệm vụ gửi request tới model là file app/Article.php để tiến hành giao tiếp với database để insert dữ liệu

         public function postInsert(ArticleRequest $request){
            $article =  new Article();
            $article->title = $request->txtTitle;
            $article->category_id = $request->selCategory;
            $article->tag = $request->txtTag;
            $article->description = $request->txtDescription;
            $article->content = $request->txtContent;
            $article->alias = changeTitle($request->txtTitle);
            if($request->hasFile('fImage'))
            {
                $article->image = moveFile($request, 'fImage', false, null);

            }else{
                $article->image = "";
            }
            $article->status = empty($request->txtStatus) ? 0 : 1;
            $article->save();
            return redirect('administrator/article/list')->with(['success' => 'Thêm thành công']);
        }
    

Hàm moveFile ở dâu ra? ^_^

Mở file app/function/ChangeTitle.php thêm cho mình function sau:

Sau đó chạy lênh sau là có thể sử dụng nó:

        function moveFile($request, $fileName, $unlink = false, $fileDel)
        {
            $file = $request->file($fileName);
            $format = $file->getClientOriginalExtension();
            if($format != 'jpg' && $format != 'png' && $format != 'jpeg'){
                return redirect('admin/news/list')->with(['flash_level' => 'danger', 'flash_message' => 'File upload lên phải có định dạng sau jpg,png,jpeg']);
            }
            $name = $file->getClientOriginalName();
            $image = str_random(4) . "_" . $name;
            while(file_exists("upload/articles/" . $image))
            {
                $image = str_random(4) . "_" . $name;
            }
            if($unlink)
                unlink("upload/articles/" . $fileDel);
            Image::make($file->getRealPath())->resize(480, 292)->save(public_path('upload/articles/' . $image));
            return $image;
        }
    

Tiếp theo ta cài đặt Intervention/Image. Xem chi tiết: tại đây

Không cài là không chạy được hàm đó đâu nhé.

Form insert

Validate form

Hiển thị danh sách tin tức

Sử dụng route getListArticle gủi request tới ArticleController cụ thể là function getList() trong ArticleController

function này sẽ lấy tất cả dữ liệu bảng articles tryền qua view list, cụ thể là file resources/views/admin/article/list.blade.php

          public function getList(){
            $articles = Article::all();
            return view('admin.article.list', compact('articles'));
          }
    

view danh sách tin tứcresources/views/admin/artucle/list.blade.php có nội dung như sau:

        @extends('admin.base.base')
        @section('title')
            Danh sách tin
        @endsection
        @section('css')
                
            
        @endsection
        @section('content')
            

Danh mục quản lý

Danh sách Tin

@foreach($articles as $article) @endforeach
Danh mục Tiêu đề Tag Hiển thị
{{ $article->category->name }} {{ $article->title }} {{ $article->tag }} {{ $article->status == 1 ? 'Có' : 'Không'}}
Danh mục Tiêu đề Tag Tag
@endsection @section('javascript') @endsection

Danh sách

Cập nhật một tin tức

Sử dụng route getUpdateArticle gủi request tới ArticleController cụ thể là function getUpdate() trong ArticleController

function này sẽ lấy dữ liệu column cần cập nhật trong bảng categories truyền qua view update, cụ thể là file resources/views/admin/article/update.blade.php

           public function getUpdate($id){
                $art = Article::find($id);
                $categories = Category::all();
                return view('admin.article.update', compact('art', 'categories'));
           }
    

view danh sách loại tin resources/views/admin/article/update.blade.php có nội dung như sau:

        @extends('admin.base.base')
        @section('title')
            Cập nhật tin
        @endsection
        @section('css')
            
        @endsection
        @section('content')
            

Tin tức quản lý

Cập nhật tin tức

{{ empty($errors->messages()['txtTitle']) ? '' : showError($errors->messages()['txtTitle']) }}
{{ empty($errors->messages()['txtTag']) ? '' : showError($errors->messages()['txtTag']) }}
{{ empty($errors->messages()['txtDescription']) ? '' : showError($errors->messages()['txtDescription']) }}
{{ empty($errors->messages()['txtContent']) ? '' : showError($errors->messages()['txtContent']) }}
status == 1 ? 'checked' : '' }}>
Làm mới Hủy
@endsection @section('javascript') @endsection

Sau khi nhấn submit sẻ sử dụng route postUpdateArticle gủi request tới ArticleController cụ thể là function postUpdate() trong ArticleController

function này có nhiệm vụ gửi request tới model là file app/Article.php để tiến hành giao tiếp với database để update dữ liệu

        public function postUpdate(ArticleRequest $request, $id){
            $article = Article::find($id);
            $article->title = $request->txtTitle;
            $article->category_id = $request->selCategory;
            $article->tag = $request->txtTag;
            $article->description = $request->txtDescription;
            $article->content = $request->txtContent;
            $article->alias = changeTitle($request->txtTitle);
            if($request->hasFile('fImage'))
            {
                if($article->image != '')
                {
                    $article->image = moveFile($request, 'fImage', true, $article->image);
                }
                else
                {
                    $article->image = moveFile($request, 'fImage', false, null);
                }
            }else{
                $article->image = $article->image;
            }
            $article->status = empty($request->txtStatus) ? 0 : 1;
            $article->update();
            return redirect('administrator/article/list')->with(['success' => 'Cập nhật thành công']);
        }
    

Form cập nhật

Xóa một tin tức

Sử dụng route getDeleteArticle gủi request tới ArticleController cụ thể là function getDelete() trong ArticleController

function này sẽ lấy dữ liệu column cần xóa trong bảng articles để tiến hành xóa

        public function getDelete($id){
            $article = Article::find($id);
            $article->delete();
            if($article->image != '')
            {
                unlink("upload/news/" . $article->image);
            }
            return redirect('administrator/article/list')->with(['success' => 'Xóa thành công']);
        }
    

Soure code: download

Trong bài này mình đã hướng dẫn các bạn ứng dụng Eloquent tạo trang quản lý tin tức. Trong series bài viết tiếp theo mình sẽ hướng dẫn các bạn tạo chức năng thêm, sữa, xóa cho trang user. Mời các bạn đón đọc. Bài viết trên là những hiểu biết của cá nhân mình nên không tránh phải sai sót, rất mong sự đóng góp ý kiến của các bạn để bài viết trở nên hữu ích hơn.