យើង​បាន​ដឹង​រួច​មក​ហើយ​ថា នៅ​ក្នុង schema ​​​​​​នៃបណ្តុំ​ទិន្នន័យ​នៃ​ការផ្សាយ ទិន្នន័យ​ដែល​ជា​វីដេអូ​ត្រូវ​បានយោង​ទៅ​លើ​បណ្តុំទិន្នន័យ videos អាស្រ័យ​ហេុតុ​នេះ យើង​ចាំបាច់​ត្រូវ​ស្រង់​យក​ទិន្នន័យ​ដែល​ជា​វីដេអូ​នេះ​ បន្ទាប់​ពី​ទិន្នន័យ​ដែល​យោង​ទៅ​លើ​បណ្តុំទិន្នន័យ videos ត្រូវ​បាន​ស្រង់​ចេញ​ពី​បណ្តុំ​ទិន្នន័យ posts ។ ដូច​គ្នា​ដែរ ចំពោះ​ទិន្នន័យ​ដែល​ជា​អ្នក​និពន្ធ​ដែល​យោង​ទៅ​លើ​បណ្តុំ​ទិន្នន័យ authors យើង​ចាំបាច់​ត្រូវ​ធ្វើ​ដូច​គ្នា​នេះ​ ដោយ​ស្រង់​វា​ចេញ​ពីបណ្តុំ​ទិន្នន័យ authors ។ ការស្រង់​យក​ទិន្នន័យ​ទាំងពីរ​នេះ ត្រូវ​ធ្វើឡើង​ដោយ​ប្រើប្រាស់​ក្បួន getEntry( ) នៅ​ក្នុង​កញ្ចប់ Astro ។

 

import { getEntry } from 'astro:content'
const { post } = Astro.props
const { Content } = await post.render()
const author = await getEntry(post.data.author)
const videos = await getEntry(post.data.videos)

 

ក្រោយ​ពី​ត្រូវ​បាន​ស្រង់​ចេញ​ពី​បណ្តុំ​ទិន្នន័យ videos រួច​ហើយ យើង​អាច​បញ្ជូន​ទិន្នន័យ​នេះ​ទៅ​កាន់ browser ដោយ​ភ្ជាប់​វា​ទៅ​នឹង​លក្ខណៈ data-* នៃ​ធាតុ​ណា​មួយ​។

 

<div class="video" data-videos={JSON.stringify(videos?.data.videos)}>
    <div class="screen"></div>
    <div class="playlist" data-title={post.data.title}></div>
</div>

 

នៅ​ក្នុង browser យើង​អាច​ស្រង់​យក​ទិន្នន័យ​នេះ​បាន​ ដោយ​ធ្វើ​ដូច​ខាង​ក្រោម​នេះ៖

 

let rawVideos = $('.Post .main .video').attr('data-videos')
const title = $('.Post .main .video .playlist').attr('data-title')
const videos = JSON.parse(rawVideos)

 

បន្ទាប់​ពី​ស្រង់​បាន​ទិន្នន័យ​វីដេអូ​រួច​ហើយ យើង​អាច​បង្កើត​ប្រដាប់​លេង​វីដេអូ​និង​បញ្ចូល​វា​ទៅ​ក្នុង​គំរូ​ទំព័រ​ការផ្សាយ​ដោយ​សរសេរ​កូដ​ដូច​ខាង​ក្រោម​នេះ៖

 

//public/scripts/setPlayer.js

function setScreen(video,id,click){
    if(video['vidType'] == 'OK'){
        var url = `//ok.ru/videoembed/${video['id']}`
    }else if(video['vidType'] == 'YouTube'){
        var url = `https://www.youtube.com/embed/${video['id']}`
    }else if(video['vidType'] == 'YouTubePlaylist'){
        var url = `https://www.youtube.com/embed/videoseries?list=${video['id']}`
    }else if(video['vidType'] === "Facebook"){
        var url = `https://www.facebook.com/watch/?v=${video['id']}`
    }else if(video['vidType'] === "GoogleDrive"){
        var url = `https://docs.google.com/file/d/${video['id']}/preview`
    }else if(video['vidType'] === "Vimeo"){
        var url = `https://player.vimeo.com/video/${video['id']}`
    }else if(video['vidType'] === "Dailymotion"){
        var url = `https://www.dailymotion.com/embed/video/${video['id']}`
    }

    if(video['vidType'] !== 'Facebook'){
        var iframe = `<div><iframe  src="${url}" frameborder="0" allowfullscreen></iframe></div>`
      }else{
        var iframe = `<div class="fb-video" data-href="${url}" data-width="auto" data-show-captions="true"></div>`
    }

    if(click){
        $('.Post .video .playlist #part'+clicked)
            .css({'background':'var(--playlist-part)', 'color': 'var(--playlist-color)'})
    }
    
    $('.Post .video .playlist #part'+id)
        .css({'background':'var(--playlist-clicked-bg)', 'color': 'var(--playlist-clicked)'})

    $('.screen').html(iframe) 

    clicked = id
}

 

const videos = JSON.parse(rawVideos)

for(let index in videos){
    let ending = ''
    if(index == videos.length-1){
        ending = videos[index].status
    }
                
    let result = `<div id="part${index}" class="part" onClick="setScreen(videos[${index}], ${index},true)">${title} part ${(++index)} ${ending}</div>`
                
    $('.playlist').append(html)
}

setScreen(videos[0],0,false)

 

ដើម្បី​អាច​មើល​វីដេអូ​នៅ​ប្រព័ន្ធ Facebook បាន​ យើង​ត្រូវ​បញ្ចូល​កូដ​ JavaScript SDK ខាង​ក្រោម​នេះ ទៅ​ក្នុង​គំរូ​ទំព័រ​ការផ្សាយៈ

 

<div id="fb-root"></div>
<script is:inline async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v14.0&appId=3245867309046703&autoLogAppEvents=1" nonce="uHaMaoD7"></script>

 

សរុប​មក កូដ​នៅក្នុង​គំរូ​ទំព័រ​ការផ្សាយ​ត្រូវ​មាន​សណ្ឋាន​ដូច​ខាង​ក្រោម​នេះៈ

 

<!--src/layouts/Post.astro-->
---
import { getEntry } from 'astro:content'
const { post } = Astro.props
const { Content } = await post.render()
const author = await getEntry(post.data.author)
const videos = await getEntry(post.data.videos)
---
<section class="Ad region">
    <img src="/images/ad.jpg" />
    <img src="/images/ad.jpg" />
</section>

<div id="fb-root"></div>
<script is:inline async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v14.0&appId=3245867309046703&autoLogAppEvents=1" nonce="uHaMaoD7"></script>

<section class="Post region">
    <div class="main">
        <h3 class="title">{post.data.title}</h3>
        <div class="categories">
            <span>​​​​​​​​​ជំពូកៈ {post.data.categories.join(', ')}</span>
            <span>{post.data.pudate.toLocaleDateString('it-IT')}</span>
        </div>
        <div class="author">
            <span>អ្នក​​​​​​​​​​រៀបរៀងៈ {author.data.name}</span>
        </div>
        <div class="video" data-videos={JSON.stringify(videos?.data.videos)}>
            <div class="screen"></div>
            <div class="playlist" data-title={post.data.title}></div>
        </div>
        <script is:inline src="/scripts/setplayer.js"></script>
        <script is:inline>         
            let clicked = 0
            let rawVideos = $('.Post .main .video').attr('data-videos')
            const title = $('.Post .main .video .playlist').attr('data-title')
            
            const videos = JSON.parse(rawVideos)
            
            for(let index in videos){
                let ending = ''
                if(index == videos.length-1){
                    ending = videos[index].status
                }
                
                let result = `<div id="part${index}" class="part" onClick="setScreen(videos[${index}], ${index},true)">${title} part ${(++index)} ${ending}</div>`

                $('.playlist').append(result)
            }
            setScreen(videos[0],0,false)
        </script>
        <div class="content"><Content/></div>
    </div>
    <div class="sidebar">
        ផ្សាយ​ពាណិជ្ជកម្ម
    </div>

</section>

<style is:global>
.Ad{
    display: grid;
    grid-template-columns: repeat(2, auto);
    grid-gap: 10px;
}
.Ad img{
    width: 100%;
}
.Post{
    margin-top: 20px;
    display: grid;
    grid-template-columns: 70% auto;
    grid-gap: 15px;
}
.Post .main, .Post .sidebar{
    background-color: rgb(231, 223, 223);
    color: rgb(22, 22, 22);
    padding: 15px;
}
.Post .sidebar{
    text-align: center;
    padding: 0;
}
.Post .main .title{
    font: 18px/1.5 Oswald, Koulen;
    margin-bottom: 20px;
}
.Post .main .categories span:nth-child(2){
    float: right;
}
.Post .main .author{
    margin-bottom: 30px;
}
.Post .main .video .screen div{
    position: relative;
    padding-top: 56.25%;
    border: 1px solid white;
    border-bottom: none;
}
.Post .main .video .screen div iframe{
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}
.Post .main .video .playlist{
    max-height: 405px;
    overflow: auto;
    margin-bottom: 20px;
    border: 1px solid white;
}
.Post .main .video .playlist .part{
    text-align: left;
    padding: 10px;
    color: var(--color);
    display: block;
    height: auto;
    font-size: 16px;
    background: var(--body);
    border: 1px solid white;
    border-top: none;
}
.Post .main .video .playlist .part:last-child{
    margin-bottom: 0;
}
.Post .main .video .playlist .part:hover{
    cursor: pointer;
    opacity: .7;
}

@media only screen and (max-width:600px){
    .Ad{
        grid-template-columns: 100%;
    }
    .Post{
        grid-template-columns: 100%;
    }
}
</style>

 

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

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