Bài 9 : Xử lý ngày tháng trong Laravel 5

Hôm nay, tiếp theo bài viết Form trong Laravel 5,  mình sẽ giới thiệu đến các bạn cách xử lý ngày tháng trong Laravel 5.
Như các bạn đã biết thì bất kỳ một bài viết nào đó khi đã được xuất bản thì cần phải lưu lại thời gian mà nó được tạo ra. Cũng giống như chúng ta khi sinh ra thì phải có ngày sinh nhật vậy đó 🙂
Trong suốt bài viết về chủ đề Xử lý ngày tháng trong Laravel 5 mình sử dụng lại form articles đã được tạo ra ở bài viết trước Form trong Laravel 5 để các bạn dễ hình dung. Ok, vào vấn đề chính nào !

Xử lý ngày tháng trong Laravel 5

1. Khởi chạy Laravel 5

Việc đầu tiên cần làm là chúng ta phải khởi chạy Laravel 5 cái đã. Mở cmd, gõ lệnh sau để di chuyển vào thư mục gốc của Laravel 5
tiếp đến gõ lệnh
để khởi chạy laravel 5 ở port 8000

2. Thêm field input date trong form

Coi lại 1 chút về form mà chúng ta đã tạo ra ở bài trước trong file view create.blade.php có nội dung :
Hiện tại thì trong form này chỉ có 2 input để người dùng nhập thông tin đó là name và author. Vì thế mình sẽ tiếp tục thêm 1 input kiểu date mới để người dùng nhập ngày tháng như sau :
Các bạn lưu ý là ‘created_at’ chính là tên của column created_at thuộc bảng articles trong Database. Các bạn nhớ đặt tên cho chính xác, vì như vậy laravel mới có thể hiểu được và xử lý giá trị này.
Tiếp đến các bạn gõ đường dẫn
để vào lại form mà chúng ta đã tạo thì các bạn sẽ thấy như sau :
form xử lý ngày tháng trong laravel 5
form xử lý ngày tháng trong laravel 5
Ở hình trên, 1 field mới được tạo ra là Created Date có định dạng là dd/mm/yyyy, fieal này dùng để cho các bạn nhập ngày tháng năm của articles. Nếu như các bạn không muốn hiển thị dd/mm/yyyy vì cảm giacs nó kì kì thì các bạn sửa lại file view create.blade.php một xíu ở field date như sau :
Với đoạn code trên, mình đã format lại ngày tháng năm bằng cách truyền thêm date(“Y-m-d”) vào trong input date vừa tạo. Tiếp đến, reload lại trình duyệt thì các bạn sẽ thấy mặc định thời điểm ngày hôm nay được điền sẵn như sau :
form xử lý ngày tháng laravel 5
form xử lý ngày tháng trong laravel 5

3. Sửa ArticlesController.php để xử lý ngày tháng năm

Sau khi đã sửa lại view hiển thị, tiếp đến mình sẽ chỉnh sửa lại file controller ArticlesController.php.
Các bạn mở file ArticlesController.php mà chúng ta đã tạo ra ở các bài trước với function store() có nội dung như sau :
Đoạn code trên là cách viết thủ công mà ở bài trước Form trong Laravel 5 mình đã giới thiệu đến các bạn. Giờ thì mình sẽ chỉnh sửa lại nội dụng function store() này ngắn gọn hơn, thuận tiện hơn cho chúng ta trong quá trình xử lý.
Giai thích một tí đó là ở đoạn code mới trên, mình đã lấy hết dữ liệu được gửi từ form và đưa toàn bộ các thông tin vào hàm create() trong Laravel 5, hàm này sẽ chịu trách nhiệm lưu tất cả thông tin vào database mà chúng ta không cần phải làm thủ công như bài trước.

4. Sửa file model Articles.php

Sau khi đã chỉnh sửa xong controller, tiếp đến mình sẽ sửa lại file model Articles.php bằng cách thêm đoạn code như dưới đây :
Ở đoạn code trên, mình đã thêm 1 mảng là $fillable với các giá trị là author, name, created_at. Mảng này có trách nhiệm nói cho Laravel biết là chúng ta sẽ lọc những giá trị này và lưu vào database.

Tại file view articles.blade.php đã tạo ở bài trước có nội dung như sau :
Các bạn sửa lại một chút như dưới đây để hiển thị thời gian bài viết được xuất bản (created_at)
Tiếp đến, vào trình duyệt, gõ đường dẫn dưới đây để hiển thị form
và điền đầy đủ thông tin vào form như sau :
form xử lý ngày tháng năm laravel 5
Sau khi đã điền thông tin xong, ấn nút Them moi, dữ liệu sẽ được lưu vào database vào và được chuyển hướng hiển thị ra view articles như sau :
Ở trên, nếu tinh ý bạn sẽ thấy 1 vấn đề nho nhỏ đó là định dạng ngày tháng của chúng ta có giờ phút giây là 00:00:00. Vì Laravel mặc định sẽ lấy thời gian lúc nửa đêm  lưu vào DB. Vì thế để Laravel lưu vào giờ phút giây hiện tại khi bài viết được xuất bản thì bạn mở file model Articles.php và thêm 1 function mới gọi là setCreatedAtAttribute như sau :
Các bạn lưu ý là tên function setCreatedAtAttribute là hàm được viết theo coding convention theo cú pháp :
với :
  • set : là mặc định
  • field trong database : ở đây là created_at nhưng bạn phải in đâm chữ cái đầu tiên và bỏ dấu gach ngang “_” đi để nó trở thành CreatedAt
  • Attribute : là mặc định
Trong function setCreatedAtAttribute, mình dùng phương thức Carbon::createFromFormat() để format lại định dang thời gian và lưu dữ liệu vào field created_at.
Sau đó, lưu lại trình duyệt, điền đầy đủ thông tin, ấn Them moi, thì các bạn sẽ thấy dữ liệu được hiển thị ra với ngày tháng lấy theo giờ hiện tại như mong muốn :

6. Ngoài lề 1 tí

Giả sử như bây giờ chúng ta muốn tạo 1 bài viết, nhưng không muốn nó hiển thị ra vào ngày mà nó được xuất bản (chẳng hạn ở đầy là 28/03/2015) mà mình muốn bài viết sẽ được hiển thị vào ngày mai (tức là ngày 29/03/2015) nên mình sẽ điền thông tin trong form như sau :
laravel 5 xử lý ngày tháng năm
Ấn Them moi thì ta sẽ thấy dữ liệu hiển thị ra ngoài như sau:
Các bạn sẽ thấy rằng bài viết ngày 29/03/2015 vẫn bị hiển thị ra ngoài không đúng như ý muốn của chúng ta. Vì thế
tiếp đến mình sẽ chỉnh sửa lại function index() trong file ArticlesController.php có nội dung :
trở thành như dưới đây :
để chỉ lấy các bài viết tính từ thời điểm hiện tại trở về trước. Sau đó, các bạn reload lại trình duyệt sẽ thấy chỉ có 2 bài viết được hiển thị ra là:
còn nội dung :
sẽ được public hiển thị ra ngoài vào ngày mai (29-03-2015).
Mình kết thúc bài viết xử lý ngày tháng trong laravel 5 ở đây. Chúc các bạn 1 ngày cuối tuần thật yên bình và thư giãn. Đừng quên ấn các nút bên dưới bài viết để share cho các bạn khác cùng học. Hoặc ấn Đăng ký nhận bài viết mới ở thanh sidebar bên trái để nhận các bài viết qua email nhé. Thân !

Comments

Popular Posts