ការកែប្រែ​ទំព័រ​ស្តាទិក​ក៏​ត្រូវ​ធ្វើ​ឡើង​ជា​ពីរ​ដំណាក់កាល​ដែរ ដំណាក់កាល​ទី​មួយ​គឺ​ត្រូវ​ស្រង់​យក​ទិន្នន័យ​នៃ​ទំព័រ​ស្តាទិក​ត្រូវ​កែប្រែ​​មក​ដាក់​បង្ហាញ​នៅ​លើ​គំរូ​ទំព័រ​ស្តាទិក​។ ដំណាក់កាល​ទី​ពីរ​គឺ​ការកែប្រែ​ទិន្នន័យ​នៃ​ទំព័រ​នេះ និង​បញ្ជូន​វា​ទៅ​រក្សា​ទុក​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ MongoDB ជំនួស​អោយ​ទិន្នន័យ​នៃ​ទំព័រ​ស្តាទិក​ចាស់​។ ការស្រង់​យក​ទិន្នន័យ​នៃ​ទំព័រ​ស្តាទិក អាច​ត្រូវ​ធ្វើ​ឡើង​នៅ​ក្នុង​​ឯកសារ index.astro នៅ​ក្នុង​ថត src/pages/admin/page ។

 

<!--src/pages/admin/page/index.astro-->
---
import Base from "../../../layouts/admin/Base.astro"
import Page from "../../../layouts/admin/Page.astro"
const { userAuth, prisma, setting } = Astro.locals
if(!userAuth?.userId){ return Astro.redirect('/login') }

import page from "../../../data/page.js"
const total = await page.count({prisma})
const numberPage = Math.ceil(total/setting.adminItems)
const currentPage = Astro.url.searchParams.get('page') || ''
const pagination = {total, numberPage, currentPage}
if(currentPage){
    var items = await page.paginate({prisma, currentPage}, setting.adminItems)
}else{
    var items = await page.getItems({prisma}, setting.adminItems)
}
const pages = items.map((page)=>{page.date = new Date(page.date).toLocaleDateString('it-IT')
                                return page })
---

<Base pageTitle="ទំព័រ​ស្តាទិក" pagination={pagination} items={pages} type="page">
    <Page/>
</Base>

 

<!--src/layouts/admin/Page.astro-->
---
const { item=0 } = Astro.props
---

<script is:inline src="/scripts/ckeditor/ckeditor.js"></script>

<section class="Page w-full">
    {item ?
    <form id="form" action={"/api/admin/page/update/"+item.id} method="post">
        <input class="border w-full px-2 py-1 border-slate-300"
            type="text" name="title" value={item.title} required placeholder="ចំណងជើង" 
        />
        <textarea class="" name="content" id="editor">{item.content}</textarea>
        <div class="grid md:grid-cols-[auto_auto_15%] grid-cols-1"> 
            <input class="border px-2 py-1 border-slate-300"
                type="text" value={item.thumb} name="thumb" required placeholder="រូបតំណាង" 
            />
            <input class="border px-2 py-1 border-slate-300" value={item.date}
                type="datetime-local" step="1" name="datetime" required 
            />
            <input class="border border-slate-300 px-2 py-1 hover:opacity-75 bg-slate-200 hover:cursor-pointer"
                type="submit" value="ចុះ​ផ្សាយ" 
            />
        </div>
    </form>:
    
    <form id="form" action="/api/admin/page/create" method="post">
        <input class="border w-full px-2 py-1 border-slate-300"
            type="text" name="title" required placeholder="ចំណងជើង" 
        />
        <textarea class="" name="content" id="editor"></textarea>
        <div class="grid md:grid-cols-[auto_auto_15%] grid-cols-1"> 
            <input class="border px-2 py-1 border-slate-300"
                type="text" name="thumb" required placeholder="រូបតំណាង" 
            />
            <input class="border px-2 py-1 border-slate-300"
                type="datetime-local" step="1" name="datetime" required 
            />
            <input class="border border-slate-300 px-2 py-1 hover:opacity-75 
                bg-slate-200 hover:cursor-pointer" type="submit" value="ចុះ​ផ្សាយ" 
            />
        </div>
    </form>
    }

    <script>
        $('.Page input').on('change', () => {
            window.onbeforeunload = save_data_check
        })
        
        ckeditor.model.document.on( 'change', () => {
            window.onbeforeunload = save_data_check
        } )

        $('.Page #form').on('submit', () => {
            window.onbeforeunload = null
        })

        function save_data_check(){        
            return "Your changes may not be saved."
        }
    </script>
</section>

<script is:inline src="/scripts/ckeditor/config.js"></script>
<style is:global>
    .ck-editor__editable {
        min-height: 270px;
    }
</style>

 

ដូចគ្នា​ដែរ ការប្រែទិន្នន័យ​នៃ​ទំព័រ​ស្តាទិក​ណា​មួយ​អាច​ត្រូវ​ធ្វើ​ឡើង​បាន​តែ​ចំពោះ​អ្នក​និពន្ធ​ទាំងឡាយ​ណា​ដែល​មាន​តួនាទី​ជា Admin តែ​ប៉ុណ្ណោះ អ្នក​ក្រៅ​ពី​នេះ នឹង​មិន​អាច​កែប្រែ​ទិន្នន័យ​ប្រភេទ​នេះ​បាន​ឡើយ​។ មួយវិញទៀត ការកែប្រែទំព័រ​ស្តាទិក​ត្រូវ​ធ្វើឡើង​នៅ​ក្នុង​ក្បួន​ចុង​ផ្លូវ​ឬ API Endpoint នៅ​ក្នុង​ថត src/pages/api/admin/page/update នៅ​ក្នុង​​ឯកសារ [id].js ។ ប៉ារ៉ាម៉ែត id មាន​តួ​នាទី​សំខាន់​ណាស់​ក្នុងការ​ជំនួស​ទិន្នន័យ​ចាស់​​ដែល​មាន​អត្តសញ្ញាណ​ដូច​គ្នា ដោយ​ទិន្នន័យ​កែប្រែ​ថ្មី​​​នៅ​ក្នុង​មូលដ្ឋាន​ទិន្នន័យ MongoDB ។

 

// src/pages/api/admin/page/update/[id].js

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

export async function POST({ locals, redirect, params, request, url}){
    const userAuth = locals.userAuth
    const userAdmin = locals.userAdmin
    const prisma = locals.prisma
    let currentPage = url.searchParams.get('page') || ''
    if(currentPage){
        currentPage = "?page=" + currentPage
    }

    if(userAuth?.userId){
        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.update({ prisma, body, params })
            }
        }

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

    return redirect('/login', 302)
}

 

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

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