​​​​គំរូទំព័រជំពូក​នឹង​​ត្រូវ​យក​ទៅ​ប្រើប្រាស់​សំរាប់​បង្ហាញនូវ​បណ្តា​ការផ្សាយ​ទាំងឡាយ​នៅ​ក្នុង​ជំពូក​ណា​មួយ​។ ហើយ​ក្នុង​ករណីដែល​ការផ្សាយ​ក្នុង​ជំពូក​នោះ​មាន​​ចំនួន​ច្រើន ការផ្សាយ​ទាំងនោះ​នឹងត្រូវ​​ចែក​ចេញ​ជា​ទំព័រ​ជាច្រើន​ទៀត​។ នៅ​ពេល​យក​ទៅ​ប្រើ គំរូ​ទំព័រ​ជំពូក​នឹង​ទទួល​បាន​នូវ​ទិន្នន័យ​ដែល​ជា​សំណុំទិន្នន័យ page និង​ទិន្នន័យ category ដែល​ជា​ជំពូក​ណា​មួយ។ យើង​អាច​ស្រង់​យក​កំរងទិន្នន័យ​ដែល​ជា​ការផ្សាយ​សរុប​​នៅ​ក្នុង​ជំពូក​ណា​មួយ យក​មក​បង្ហាញ​នៅ​ក្នុង​គំរូ​ទំព័រ​ជំពូក​​។ ក៏​ដូច​ជា​គំរូ​ទំព័រ​ដទៃ​ទៀត​ដែរ គំរូ​ទំព័រ​ជំពូក​អាច​ត្រូវ​បង្កើត​ឡើង​នៅ​ក្នុង​ថត src/layouts និង​ត្រូវ​នាំ​ចូល​ទៅ​ប្រើ​នៅ​ក្នុង​ទំព័រ [page].astro នៅ​ក្នុង​ថត src/pages/[category] ។

 

<!--src/layouts/Category.astro-->
---
const { page, category } = Astro.props
---
<section class="Category 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" data-category={category}>
        <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')
    const category = $('.pagination').attr('data-category')
    $('.pagination select').val(currentPage)
    $( ".pagination select" ).on( "change", function(event) {
        document.location = `/${category}/${event.target.value}`
    })
</script>

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

 

<!--src/pages/[category]/[page].astro-->
---
import Base from '../../layouts/Base.astro'
import Category from '../../layouts/Category.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)
    const categories = [...new Set(posts.map((post) => post.data.categories).flat())]
    
    return categories.flatMap((category) => {
        const filteredPosts = posts.filter((post) => post.data.categories.includes(category))
        return paginate(filteredPosts, {
            params: {category},
            pageSize: 24
        })
    })
  }
  const {page} = Astro.props
  const {category} = Astro.params
---

<Base pageTitle="ទំព័រជំពូក" pageURL={category} >
    <Category page={page} category={category}/>
</Base>

 

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

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