1. Mở đầu
Các trang web về quản trị nội dung (CMS) đều nhúng một trình soạn thảo editor, cho phép người dùng làm việc với văn bản, các hiệu ứng như phông chữ, màu sắc, cùng với hình ảnh khiến cho việc soạn thảo văn bản được thuận tiện hơn. Một số trình soạn thảo phổ biến và miễn phí trên internet như tinyMCE, CKeditor, SummerNote… Ở đây trong bài viết này, tôi muốn giới thiệu với bạn về quá trình cài đặt trình soạn thảo tinyMCE. Không chỉ trình soạn thảo, tôi sẽ tích hợp laravel filemanager vào trình soạn thảo tinyMCE cho phép quản lý các file khi upload.
2. TinyMCE
Giới thiệu
- TinyMCE là trình soạn thảo WYSIWYG dựa trên web nguồn mở phổ biến nhất thế giới.
- Được hàng triệu nhà phát triển tin cậy và yêu thích và được tích hợp vào hàng nghìn ứng dụng, chẳng hạn như:
- Hệ thống quản lý nội dung (CMS)
- Hệ thống quản lý học tập (LMS)
- Hệ thống quản lý quan hệ khách hàng (CRM) và tự động hóa tiếp thị
- Hệ thống tiếp thị qua email
- Tạo nội dung trong hệ thống SaaS.
Cài đặt TinyMCE
- Bước 1: Cài đặt thông qua package manager
1 2 3 4 | npm install tinymce <span class="token constant">OR</span> yarn add tinymce |
- Bước 2: Sử dụng webpack mix
1 2 3 4 5 6 7 8 9 10 11 | mix<span class="token punctuation">.</span><span class="token function">js</span><span class="token punctuation">(</span><span class="token punctuation">[</span> <span class="token string">'resources/js/app.js'</span><span class="token punctuation">,</span> <span class="token string">'node_modules/tinymce/tinymce.min.js'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'public/js/app.js'</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">sass</span><span class="token punctuation">(</span><span class="token string">'resources/sass/app.scss'</span><span class="token punctuation">,</span> <span class="token string">'public/css'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mix<span class="token punctuation">.</span><span class="token function">copyDirectory</span><span class="token punctuation">(</span><span class="token string">'node_modules/tinymce/plugins'</span><span class="token punctuation">,</span> <span class="token string">'public/js/tinymce/plugins'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mix<span class="token punctuation">.</span><span class="token function">copyDirectory</span><span class="token punctuation">(</span><span class="token string">'node_modules/tinymce/themes'</span><span class="token punctuation">,</span> <span class="token string">'public/js/tinymce/themes'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mix<span class="token punctuation">.</span><span class="token function">copyDirectory</span><span class="token punctuation">(</span><span class="token string">'node_modules/tinymce/icons'</span><span class="token punctuation">,</span> <span class="token string">'public/js/tinymce/icons'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mix<span class="token punctuation">.</span><span class="token function">copyDirectory</span><span class="token punctuation">(</span><span class="token string">'node_modules/tinymce/skins'</span><span class="token punctuation">,</span> <span class="token string">'public/js/tinymce/skins'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Ở đây ta mix file node_modules/tinymce/tinymce.min.js vào chung trong file public/js/app.js
và copy các plugins, themes, icons, skins ra ngoài thư mục public để tiny có thể gọi đến.
- Bước 3: Tạo view và route
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token doctype"><!DOCTYPE html></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>width=device-width, initial-scale=1.0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>meta</span> <span class="token attr-name">http-equiv</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>X-UA-Compatible<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ie=edge<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>title</span><span class="token punctuation">></span></span>Timymce<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>title</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>head</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>post<span class="token punctuation">"</span></span> <span class="token attr-name">enctype</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>multipart/form-data<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> @csrf <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>textarea</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>timymce<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>tinymce<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>textarea</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>button</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Submit<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>button</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>{{ mix('js/app.js') }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script" /><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript"> tinymce<span class="token punctuation">.</span>baseURL <span class="token operator">=</span> <span class="token string">"js/tinymce"</span><span class="token punctuation">;</span> tinymce<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> selector<span class="token operator">:</span> <span class="token string">"textarea#timymce"</span><span class="token punctuation">,</span> toolbar<span class="token operator">:</span> "insertfile undo redo <span class="token operator">|</span> styleselect <span class="token operator">|</span> bold italic <span class="token operator">|</span> alignleft aligncenter alignright alignjustify <span class="token operator">|</span> bullist numlist outdent indent"<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>script</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>body</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>html</span><span class="token punctuation">></span></span> |
1 2 3 4 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'/tinymce'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">view</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'tinymce'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Giao diện của tinymce sau khi tích hợp vào textarea.
3. Laravel filemanager
Giới thiệu
- Xử lý file là một trong những quy trình tiêu chuẩn trong hầu hết các dự án web, nhưng không dễ dàng để xây dựng từ đầu: file extensions, uploads, thumbnails, protection.
- Các tính năng:
- Tích hợp CKEditor và TinyMCE
- Kiểm tra dữ liệu updaload.
- Cắt và thay đổi kích thước hình ảnh
- Thư mục công khai và riêng tư cho nhiều user
- Có thể tùy chỉnh routes, middlewares, views, và đường dẫn folder.
- Hỗ trợ hai loại : files and images. Mỗi loại hoạt động trong thư mục khác nhau.
- Các ngôn ngữ được hỗ trợ : ar, bg, de, el, en, es, fa, fr, it, he, hu, nl, pl, pt-BR, pt_PT, ro, ru, sv, tr, zh-CN, zh-TW.
Cài đặt
- Yêu cầu:
- php >= 5.4
- exif extension
- fileinfo extension
- GD Library >=2.0 or Imagick PHP extension >=6.5.7
- Laravel 5
- Tiến hành cài đặt
- Bước 1: Cài đặt package
unisharp/laravel-filemanager
bằng composer
1 2 | composer require unisharp/laravel-filemanager |
- Bước 2: Đưa các config và assets của package ra ngoài
1 2 3 | php artisan vendor:publish --tag<span class="token operator">=</span>lfm_config php artisan vendor:publish --tag<span class="token operator">=</span>lfm_public |
Bước 3: Clear cache
1 2 3 | php artisan route:clear php artisan config:clear |
Bước 4: Sysmlink tài nguyên từ storage ra ngoài public để laravel filemanager có thể truy cập đến
1 2 | php artisan storage:link |
Bước 5: Tạo các route cần thiết cho laravel filemanager
1 2 3 4 | Route<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">group</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token single-quoted-string string">'prefix'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'laravel-filemanager'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'middleware'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token single-quoted-string string">'web'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'auth'</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token package">UniSharp<span class="token punctuation"></span>LaravelFilemanager<span class="token punctuation"></span>Lfm</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">routes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Thử vào trang demo nào
{BASE_URL}/laravel-filemanager/demo
File config lfm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'use_package_routes'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">true</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'allow_private_folder'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">true</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'private_folder_name'</span> <span class="token operator">=</span><span class="token operator">></span> UniSharp<span class="token package">LaravelFilemanager<span class="token punctuation"></span>Handlers<span class="token punctuation"></span>ConfigHandler</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'allow_shared_folder'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'shared_folder_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'shares'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'folder_categories'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'file'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'folder_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'files'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'startup_view'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'grid'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'max_size'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">50000</span><span class="token punctuation">,</span> <span class="token comment">// size in KB</span> <span class="token single-quoted-string string">'valid_mime'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'image/jpeg'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/pjpeg'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/png'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/gif'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/svg+xml'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'folder_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'photos'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'startup_view'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'list'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'max_size'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">50000</span><span class="token punctuation">,</span> <span class="token comment">// size in KB</span> <span class="token single-quoted-string string">'valid_mime'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'image/jpeg'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/pjpeg'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/png'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/gif'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/svg+xml'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'application/pdf'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'text/plain'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'paginator'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'perPage'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'disk'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'public'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'rename_file'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'alphanumeric_filename'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'alphanumeric_directory'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'should_validate_size'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'should_validate_mime'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'over_write_on_duplicate'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'should_create_thumbnails'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token boolean constant">false</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'thumb_folder_name'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'thumbs'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'raster_mimetypes'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'image/jpeg'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/pjpeg'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'image/png'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'thumb_img_width'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token comment">// px</span> <span class="token single-quoted-string string">'thumb_img_height'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token number">200</span><span class="token punctuation">,</span> <span class="token comment">// px</span> <span class="token single-quoted-string string">'file_type_array'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'pdf'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Adobe Acrobat'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'doc'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Microsoft Word'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'docx'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Microsoft Word'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'xls'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Microsoft Excel'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'xlsx'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Microsoft Excel'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'zip'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Archive'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'gif'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'GIF Image'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'jpg'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'JPEG Image'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'jpeg'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'JPEG Image'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'png'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'PNG Image'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'ppt'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Microsoft PowerPoint'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'pptx'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'Microsoft PowerPoint'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'php_ini_overrides'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'memory_limit'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'256M'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> </span> |
- Một số cấu hình cần lưu ý:
paginator
: Hiển thị số lượng mỗi trang.disk
: Nơi lưu trữ ảnh (với giá trịpublic
: Sẽ lưu dưới local,s3
: Sẽ lưu trữ trên cloud dựa vào config trong filemanager.php)should_validate_size
: validate file upload.should_validate_mime
: validate minetype.raster_mimetypes
: Định nghĩa minetype được upload.
- Các config còn lại các bạn có thể tự tìm hiểu…
4. Tích hợp laravel filemanager vào tinymce
- Tinymce cũng có công cụ quản lý file mạnh mẽ là https://www.tiny.cloud/drive nhưng muốn sử dụng chức năng này thì phải tra phí và nó sẽ lưu trên server của nó mình không quản lý được. Vậy nên laravel filemanager là một lựa chọn không tệ để quản lý file.
- Bước 1: Sử dụng plugins image, imagetool và toolbar image
- Cấu hình tinymce sẽ như sau:
1 2 3 4 5 6 7 8 9 10 | tinymce<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> selector<span class="token operator">:</span> <span class="token string">"textarea#timymce"</span><span class="token punctuation">,</span> plugins<span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"image imagetool"</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> toolbar<span class="token operator">:</span> "insertfile undo redo <span class="token operator">|</span> styleselect <span class="token operator">|</span> bold italic <span class="token operator">|</span> lignleft aligncenter alignright alignjustify <span class="token operator">|</span> bullist numlist outdent indent <span class="token operator">|</span> image"<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Bước 2: Sử dụng function
file_picker_callback(callback, value, meta)
để custom lại dialog chọn image file click vào biểu tượng uploadcallback
: Một callback được gọi, khi bạn có tệp nó mong đợi giá trị mới cho trường làm đối số đầu tiên và tùy chọn thông tin meta cho các trường khác trong dialog làm đối số thứ hai.value
: Giá trị hiện tại của trường bị tác động.meta
: Đối tượng chứa giá trị của các trường khác trong dialog được chỉ định.- Tiny chỉ cung cấp cho cung ta cái hook, còn việc triển khai như thế nào thì mình lại tự code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | tinymce<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">{</span> selector<span class="token operator">:</span> <span class="token string">"textarea#timymce"</span><span class="token punctuation">,</span> plugins<span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">"image imagetool"</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">,</span> toolbar<span class="token operator">:</span> "insertfile undo redo <span class="token operator">|</span> styleselect <span class="token operator">|</span> bold italic <span class="token operator">|</span> alignleft aligncenter alignright alignjustify <span class="token operator">|</span> bullist numlist outdent indent <span class="token operator">|</span> image"<span class="token punctuation">,</span> <span class="token function-variable function">file_picker_callback</span><span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">callback<span class="token punctuation">,</span> value<span class="token punctuation">,</span> meta</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> x <span class="token operator">=</span> window<span class="token punctuation">.</span>innerWidth <span class="token operator">||</span> document<span class="token punctuation">.</span>documentElement<span class="token punctuation">.</span>clientWidth <span class="token operator">||</span> document<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>clientWidth<span class="token punctuation">;</span> <span class="token keyword">let</span> y <span class="token operator">=</span> window<span class="token punctuation">.</span>innerHeight<span class="token operator">||</span> document<span class="token punctuation">.</span>documentElement<span class="token punctuation">.</span>clientHeight<span class="token operator">||</span> document<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">'body'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>clientHeight<span class="token punctuation">;</span> <span class="token keyword">let</span> type <span class="token operator">=</span> <span class="token string">'image'</span> <span class="token operator">===</span> meta<span class="token punctuation">.</span>filetype <span class="token operator">?</span> <span class="token string">'Images'</span> <span class="token operator">:</span> <span class="token string">'Files'</span><span class="token punctuation">,</span> url <span class="token operator">=</span> <span class="token string">'/laravel-filemanager?editor=tinymce5&type='</span> <span class="token operator">+</span> type<span class="token punctuation">;</span> tinymce<span class="token punctuation">.</span>activeEditor<span class="token punctuation">.</span>windowManager<span class="token punctuation">.</span><span class="token function">openUrl</span><span class="token punctuation">(</span><span class="token punctuation">{</span> url <span class="token operator">:</span> url<span class="token punctuation">,</span> title <span class="token operator">:</span> <span class="token string">'Filemanager'</span><span class="token punctuation">,</span> width <span class="token operator">:</span> x <span class="token operator">*</span> <span class="token number">0.8</span><span class="token punctuation">,</span> height <span class="token operator">:</span> y <span class="token operator">*</span> <span class="token number">0.8</span><span class="token punctuation">,</span> <span class="token function-variable function">onMessage</span><span class="token operator">:</span> <span class="token punctuation">(</span><span class="token parameter">api<span class="token punctuation">,</span> message</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">callback</span><span class="token punctuation">(</span>message<span class="token punctuation">.</span>content<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
- Đầu tiên
file_picker_callback
sẽ lấy with, hieght của màn hình hiện tại, để tính toán kích thước của dialog khi upload. - Tiếp theo sẽ kiểm tra file type và sinh ra một url.
- Open một dialog cho phép chọn ảnh.
url
: Giá trị vừa được sinh ra ở trên.title
: Tiêu đề của dialog.width
: Chiều rộng của dialog.height
: Chiều cao của dialog.onMessage
: Khi chọn ảnh trong filemanager xong thì sẽ trả về link ảnh cho dialog của tinymce.
- Bây giờ thử demo một chút.