ដើម្បី​ជា​ជំនួយ​ក្នុង​ការស្វែងរក​ការផ្សាយ​នានា និង​បង្ហាញ​លទ្ធផលពី​ការស្វែង​រក​នៅ​លើ​ browser យើង​អាច​ប្រើប្រាស់​កញ្ចប់ Svelte មួយ​ទៀត​បន្ថែម​ទៅ​លើ​កញ្ចប់ Fuse.js ។

 

npx astro add svelte

 

យើង​អាច​បង្កើត​គំរូ​ទំព័រ​ស្វែង​រក​មួយ​ ដែល​មាន​ប្រភេទ​ជា​ឯកសារ Svelte ដោយ​បង្កើត​ឯកសារ Search.svelte នៅ​ក្នុង​ថត src/components ។ 

 

<!--src/components/Search.svelte-->
<script>
    import Fuse from 'fuse.js'
    import { onMount } from 'svelte'
    export let searchList
    let items = []

    const options1 = {
	    keys: ['data.categories'],
	    includeMatches: true,
	    minMatchCharLength: 2,
	    threshold: 0,
    }

    const options2 = {
	    keys: ['data.title'],
	    includeMatches: true,
	    minMatchCharLength: 2,
	    threshold: 0.5,
    }

    onMount(()=>{
        const categories = {
            'រឿងខ្មែរ': 'Khmer',
            'រឿងថៃ': 'Thai',
            'រឿងចិន': 'Chinese',
            'រឿងកូរ៉េ': 'Korean',
            'ឯកសារ': 'Documentary'
        }

        const searchParams = new URLSearchParams(document.location.search)
        const q = searchParams.get('q')
        const category = searchParams.get('category')
        const fuse1 = new Fuse(searchList, options1)
        const posts1 = fuse1
                          .search(categories[category])
                          .map((result) => result.item)

        const fuse2 = new Fuse(posts1, options2)
        const posts2 = fuse2
                          .search(q)
                          .map((result) => result.item)
                          .slice(0, 24)

        items = posts2
    })
</script>

<section class="Category region">
    <div class="container">
        {#each items as item}
            <div class="wrapper">
                <a href="/post/{item.slug}">
                    <img src={item.data.thumb} />
                    <img class="play-icon" src="/images/play.png" />
                </a>
                <div class="date">{item.data.pudate.toLocaleDateString("it-IT")}</div>
                <a class="title" href="/post/{item.slug}">
                    <div >{item.data.title}</div>
                </a>
            </div>
        {/each}
    </div>
</section>

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

 

នៅ​ក្នុង​កូដ​ខាង​លើ​​នេះ​មាន​ការស្រង់​យក​ជំពូក​និង​ពាក្យ​ដែល​ត្រូវ​ស្វែងរក​ពី​អាស័យដ្ឋាន​នៅ​លើ browser ដោយ​ប្រើប្រាស់​ភាសា JavaScript សុទ្ធសាទ​។

 

const searchParams = new URLSearchParams(document.location.search)
const q = searchParams.get('q')
const category = searchParams.get('category')

 

នៅ​ពេលដែល​ស្រង់​ពាក្យ​ទាំងនោះ​បាន​មក​ហើយ យើង​ត្រូវ​ប្រើប្រាស់​ក្បួន​ខ្នាត​នៅ​ក្នុង​កញ្ចប់ Fuse.js ដើម្បី​ធ្វើការ​ស្វែង​រក​ការផ្សាយ​ដូច​ខាង​ក្រោម​នេះ៖

 

const categories = {
    'រឿងខ្មែរ': 'Khmer',
    'រឿងថៃ': 'Thai',
    'រឿងចិន': 'Chinese',
    'រឿងកូរ៉េ': 'Korean',
    'ឯកសារ': 'Documentary'
}
        
const options1 = {
    keys: ['data.categories'],
    includeMatches: true,
    minMatchCharLength: 2,
    threshold: 0,
}

const options2 = {
    keys: ['data.title'],
    includeMatches: true,
    minMatchCharLength: 2,
    threshold: 0.5,
}

const fuse1 = new Fuse(searchList, options1)
const posts1 = fuse1
                  .search(categories[category])
                  .map((result) => result.item)

const fuse2 = new Fuse(posts1, options2)
const posts2 = fuse2
                  .search(q)
                  .map((result) => result.item)
                  .slice(0, 24)

items = posts2

 

ដូចនេះ​យើង​ឃើញ​ថា ការស្វែងរក​ត្រូវ​ធ្វើ​ឡើង​ជា​ពីរ​ដំណាក់កាល ដំណាក់កាល​ទី​មួយ​គឺ​ត្រូវ​ស្វែង​រក​ទិន្នន័យ​ការផ្សាយ​ទាំងអស់​នៅ​ក្នុង​ជំពូក​ណា​មួយ ដំណាក់កាល​ទី​ពីរ​គឺ​ការស្វែង​ពាក្យ​នៅ​ក្នុង​​​ចំណង​ជើង​នៃ​ការផ្សាយ​និមួយ​ៗ​។

 

ការយក​គំរូ​ទំព័រ​ស្វែងរក​ទៅ​ប្រើប្រាស់​នៅ​ក្នុង​ទំព័រស្វែងរក គឺ​ត្រូវ​ធ្វើ​ឡើង​ដូច​ខាង​ក្រោម​នេះ៖

 

<!--src/pages/search.astro-->
---
import Base from "../layouts/Base.astro"
import Search from "../components/Search.svelte"

import { getCollection } from 'astro:content'
const posts = await getCollection('posts')
---

<Base pageTitle="ទំព័រ​ស្វែង​រក" pageURL="Search">
    <Search client:load searchList={posts} />
</Base>

 

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

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