Нова практична 2

 

         Метою даної практичної роботи стане додання механізму статичних сторінок до нашого сайту. Для початку нам треба підготувати таблиці в БД, а потім шаблон для сторінки, і так почнемо із таблиць. Нам потрібно буде 2 нових таблиці – перша для збереження сторінок та їхніх назв, таблиця буде простенькою, структура наведена нижче. Так як в кожного тексти сайту інші, дані таблиці (тексти сторінок) наводитися не будуть.

CREATE TABLE `page` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `title` varchar(512) NOT NULL,

  `body` text,

  PRIMARY KEY (`id`),

  UNIQUE KEY `id_UNIQUE` (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

 

         Графічне представлення буде таким

         Тепер коли ми маємо де зберігати сторінки, нам потрібно знати що і коли віддавати користувачу (коли головну сторінку, коли каталог, а коли і статичну сторінку). Тут вступає «в роль» наша друга таблиця, вона буде в залежності від адреси «підказувати» що потрібно віддати користувачу. Спочатку наведемо її структуру, а потім пояснення.

CREATE TABLE ` router ` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `type` varchar(128) NOT NULL,

  `name` varchar(512) DEFAULT NULL,

  `link` varchar(252) DEFAULT NULL,

  `entity_id` int(11) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `idrouter_UNIQUE` (`id`),

  UNIQUE KEY `link_UNIQUE` (`link`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

 

Графічне представлення

         Поле тип вказує на вид матеріалу, ім’я введено для наочності, щоб при подальшому редагуванні було ясно що за елемент редагується (не використовуючи зв’язки між таблицями). Поле посилання це параметр q в адресі сторінки, і, останнє це ідентифікатор вмісту матеріалу, якщо це сторінка то сторінки, якщо товар – то товару. Але нам потрібно передбачити варіант коли в таблиці не буде посилання на матеріал, тоді в наших параметрах перший буде типом матеріалу а другий – ідентифікатором. Наприклад сторінка про нас буде доступна і по посиланню http://localhost:8080/?q=pro_nas і за посиланням http://localhost:8080/?q=page/2 , тобто нам не зовсім і потрібно вносити запис в таблицю, якщо тільки не потрібно використовувати іменне посилання на сторінку.

         Далі нам потрібно так і як у випадку головної сторінки виділити блоки шапки, підвалу, і, якщо є, бічної панелі, тобто вигляд нашої сторінки такий:

         Відмічені області повністю співпадають із головною сторінкою, тому ці всі блоки можна звідти і скопіювати. Тепер нам потрібно додати до сайту ще один файл page.php де будуть міститися функції для роботи із сторінками, вміст наведено нижче.

<?php

 require_once("database.php"); //підключаємо файл роботи із БД

 function get_page($pid){//функція буде повертати сторінку по ідентифікатору

     global $mysqli;//підключення до БД

     $res=$mysqli->query("SELECT * FROM `page` WHERE `id`='".mysql_escape($pid)."';");//виконуємо запит до БД

     $page=array();//оголошуємо порожній масив для збереження сторінки

     while ($row=$res->fetch_assoc()) {//обробляємо результат запиту

          $page['title']=$row['title'];//заповнюємо в масиві назву сторінки

          $page['body']=$row['body'];//заповнюємо вміст сторінки

          return $page;//повертаємо нашу сторінку

     }

  return false;//якщо немає сторінки повертаємо хибність

 }

?>

 

         Також нам потрібно дописати файл index.php, так як він теперішній редакції вміє повертати тільки головну сторінку. Вміст файлу буде такий, пояснення коментарями тільки нового фрагменту в файлі.

?php

 

 ini_set('display_errors', 1);

 ini_set('display_startup_errors', 1);

 error_reporting(E_ALL);

 

 require_once("database.php");

 require_once("block.php");

 require_once("menu.php");

 require_once("page.php");//підключаємо систему роботи сторінок

 if (isset($_GET['q'])) {$q=$_GET['q'];} else {$q='/';}

 

 if ($q=='/') {include("templates/frontpage.php");}

  else { //якщо параметр був переданий, то ми маємо по ньому знайти потрібний матеріал

     $res=$mysqli->query("SELECT * FROM `router` WHERE `link`='".mysql_escape($q)."';"); //виконуємо запит, щоб дізнатися вид матеріалу

     //обробляємо результат

     if (!($row=$res->fetch_assoc())) {//якщо запису немає

          $qp=explode('/',$q);//розділяємо результат по слешу

          $row['type']=$qp[0];//перший параметр - тип

          $row['entity_id']=$qp[1];//другий ідентифікатор матеріалу

          }

     //якщо тип сторінка

     if ($row['type']=='page') {$page_id=$row['entity_id'];include('templates/article.php');}//оголошуємо змінну page_id та передаємо управління шаблону сторінки

    

  }

?>

 

         Тепер нам в шаблоні потрібно вставити виклик функції get_page() яка візьме із бази по ідентифікатору вміст сторінки і поверне її користувачу. І так, в шаблоні article.php потрібно в місці де передбачено вміст сторінки додати таке:

<!-- згори вміст шапки і верх сторінки -->

<!-- Page Content -->

    <div class="container">

 

     <?php

     $page=get_page($page_id);<!-- Завантажуємо вміст сторінки із БД -->

     ?>

    

      <!-- Page Heading/Breadcrumbs -->

      <h1 class="mt-4 mb-3"><?php echo $page['title'];?> <!-- Виводимо заголовок сторінки --></h1>

 

      <!-- Article Item Row -->

      <div class="row">

 

 

        <div class="col-md-12">

          <?php echo $page['body'];?> <!-- виводимо вміст сторінки -->

          </div>

 

      </div>

      <!-- /.row -->

         

 

    </div>

 

<!-- далі іде підвал і низ сторінки -->