នៅ​ពេល​ដែល​គេហទំព័រ​របស់​យើង​មាន​កាផ្សាយ​កាន់​តែ​ច្រើនឡើង យើង​មិន​អាច​បង្ហាញ​ការផ្សាយ​ទាំងអស់​នៅ​លើ​ទំព័រដើម​បាន​ឡើយ យើង​ចាំចាច់​ត្រូវ​បែង​ចែក​ការផ្សាយ​ទាំងនោះ​ជា​ច្រើនទំព័រ ហើយ​ការផ្សាយ​នៅ​​ក្នុង​ទំព័រ​និមួយៗ ​ត្រូវ​មាន​​ចំនួន​កំណត់។ ទាក់ទង​នឹង​បញ្ហា​នេះ កញ្ចប់ Astro.js បាន​ជួយ​សំរួល​​ដល់​ការបង្កើត​ទំព័រ​ទាំងឡាយ ដោយ​បានផ្តល់នូវ​​​ក្បួន​ពិសេស​ម៉្យាង​មាន​ឈ្មោះ​ថា paginate( ) ក្នុង​ការបែងចែក​ការផ្សាយ​ជា​ទំព័រ និង​លក្ខណៈ​ពិសេស​មួយ​ចំនួនទៀត​ជួយ​សំរួល​ដល់​ការបង្កើតទំព័រ​។ ក្បួន paginate( ) នឹង​ត្រូវ​ផ្តល់​អោយ​ទៅ​ក្បួន getStaticPaths( ) ជា​ស្វ័យប្រវត្តិ ដែល​នៅ​ក្នុង​នោះ ក្បួន paginate( ) នឹងត្រូវ​យក​ទៅ​ប្រើ និង​ត្រូវទទួល​​បាន​នូវ​ដំណឹង​ដែល​ជា​ការផ្សាយ​សរុប​ទាំងអស់ និងដំណឹង​ដែលជា​ចំនួន​កំណត់​នៃ​ការផ្សាយ​សំរាប់​ទំព័រ​និមួយ​ៗ​។

 

<!--src/components/Pagination.astro-->
---
const { page } = Astro.props
---
<section class="Home region">
    <div class="container">
        {page.data.map((post)=>(
            <div class="wrapper">
                <a href=`/post/${post.slug}`>
                    <img src={post.data.thumb} />
                    <img class="play-icon" src="/images/play.png" />
                </a>
                <div class="date">{post.data.pudate}</div>
                <a class="title" href=`/post/${post.slug}`>
                    <div >{post.data.title}</div>
                </a>
            </div>
        ))}
    </div>
    <div class="pagination">
        <span>ទំព័រ </span>
        <select data-page={page.currentPage}>
            {[...Array(page.lastPage).keys()].map((pageNumber)=>(
                    <option>{pageNumber+1}</option>
                ))
            }
        </select>
        <span> នៃ {page.lastPage}</span>
    </div>
</section>

<script>
    const currentPage = $('.pagination select').attr('data-page')
    $('.pagination select').val(currentPage)
    $( ".pagination select" ).on( "change", function(event) {
        document.location = `/${event.target.value}`
    })
</script>

<style>
.Home .container{
    display: grid;
    grid-template-columns: repeat(4, calc(100% / 4 - 11.25px));
    grid-gap: 30px 15px;
    padding: 30px 0;
}
.Home .container .wrapper a{
    position: relative;
    padding-top: 56.25%;
    overflow: hidden;
    width: 100%;
    display: block;
}
.Home .container .wrapper a img{
    position: absolute;
    width: 100%;
    min-height: 100%;
    top: 0;
    left: 0;
}
.Home .container .wrapper a .play-icon{
    width: auto;
    min-height: auto;
    width: 15%;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%)
}
.Home .container .wrapper .title{
    padding-top: 0;
}
.Home .container .wrapper .title div{
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.Home .pagination{
    display: block;
    text-align: center;
}
@media only screen and (max-width:600px){
    .Home .container{
        grid-template-columns: 100%;
        padding: 30px 10px;
    }
}
</style>

 

<!--src/pages/[page].astro-->
---
import Base from "../layouts/Base.astro"
import Pagination from "../components/Pagination.astro"
import { getCollection } from 'astro:content'
export async function getStaticPaths({paginate}){
    const posts = await getCollection('posts')
    posts.sort((a, b)=>b.data.pudate-a.data.pudate)
    return paginate(posts, {pageSize: 24})
}
const { page } = Astro.props
---
<Base pageTitle="ទំព័រ​ដើម" pageURL="/" >
    <Pagination page={page}/>
</Base>

 

ជាដំបូង យើង​ចាំបាច់​ត្រូវ​បង្កើត​ផ្លូវ​ឌីណាមិកមួយ​ដែល​ត្រូវ​តែ​មាន​ប៉ារ៉ាម៉ែត​ជា​ពាក្យ​ថា page នៅ​ក្នុង​​នោះ ឧទាហរណ៍​ដូច​ជា [page].astro ជាដើម​។ ឯកសារ [page].astro នេះ​អាច​ត្រូវ​រក្សា​ទុក​នៅ​ក្នុង​ថត src/pages ដែល​នឹង​ត្រូវ​យក​ទៅ​ប្រើសំរាប់​ផ្លូវ “/1”, “/2", “/3” ជា​ដើម​។ លេខ​សំរាប់​ផ្លូវ​នេះ គឺ​ជា​លេខ​របស់​ទំព័រ​និមួយ​ៗ​ ដែល​នឹង​ត្រូវ​ផ្តល់​អោយ​ទៅ​ប៉ារ៉ាម៉ែត page ​​​​​​ជា​ស្វ័យប្រវត្តិ។ លើស​ពី​នេះ​ទៀត ប៉ារ៉ាម៉ែត page នឹង​ទទួល​បាន​នូវ​ទិន្នន័យ​មួយ​ចំនួន​បន្ថែម​ទៀត​ពី​កម្មវិធី Astro មាន​ជា​អាទិ៍ដូចជា​ទិន្នន័យ​ដែល​ជា​ការផ្សាយ​ទាំងអស់​សំរាប់​ទំព័រ​និមួយ​ៗ ទិន្នន័យ​ស្តី​ពី​ទំព័រ​បន្ទាប់ ទំព័រ​មុន និង ទំព័រ​កំពុងត្រូវ​បើក​។ សរុប​មក យើង​អាច​ស្រង់​យក​ទិន្នន័យ​​សំរាប់​ទំព័រ​និមួយ​ៗយក​មក​ប្រើ​​តាម​រយៈប៉ារ៉ាម៉ែត page នេះ​៕

 

Netlify: https://khmerweb-static-blog.netlify.app

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