Tạo trang có thể tùy biến các trường dễ dàng để tạo api cho trang full (ok)
Đọc thêm ở đây: https://chatgpt.com/c/683b9024-3934-8003-8610-d5dc1cd2f628
✅ Giải pháp: Dynamic Page + JSON Field + Builder UI + API
1. Cấu trúc DB: Bảng pages
Schema::create('pages', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->string('slug')->unique();
$table->json('fields')->nullable(); // chứa các trường tùy biến
$table->timestamps();
});
2. Dữ liệu mẫu trong fields (kiểu JSON)
{
"title": "Trang giới thiệu",
"image_url": "https://example.com/banner.jpg",
"content": "<p>Chúng tôi là công ty...</p>"
}
🧱 3. Giao diện tạo page: Builder UI
Bạn dùng các thành phần như:
Input text → map đến
fields.titleImage URL / File chọn → map đến
fields.image_urlWYSIWYG editor → map đến
fields.contentCác trường bạn chọn sẽ lưu chung vào
fields(json)
Giao diện dạng lặp:
Bạn có thể lưu $configFields trong DB hoặc config file PHP để tùy biến thêm.
4. API hiển thị nội dung
Kết quả trả về:
Bạn đang xây dựng hệ thống CMS với các trường tùy biến và bây giờ muốn hỗ trợ đa ngôn ngữ trong trường fields, cụ thể là lưu theo cấu trúc:
Dưới đây là hướng dẫn đầy đủ để cấu trúc fields đa ngôn ngữ và cập nhật controller, form và API.
✅ 1. Cấu trúc dữ liệu
Bạn giữ nguyên cột fields kiểu json, nhưng cấu trúc nó như sau:
✅ 2. Controller – store()
store()Giả sử bạn gửi từ frontend 1 trường fields_json có dạng:
Bạn không cần đổi gì nhiều, chỉ cần đảm bảo dữ liệu gửi về đúng format:
✅ 3. API – routes/web.php
Bạn có thể thêm lang làm query string hoặc route param:
✅ 4. Tùy chọn: Thêm helper trong model
Để dễ dùng trong Blade hoặc nơi khác:
5. Gợi ý frontend (JavaScript/Vue/React)
Gửi dữ liệu JSON như sau:
Tạo giao diện nhập liệu đa ngôn ngữ (tab "VI" / "EN")


app\Http\Controllers\Admin\PageController.php
routes\web.php
resources\views\admin\pages\create.blade.php

Giao diện đơn giản làm Dynamic Builder


routes\web.php
Dưới đây là một giao diện form nhập dữ liệu cho bảng pages với các fields linh hoạt như: sử dụng khái báo dạng mảng fields
pages với các fields linh hoạt như: sử dụng khái báo dạng mảng fieldsimage_url(chọn ảnh)subtitlecontent(textarea hoặc CKEditor)button_textbutton_link


app\Http\Controllers\Admin\PageController.php

routes\web.php
resources\views\admin\pages\create.blade.php
— Cập nhật hoàn chỉnh index, edit


Sau chỉnh sửa

Thử cập nhật bằng cách thêm một trường test12


Khi quay lại https://lva4.com/admin/pages/5/edit nó báo lỗi

có thể vì nó không phải dụng jsong như này

Chỉnh sửa giao diện create mới



Cập nhật lại code
resources\views\admin\pages\create.blade.php
resources\views\admin\pages\edit.blade.php
resources\views\admin\pages\index.blade.php
database\migrations\2025_06_02_025221_create_pages_table.php
routes\web.php
app\Http\Controllers\Admin\PageController.php
app\Models\Page.php
Xử lý thêm một bức ảnh để học tạo file riêng js để sử dụng



app\Http\Controllers\Admin\PageController.php
app\Models\Page.php
public\js\lfm.js
Thay vì sử dụng như này openLfm()
Tao sẽ sử dụng kiểu động openLfm('image_url', 'image_preview')
public\js\lfm.js
resources\views\admin\pages\create.blade.php
app\Http\Controllers\Admin\PageController.php
app\Models\Page.php
routes\web.php
Thêm trường nội dung tiếng việt , tiếng anh có thể upload ảnh


app\Http\Controllers\Admin\PageController.php
app\Models\Page.php
resources\views\admin\pages\create.blade.php
Để bạn chèn ảnh từ thư viện (Laravel File Manager) trực tiếp vào nội dung trong CKEditor


Chèn ảnh vào thư viện ở trình soạn thảo


resources\views\admin\pages\create.blade.php
public\js\lfm.js
app\Models\Page.php
app\Http\Controllers\Admin\PageController.php
routes\web.php
Sử dụng cho màn chỉnh sửa thêm ảnh, chèn ảnh

resources\views\admin\pages\edit.blade.php
Cập nhật lại bản create và edit để nó lưu vào databse đúng định dạng json en & vi
resources\views\admin\pages\create.blade.php
resources\views\admin\pages\edit.blade.php
routes\web.php
public\js\lfm.js
app\Models\Page.php
app\Http\Controllers\Admin\PageController.php
database\migrations\2025_06_02_025221_create_pages_table.php
Last updated
Was this helpful?