Posts

Deploy website lên VPS hoặc Hosting với Gitlab CI/CD

Image
  Deploy website lên VPS với Gitlab CI/CD Sau một thời gian code ra được môt trang web xịn xò thì bạn có nhu cầu đưa lên internet để mọi người được biết. Bắt đầu với công việc đầu tiên là tìm mua tên miền, hosting hoặc VPS. Bạn có thể mua VPS tại Hostinger hoặc Vultr,... 1 VPS có thể cài đặt được nhiều trang web. Như vậy sau quá trình chuẩn bị thành công, chúng ta sẽ đẩy code từ local lên hosting, server. Quá trình này khá là mất công. Cách cổ điển hiện nay được nhiều người dùng là dùng FTP, hoặc upload thằng từ các trang quản lý. Đây là công việc khá nhàm chán, tốn thời gian. Khi có một thay đổi nhỏ là phải đi thao tác lại. Chính vì vậy khái niệm CI/CD ra đời. CI/CD là một bộ đôi công việc, bao gồm CI ( Continuous Integration ) và CD ( Continuous Delivery ), ý nói là quá trình tích hợp (integration) thường xuyên, nhanh chóng hơn khi code cũng như thường xuyên cập nhật phiên bản mới (delivery). Có khá nhiều công cụ hỗ trợ CI/CD, nhưng trong phạm vi bài viết chỉ đề cập công cụ CI/CD của

PHP - Chuyển đổi ngày giờ thành thời gian (1 tiếng trước, 1 ngày trước, 1 tháng trước, 1 năm trước)

Thỉnh thoảng thì bạn sẽ thấy 1 số trang blogs, trang thương mại điện tử phần ngày tháng họ sẽ hiển thị kiểu : - vài giây trước - 1 giờ trước - 1 ngày trước - 2 tuần trước - 1 tháng trước - ... Vậy làm thế nào để được như vậy? Trong PHP thì dễ dàng để thực hiện điều này. Bước 1: Cần chuẩn bị 1 function helper để chuyển đổi ngàu giờ. Cụ thể thì cần: function convert_time_elapsed_string($datetime) {     $now = new Datetime ;     $ago = new Datetime ($datetime);     $diff = $now->diff($ago);     $diff->w = floor($diff->d / 7);     $diff->d -= $diff->w * 7;     $str = array(          'y' => 'năm',          'm' => 'tháng',          'w' => 'tuần',          'd' => 'ngày',          'h' => 'tiếng'          'i' => 'phút',          's' => 'giây'      );     foreach($str as $key => &$value) {          if ($diff->$key) {               $value =

Laravel chuyển đổi ngôn ngữ trong email khi chạy lệnh command

- Nhiều thắc mắc đưa ra là mình có Middleware Locale rồi đã đặt trong Kernel rồi. - Trong API cũng set middleware('locale') rồi mà sau khi chạy command gởi mail ra nó không nhận file ngôn ngữ. Hiểu đơn giản là khi chạy 1 command nó không gọi bất cứ 1 API nào cả thì đâu có đi qua middleware đâu mà nhận locale. Để thực hiện translate nội dung mail khi chạy command thì từ Laravel 5.4 đã hổ trợ cài locale 1. Mail::to('abc@test.com') ->locale('nl') ->send(new InviteUserMail()); 2. Trong file .blade.php bạn phải đổi thành Thay vì: Dear Administrator thì phải đổi thành {{__('Dear Adminitrator')}} << với cặp {{}} và __() thì việc chuyển đổi ngôn ngữ trong blade template mới được thực hiện. Một lưu ý: file chuyển ngôn ngữ phải là file .json và đặt ở lang/nl.json chỉ với ->locale('language') thì chắc chắn nội dung mail của bạn sẽ được dịch

Laravel Unit Test - Test Job

Bài này thì cơ bản về cách test 1 job được đưa vào hàng đợi hay chưa? và test mock service của một bên thứ 3 như thế nào 1. Import những thư viện cần thiết: use Bus; use Illuminate\Testing\Fluent\AssertableJson; use Mockery; use Mockery\MockInterface; Trong đó thì:  - Bus dùng để gửi một lệnh đến trình xử lý thích hợp của nó. - AssertableJson dùng để kiểm tra kết quả trả về - Mockery dùng để mock các dịch vụ của bên thứ 3 - MockInterface dùng để định nghĩa định dạng 2. Gọi function test public function test_user_can_check_device_but_dont_know_serial() {     // Giả lập môi trường sẽ gởi lệnh     Bus::fake();     // Gọi đến dịch vụ của bên thứ 3     $this->instance(         MSService::class,             Mockery::mock(MSService::class, function (MockInterface $mock) {                 $mock->shouldReceive('requestToTenant') // function nào được gọi                       ->withAnyArgs() // Chấp nhận mọi tham số                       ->once() // Ngụ ý gọi 1 l

Laravel Unit Test - Test Mail

Đầu tiên về nội dung Seri này là giới thiệu cơ bản về các loại test trong Laravel Bài này mình sẽ làm về test mail Các bước cơ bản như sau: 1. Thêm thư viện cần dùng: use Illuminate\Support\Facades\Mail; 2. Làm theo hướng dẫn: ``` public function testEmail() {      Mail::fake();      // Your post call here(API or JOB or COMMAND)     // Example call a command here       $this->artisan('command:commandname', [                'argurment' => 'test@testcommand.com',                '--option' => 'test.com'           ]);      Mail::assertSent(CommentPosted::class); // This is a mailable class           / / You can also check if the correct email was send      // by checking the data that was send to it      Mail::assertSent(CommentPosted::class, function ($mail) use ($user) {      return $mail->hasTo($user->email) &&                     $mail->hasCc('...') &&                     $mail->hasBc

Fix lỗi Duplicate entry ‘0’ for key ‘PRIMARY’ SQL

  Lỗi huyền thoại khi import database vào mysql Cách fix: Chạy lệnh sql này: SET sql_mode=’NO_AUTO_VALUE_ON_ZERO’; Giờ xoá database bị lỗi lúc nãy, và import lại.

Ý nghĩa từng file trong cấu trúc theme của Wordpress

Image
  File screenshot.png:  Đây là file quan trọng và bắt buộc của theme để khai báo ảnh đại diện của theme File functions.php: Là file chứa những đoạn code tạo nên các chức năng mới của theme hoặc customize một chức năng nào đó sẳn có. index.php là trang chủ header.php là phần code header của layout footer.php là phần code foorter của layout sidebar.php là phần code sidebar nằm bên trái hoặc bên phải website page.php trang dành cho các page single.php trang chi tiết bài viết comments.php trang hiển thị danh sách bình luận content.php phần hiển thị nội dung bài viết content-page.php phần chứa các bài viết của thể loại page search.php trang tìm kiếm archive.php trang lưu trữ toàn bộ bài post theo loại, tag, ngày, tháng, năm, tác giả. Ví dụ archive.php: Single.php

Chèn CSS và JS vào Wordpress template

Image
  Sử dụng get_template_derectory_uri() để lấy đến đường dẫn hiện tại sử dụng tiếp hook: wp_enqueue_scripts để đăng kí file css của mình với template Và một điều quan trọng là chúng ta cần 1 file reset.css để cấu hình trang trước mình có thể tìm thấy nó ở đây Normalize.css: Make browsers render all elements more consistently. (necolas.github.io)

Đổi tên "READ MORE" trong bài post

Nhiều khi bạn không thích chử mặc định trong wordpress nên mình cũng có 1 cái filter để làm việc này nhìn ví dụ bên dưới function vd_readmore(){     return '<a class="read-more" href=" '.  get_permalink( get_the_ID() )  . ' "> ' .__('[Đọc Thêm]', 'textdomain'). ' </a>'; } add_filter('excerpt_more', 'vd_readmore');

Khai báo chức năng trong theme wordpress

Image
  mặc định trang wordpress của bạn sẽ trống không có gì cả bạn phải setup các thứ từ ban đầu cụ thể là 1.Thêm RSS feed thông qua: add_theme_support( 'automatic-feed-links' ) 2.Thêm ảnh đại diện trong post và page: add_theme_support( 'post-thumbnails' ) 3.Thêm post format: add_theme_support( 'post-formats', array('image', 'video') ) 4.Thêm thẻ title tự động trên head: add_theme_support( 'title-tag' ) 5,Thêm menu mặc định: register_nav_menu('primary-menu', 'Primary menu') ... cùng một số cấu hình khác. chi tết xem hình dưới