ការដាក់លេខ​ទំព័រ​ដែល​ភាសា​អង់គ្លេស​ហៅ​ថា pagination គឺ​ជា​ការចែក​បណ្តុំ​ទិន្នន័យ​ជា​ទំព័រ ហើយ​នៅ​ក្នុង​ទំព័រ​និមួយ​ៗ ​អាច​មាន​ចំនួន​ការផ្សាយ​អាស្រ័យ​ទៅ​តាម​ការកំណត់​របស់​អ្នក​និពន្ធ​ដែល​មាន​តួនាទី​ជា Admin ។ ​ចំនួន​ទំព័រ​គឺ​ជា​ផល​ចែក​រវាង​ចំនួន​ការផ្សាយ​ទាំងអស់​នឹង​ចំនួន​កំណត់​នៃ​ការផ្សាយ​សំរាប់​ទំព័រ​និមួយ​ៗ​។ ឧទាហរណ៍ បើ​ការផ្សាយ​ទាំងអស់​មាន​ចំនួន 100 និង​ចំនួន​កំណត់​នៃ​ការផ្សាយ​សំរាប់​ទំព័រ​និមួយ​ៗ​គឺ 10 ដូចនេះ​ផល​ចែក​រវាង​លេខ​ទាំងពីរ​នេះ​គឺ 100/10​ = 10 ​​​​​​​​ទំព័រ។ បើ​មាន​សំណល់​ក៏​ត្រូវ​គិត​ថា​មួយ​ទំព័រ​ដែរ​​ដូច​ជា 101/10 = 11 ទំព័រ​។ លេខ​ចែក​របៀប​នេះ​បាន​មក​ពី​ក្បួន​គណិតវិទ្យា Math.ceil( ) នៅ​ក្នុង​កញ្ចប់ JavaScript ។

 

ការរាប់ចំនួន​ការផ្សាយ​សរុប​ត្រូវ​ធ្វើ​ឡើង​​ដោយ​វិធី count( ) នៅ​ក្នុង​កញ្ចប់ Prisma ដែល​ត្រូវ​បាន​បង្កើត​ឡើង​នៅ​ក្នុង​តម្រា src/data/post.js ។

 

// src/data/post.js

class Post{
    async count(req, query={}){
        return await req.prisma.post.count(query)
    }
    ...
}

 

ការបង្កើត​លេខ​ទំព័រ​ធ្វើ​ឡើងដោយ​យោង​ទៅ​តាម​ចំនួន​ទំព័រ​សរុប​បាន​មក​ពី​ផលចែក​ខាង​ដើម និង​បំបែក​វា​អោយ​ទៅ​ជា​កំរង​ទិន្នន័យ​មួយ​ដែល​នៅ​ក្នុង​នោះ​ ធាតុ​និមួយ​ៗ​ជា​លេខ​សំរាប់​ទំព័រ​និមួយ​ៗ​។

 

<!--src/layouts/admin/Bottom.astro-->
...
<div class="bg-teal-100 py-2 mb-5">
        <span class="flex justify-center">
            <span>​​​​​​​​​​​​​​​​​​​​​ទំព័រ </span>&nbsp;&nbsp;
            <select id="page" class="border border-black pl-1" data-page={pagination.currentPage}>
                {pagination.numberPage && 
                <>
                {[...Array(pagination.numberPage).keys()].map(number => (<option>{++number}</option>))}
                </>
                }
            </select>&nbsp;&nbsp; 
            <span>នៃ {pagination.numberPage}</span>
        </span>
        <script>
            $('#page').on('change', () => {
                window.location.href = "/admin/?page="+$( "#page option:selected" ).text()
            })
            const changeSelected = (e) => {
                    const text = $('#page').attr('data-page')
                    const $select = document.querySelector('#page')
                    const $options = Array.from($select.options)
                    if(text){
                        const optionToSelect = $options.find(item => item.text === text)
                        optionToSelect.selected = true
                    }

                    const page = $( "#page option:selected" ).text()
                    $('.edit').each(function(){
                        const link = $(this).attr('href')+"?page="+page
                        $(this).attr('href', link)
                    })

                    $('.delete').each(function(){
                        const link = $(this).attr('href')+"?page="+page
                        $(this).attr('href', link)
                    })
                    
                    const url = $('#form').attr('action')+"?page="+page
                    $('#form').attr('action', url)
                }

            changeSelected()
        </script>
</div>

 

ការស្រង់​យក​ទិន្នន័យ​សំរាប់​ទំព័រ​និមួយ​ៗ​ ធ្វើ​ឡើង​ដោយ​អាស្រ័យ​ទៅ​តាមលេខ​របស់​ទំព័រទិន្នន័យ​ គឺ​ត្រូវ​យក​លេខ​ទំព័រ​មក​គុន​នឹងចំនួន​ការផ្សាយ​​សំរាប់​ទំព័រ​និមួយ​ៗ​។ បើ​លេខ​ទំព័រ​គឺ 3 និង​ចំនួន​ទិន្នន័យ​សំរាប់​ទំព័រ​និមួយ​ៗ​គឺ 10 ដូចនេះ​យើង​ត្រូវ​រំលង​ទិន្នន័យ​ចំនួន 10*(3-1) ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​នៅក្នុង​មូលដ្ឋាន​​ទិន្នន័យ MongoDB ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​មុន​នឹង​ស្រង់​យក​ទិន្នន័យ​សំរាប់​​ទំព័រ​លេខ 3 នេះ​។

 

// src/data/post.js

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

        return posts
    }
    ...
}

 

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

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