ភាព​ខុស​គ្នា​រវាង​គំរូ​ទំព័រ​ស្តាទិក​​និង​ទំព័រស្តាទិក គឺ​ស្ថិត​នៅ​ត្រង់​ថា គំរូ​ទំព័រ​ស្តាទិក​ជា​ពុម្ពគំរូ​សំរាប់​បង្កើត​ទំព័រ​ស្តាទិក​។ នៅ​ក្នុង​គំរូទំព័រ​ស្តាទិក មាន​កន្លែង​ជា​ច្រើន​សំរាប់​ទទួល​យក​ទិន្នន័យដើម្បី​បង្កើត​ជា​​សំណុំទិន្នន័យ​​មួយ​តំណាង​អោយ​ទំព័រ​ស្តាទិក​មួយ​ យក​ទៅ​រក្សា​ទុក​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ MongoDB ។

 

ក្រោយ​ពី​បញ្ចូល​ទិន្នន័យ​ទៅ​ក្នុង​ទំរង់បែបបទ​នៃ​គំរូ​ទំព័រ​ស្តាទិក​រួច​ហើយ ការចុច​ប៊ូតុង «ចុះផ្សាយ» នឹង​ធ្វើ​អោយ​ទិន្នន័យ​ទាំងនោះ​ត្រូវ​បញ្ជូន​ទៅ​ក្បួន​ចុង​ផ្លូវ​ឬ API Endpoint នៅ​ក្នុង​ថត src/api/admin/page ។ ទិន្នន័យ​ទាំងនោះ​នឹង​ត្រូវ​ស្រង់​យក​ពី​​សំណុំ​ទិន្នន័យ formData ក្រោយ​ពី​បាន​ត្រួត​ពិនិត្យ​តួនាទី​របស់​អ្នក​និពន្ធថា​ពិត​ជា​ Admin ពិត​ប្រាកដ​មែន​។

 

ទោះ​បី​ជា​ទិន្នន័យ​ទាំងនោះ​ត្រូវ​បាន​ត្រួត​ពិនិត្យ​នៅ​ក្នុង​ browser រួច​ម្តង​ហើយ​ក៏​ដោយ តែ​នៅ​លើ server ទិន្នន័យ​ទាំងនោះ​នឹង​ត្រូវ​បាន​ត្រួត​ពិនិត្យ​ជា​ថ្មី​ម្តង​ទៀត​នៅ​ក្នុង​ក្បួន​ចុង​ផ្លូវ​ឬ API Endpoint មាន​ឈ្មោះ​ថា create.js ។ ហើយ​បើ​ទិន្នន័យ​ទាំងនោះ​ពិត​ជា​ត្រឹមត្រូវ​ហើយ វានឹងត្រូវ​បញ្ជូន​​ទៅ​បញ្ចូល​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ MongoDB បង្កើត​ជា​ទិន្នន័យ​នៃ​ទំព័រ​ស្តាទិក​មួយ​នៅ​ក្នុង​នោះ​។ បើ​គ្មាន​បញ្ហា​អ្វី​ទេ ទិន្នន័យ​ដែល​ជា​ទំព័រ​ស្តាទិក​នោះ នឹង​ត្រូវ​ស្រង់​យក​មក​បង្ហាញ​នៅ​ផ្នែក​ខាង​ក្រោម​នៃ​គំរូ​ទំព័រ​ស្តាទិក​។

 

// src/pages/api/post/create.js

import page from "../../../../data/page.js"

export async function POST({ locals, request, redirect }){
    const prisma = locals.prisma
    const userAdmin = locals.userAdmin

    if(userAdmin){
        const data = await request.formData()
        const title = data.get('title')
        const content = data.get('content')
        const thumb = data.get('thumb')
        const datetime = data.get('datetime')
    
        if(title && thumb && datetime){
            const body = { title, content, thumb, datetime }
            await page.create({ prisma, body })
        }
    }

    return redirect("/admin/page", 302)
}

 

នៅ​ក្នុង​ក្បួន​ចុង​ផ្លូវ​ឬ​ API Endpoint ខាង​លើ មាន​ការនាំ​ចូល​ក្បួន​ខ្នាត​នៅ​ក្នុង​ឯកសារ src/data/page.js យក​មក​ប្រើប្រាស់ក្នុង​​ការបង្កើត​ទិន្នន័យ​នៃ​ទំព័រ​ស្តាទិក​។ គ្រប់​ក្បួន​ខ្នាត​នៅ​ក្នុង​គ្រប់​ឯកសារ​នៅ​ក្នុង​ថត src/data ​​​​​​​​​​​ត្រូវប្រើប្រាស់​សំរាប់​តែភ្ជាប់​ទំនាក់​ទំនង​ជា​មួយ​នឹង​មូលដ្ឋាន​ទិន្នន័យ MongoDB ។

 

// src/data/page.js

class Page{
    async count(req, query={}){
        return await req.prisma.page.count(query)
    }

    async create(req){
        const new_page = {
            title: req.body.title,
            content: req.body.content,
            thumb: req.body.thumb,
            date: req.body.datetime,
        }
        
        await req.prisma.page.create({ data: new_page })
    }

    async delete(req){
        await req.prisma.page.delete({ where: {id: req.params.id } })
    }

    async getItems(req, amount){
        return await req.prisma.page.findMany({ 
            take: amount, 
            orderBy: [{ date: "desc" }, { id: "desc" }]
        })
    }

    async paginate(req, amount){
        const pages = await req.prisma.page.findMany({ 
            orderBy: [{ date: "desc" }, { id: "desc" }],
            skip: amount * (parseInt(req.currentPage) - 1),
            take: amount
        })

        return pages
    }
}

export default new Page()

 

Netlify: https://khmerweb-dynamic-blog.netlify.app/admin/page

GitHub: https://github.com/Sokhavuth/dynamic-blog