ក្រោយ​ពី​មូដ្ខាន​គ្រឹះ​នៃ​គេហទំព័រ​ត្រូវ​បាន​បង្កើត​ឡើង​រួច​ហើយ បន្ទាប់​មក​ទៀត​ យើង​ចាំបាច់​ត្រូវ​បង្កើត​ក្បាល​គេហទំព័រ​ ដែល​នៅ​ក្នុង​នោះ​​មាន​ម៉ឺនុយ​និង​កន្លែង​ចុច​ចូល​​ឆ្ពោះទៅ​កាន់​​​ទំព័រ​គ្រប់គ្រង​របស់​ប្រព័ន្ធ Django ដែល​ភាសា​អង់គ្លេស​ហៅ​ថា Administration Panel ហើយ​ដែល​យើង​អាច​បក​ប្រែ​មក​ជា​ភាសា​ខ្មែរ​មក​ថា ទំព័រ​គ្រប់គ្រង ។ 

 

ជាទូទៅ  នៅ​ក្នុង​ការបង្កើត​គំរូទំព័រ​ទាំងឡាយ គេ​និយម​បង្កើត​ផ្នែក​ផ្សេង​ៗ​នៃ​គំរូទំព័រ​ជាមុន​សិន​ រួច​បាន​យក​ផ្នែក​ទាំងនោះ​មក​ផ្គុំ​គ្នា​បង្កើត​ជា​គំរូទំព័រ​ណា​មួយ​ ដែល​យើង​ចង់​បាន​។ មួយវិញទៀត គេ​អាច​ប្រៀបប្រដូច​ផ្នែក​​ផ្សេង​ៗ​នៃ​គំរូ​ទំព័រ​ទៅ​នឹង​គ្រឿង​បំលាស់​របស់​​រថយន្ត ដែល​យើង​អាច​យក​មក​ផ្គុំ​គ្នា​បង្កើត​បាន​ជារថយន្ត​ដ៏​ពេល​លក្ខណៈ។ ជាក់ស្តែង យើង​អាច​បង្កើត​គំរូ​ទំព័រ​មុខ​មួយ​បាន (index.html) ដោយ​យក​ផ្នែក​គំរូ​​ទំព័រ​ផ្នែក​ក្បាល​ (header template) មក​ផ្គុំ​គ្នា​ជាមួយ​នឹងគំរូ​ទំព័រ​​ផ្នែក​ដង​ខ្លួន​​ (body template) និង​គំរូ​ទំព័រ​​ផ្នែក​ជើង​ (footer template) ។

 

យ៉ាងណាម៉ិញ សារសំខាន់​នៃ​ការបង្កើត​ផ្នែក​ផ្សេង​ៗ​នៃ​គំរូទំព័រ គឺ​ដើម្បី​អាច​យក​ផ្នែក​ទាំងនោះ​ទៅ​ប្រើប្រាស់​បាន​ជា​ច្រើន​លើក​ច្រើន​សារ​ ក្នុង​ការបង្កើត​​គំរូទំព័រ​ជា​ច្រើន​ប្រភេទ​ខុស​ៗ​គ្នា​​ ដែល​មានផ្នែក​ខ្លះ​ដូចគ្នា​។ ឧទាហរណ៍ ជាទូទៅ​បណ្តា​ទំព័រ​ជាច្រើន​នៅ​ផ្នែក​ខាង​មុខ (frontend) របស់​គេហទំព័រ​ណា​មួយ តែង​តែ​មាន​ក្បាល​ទំព័រ (header) ជើង​ទំព័រ (footer) និង ផ្នែក​ខាង​ (sidebar) ដូច​ៗ​គ្នា​ ពោល​គឺ​ទំព័រ​ទាំងនោះ​ខុសគ្នា​តែ​ផ្នែក​ដង​ខ្លួន​តែ​ប៉ុណ្ណោះ​។ អាស្រ័យហេតុ​នេះ ដើម្បី​បង្កើត​បណ្តា​ទំព័រ​ទាំងនោះ យើង​គ្រាន់​​តែ​យក​គំរូទំព័រ​ផ្នែក​ក្បាល ផ្នែក​ដង​ខ្លួន និង​ ផ្នែក​ជើង មក​ផ្គុំ​គ្នា​គឺ​ជា​ការស្រេច​ ពោល​គឺ​យើង​គ្រាន់​តែ​ធ្វើ​ដោះដូរ​ផ្នែក​ដងខ្លួន​តែ​បន្តិច​បន្តួច​ប៉ុណ្ណោះ​។

 

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

 

<!-- mysite/blog/templates/partials/header.html -->
{% load static %}
<link rel="stylesheet" 
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel='stylesheet' href='{% static "styles/partials/header.css" %}' />
<script src="{% static 'scripts/tool.js' %}"></script>

<section class='Header'>
    <div class='header-wrapper region'>
        <div  class='datetime'>
            <div class='date'></div>
            <div id='kh-clock'></div>
            <script>
                var date = new Date('{{ datetime|date:"Y-m-d H:i" }}')
                date = getKhDate(date)
                $('.date').append(date)
                clock()
                setDateTime()
            </script>
        </div>
        <div class='title-wrapper'>
            <a class='title' href=''>{{ siteTitle }}</a>
            <a class='description'>{{ description }}</a>
        </div>
        <form class='search' method='post' action='search/'>
            <input type='text' />
            <input type='submit' value='ស្វែង​រក' />
        </form>
    </div>

    <div class='menu-wrapper'>
    <nav class='menu region'>
        <div class="topnav" id="myTopnav">
            <a href="" class="active">ទំព័រ​ដើម</a>
            <a href="#news">ព័ត៌មាន</a>
            <div class="dropdown">
              <button class="dropbtn">ជំពួក​ព័ត៌មាន
                <i class="fa fa-caret-down"></i>
              </button>
              <div class="dropdown-content">
                <a href="#">Link 1</a>
                <a href="#">Link 2</a>
                <a href="#">Link 3</a>
              </div>
            </div>
            <a href="#contact">ទំនាក់ទំនង</a>
            <a href="#about">អំពី​ពួក​យើង</a>
            <a href="admin/">ចូល​ក្នុង</a>
            <a href="javascript:void(0);" class="icon" onclick="mobileMenu()">&#9776;</a>
        </div>
    </nav>
    </div>
</section>

 

.Header{
  border-top: 5px solid var(--grey);
}

.Header .header-wrapper{
  display: grid;
  grid-template-columns: 21% auto 21%;
  align-items: center;
  text-align: center;
  padding: 10px;
}

.Header .header-wrapper .title-wrapper .title{
  font: 45px/1.5 Oswald, Koulen;
  display: block;
}

.Header .header-wrapper .title-wrapper .description{
  font: italic 22px/1.5 Nokora;
  display: block;
  padding-top: 5px;
}

.Header .header-wrapper .datetime{
  font: 16px/1.5 Moul;
}

.Header .header-wrapper .search{
  display: grid;
  grid-template-columns: 75% 25%;
}

.Header .header-wrapper .search input{
  width: 100%;
  padding: 0 5px;
  font: 14px/1.5 OdorMeanChey;
}

.Header .menu-wrapper{
  background: rgb(238, 238, 238);
  border-top: 3px solid var(--grey);
  border-bottom: 1px solid var(--grey);
}

:root{
  --menu-font: 16px/1.5 Bayon;
}

.topnav {
  overflow: hidden;
}

.topnav a {
  float: left;
  display: block;
  color: black;
  text-align: center;
  padding: 12px 16px;
  text-decoration: none;
  font: var(--menu-font);
}

.active {
  background-color: #04AA6D;
  color: white;
}

.topnav .icon {
  display: none;
}

.dropdown {
  float: left;
  overflow: hidden;
}

.dropdown .dropbtn {
  border: none;
  outline: none;
  color: black;
  padding: 12px 16px;
  background-color: inherit;
  font: var(--menu-font);
  margin: 0;
}

.dropdown-content {
  display: none;
  position: absolute;
  background-color: #f9f9f9;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
  z-index: 1;
}

.dropdown-content a {
  float: none;
  color: black;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  text-align: left;
}

.topnav a:hover, .dropdown:hover .dropbtn {
  background-color: #555;
  color: white;
}

.dropdown-content a:hover {
  background-color: #ddd;
  color: black;
}

.dropdown:hover .dropdown-content {
  display: block;
}

@media only screen and (max-width: 600px){
  .Header .header-wrapper{
    grid-template-columns: 100%;
  }
}

@media screen and (max-width: 600px) {
  .topnav a:not(:first-child), .dropdown .dropbtn {
    display: none;
  }
  .topnav a.icon {
    float: right;
    display: block;
  }
}

@media screen and (max-width: 600px) {
  .topnav.responsive {position: relative;}
  .topnav.responsive a.icon {
    position: absolute;
    right: 0;
    top: 0;
  }

  .topnav.responsive a {
    float: none;
    display: block;
    text-align: left;
  }

  .topnav.responsive .dropdown {float: none;}
  .topnav.responsive .dropdown-content {position: relative;}
  .topnav.responsive .dropdown .dropbtn {
    display: block;
    width: 100%;
    text-align: left;
  }

}

 

//mysite/static/scripts/tool.js
function mobileMenu() {
  var x = document.getElementById("myTopnav");
  if (x.className === "topnav") {
    x.className += " responsive";
  } else {
    x.className = "topnav";
  }
}

function toKhNum(number) {
    var khNum = {'0':'០', '1':'១', '2':'២', '3':'៣', '4':'៤', '5':'៥', '6':'៦', '7':'៧', 
    '8':'៨', '9':'៩'};
    var stringNum = number.toString();
    var khString = '';
   
    for(var i in stringNum){
      var char = stringNum.charAt(i);
      khString += khNum[char];
    }
   
    return khString;
  }
  
  function getKhDate (rawDate){
    var KhmerDays = ['អាទិត្យ', 'ច័ន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'];
    var KhmerMonths = ['មករា', 'កុម្ភៈ', 'មិនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា',
     'កញ្ញា', 'តុលា',  'វិច្ឆិកា', 'ធ្នូ'];
    var date = new Date(rawDate);
    var month = date.getMonth();
    var day = date.getDay();
    var daym = toKhNum(date.getDate());
    var year = toKhNum(date.getFullYear());
    var time = date.toLocaleTimeString();
    return ('ថ្ងៃ '+ KhmerDays[day]+' ទី '+daym+' '+KhmerMonths[month]+' '+year)
  }

  function checkTime(i) {
    if (i < 10){i = "0" + i};  
    return i;
  }

  function clock(){
    var period = 'ព្រឹក';
    var today = new Date();
    var h = today.getHours();
    if(h>12){
      h = h-12;
      period = 'ល្ងាច';
    }
    var m = today.getMinutes();
    var s = today.getSeconds();
    m = checkTime(m);
    s = checkTime(s);
  
    document.getElementById('kh-clock').innerHTML = toKhNum(h) + " : " + toKhNum(m) + " : " + 
    toKhNum(s)+' '+period;
    var t = setTimeout(clock, 500);
  }
  

 

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

 

<!-- mysite/blog/templates/base.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>{{ siteTitle }}</title>

    {% load static %}
    <script src="{% static 'scripts/jQuery.js' %}"></script>
    <link rel="stylesheet" href="{% static 'styles/base.css' %}">
    <link rel="stylesheet" href="{% static 'fonts/setup.css' %}">
    <link rel="icon" href="{% static 'images/site_logo.png' %}" >
    
    {% block insert_into_head %}<!-- to add -->{% endblock %}
  </head>
  <body>
    {% include 'partials/header.html' %}
  </body>
</html>

 

នៅ​ក្នុង​កូដ​ខាង​លើ​នេះ នៅ​លើ​បន្ទាត់​លេខ 18​ គឺ​ជា​ការ​ប្រើប្រាស់​ភាសា​គំរូទំព័រ​របស់​ប្រព័ន្ធ Django ដើម្បីយក​គំរូ​ទំព័រ​ផ្នែក​ក្បាល​ដែល​ជា​ឯកសារ​ឈ្មោះ header.html មកបញ្ចូល​ទៅ​ក្នុង​គំរូទំព័រ​ដើម​ដែល​ជា​ឯកសារ​ឈ្មោះ base.html ៕

 

Heroku: https://khmerweb-blog.herokuapp.com