Hướng dẫn xử lý sắp xếp files theo thời gian cho thư viện laravel file manager
- 10-04-2022
- Toanngo92
- 0 Comments
Trong dự án gần đây, mình cần tải các tệp theo thứ tự theo “time DESC” ( sắp xếp theo thời gian mới nhất) khi iframe của laravel-filemanager được gọi. (Mặc định, các files trong laravel file manager sắp xếp theo tên alphabet). Vấn đề sẽ xảy ra khi số lượng file quá lớn, người dùng không thể tìm được file mình vừa upload.
Khi đọc docs, không thấy options tùy chỉnh trong tình huống này, nên phải tốn thêm chút thời gian tìm hiểu trên stack overflow để giải quyết vấn đề, nên hôm nay viết lại bài này để anh em đỡ tốn thời gian research, mặc dù theo góc nhìn của mình, cách này là cách giải quyết xấu vì phải sửa trực tiếp code trong thư mục vendor, sẽ gặp vấn đề khi update, nên hãy comment vào dự án để anh em code sau hiểu luồng còn maintain.
Bước 1: truy cập file vendor/unisharp/laravel-filemanager/public/js/script.js
Sửa biến sau để thay đổi tham số request khi gọi lên server lấy files:
var sort_type = 'alphabetic';
Sửa thành:
var sort_type = 'time';
Bước 2: truy cập file vendor/unisharp/laravel-filemanager/src/Controllers/ItemsController.php
Comment hoặc xóa hàm getItems() cũ của file ItemsController.php
/*public function getItems()
{
$currentPage = self::getCurrentPageFromRequest();
$perPage = $this->helper->getPaginationPerPage();
$items = array_merge($this->lfm->folders(), $this->lfm->files());
return [
'items' => array_map(function ($item) {
return $item->fill()->attributes;
}, array_slice($items, ($currentPage - 1) * $perPage, $perPage)),
'paginator' => [
'current_page' => $currentPage,
'total' => count($items),
'per_page' => $perPage,
],
'display' => $this->helper->getDisplayMode(),
'working_dir' => $this->lfm->path('working_dir'),
];
}*/
Sửa mã nguồn thành:
use Illuminate\Http\Request; // định nghĩa kiểu dữ liệu request để hứng tham số từ request
// sửa hàm getItems trong Controller
public function getItems(Request $request)
{
/* dd($request) => nếu dump biến này ra, chúng ta sẽ thấy parameter url được thay đổi từ alphabetic thành time nếu sửa đúng */
$currentPage = self::getCurrentPageFromRequest();
$perPage = $this->helper->getPaginationPerPage();
$files = $this->lfm->files();
if($request->sort_type=='time'){
$files = array_reverse($files);
}
$items = array_merge($this->lfm->folders(), $files);
return [
'items' => array_map(function ($item) {
return $item->fill()->attributes;
}, array_slice($items, ($currentPage - 1) * $perPage, $perPage)),
'paginator' => [
'current_page' => $currentPage,
'total' => count($items),
'per_page' => $perPage,
],
'display' => $this->helper->getDisplayMode(),
'working_dir' => $this->lfm->path('working_dir'),
];
}
Vậy là ok, chúc bạn thành công!
Tham khảo chi tiết tại link: https://stackoverflow.com/questions/47003766/laravel-filemanager-sort-by-time-default