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

 

ដោយ​សារ​យើង​​បាន​បង្កើតគំរូ​នៃ​ផ្នែកជាច្រើន​សំរាប់​គំរូ​​ទំព័រ​ការផ្សាយ ហើយ​គំរូ​ទំព័រ​ស្តាទិក​នឹង​​យក​ផ្នែក​ទាំងនោះ​មក​ប្រើប្រាស់​ជា​មូលដ្ឋាន​គ្រឹះ ដូចនេះ​ការបង្កើត​គំរូ​ទំព័រ​ស្តាទិក​គ្មាន​អ្វី​ជា​បញ្ហា​ឡើយ។ អ្វី​ដែល​ថ្មី​សំរាប់​គំរូ​ទំព័រ​ស្តាទិក គឺ​ផ្នែក​ដែល​ប្រើប្រាស់ ckeditor ក្នុង​ការសរសេរ​អត្ថបទ។ 

 

<!--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>

 

យើង​អាច​ដាក់​ឈ្មោះ​ផ្នែក​សរសេរ​អត្ថបទ​នេះ​ថា Page.astro ស្ថិត​នៅ​ក្នុង​ថត src/layouts/admin ។ ទំព័រ​ដើម​នៃ​គំរូ​ទំព័រ​ស្តាទិក​ដែល​ជា​ឯកសារ index.astro នៅ​ក្នុង​ថត src/pages/admin/page ​ផ្សំ​ឡើង​ដោយ​​ផ្នែក Base.astro និង​ផ្នែក Page.astro នៅ​ក្នុង​ថត src/layouts/admin ។ ផ្នែកគំរូ​ទំព័រ Page.astro ត្រូវ​បាន​ដាក់​បញ្ចូល​ទៅ​ក្នុង​ផ្នែក​គំរូ​ទំព័រ Base.astro ។

 

<!--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>

 

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

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