Разделы сайта
Здесь мы создадим админку и разделы сайта.
Для начала в .htaccess пропишем следующие строки
ErrorDocument 403 /error.php?go=403
ErrorDocument 404 /error.php?go=404
И создадим файл error.php который будет сообщать об запрете доступа или отсутствие страницы.
<?php
include_once 'connect.php';
//получаем данные
$go = valid($_GET['go']);
//присоединяем шаблон
$tpl = new PHPTemplate('./tpl/page.tpl');
//присоединяем блок пользователя
include_once 'user.php';
switch($go){
case 403:
$content["message"] = "<b>403</b><br/>Доступ запрещён!";
break;
case 404:
$content["message"] = "<b>404</b><br/>Такой страницы не существует!";
break;
}
$content["horizontal_menu"]="<a href=\"/\">Главная</a> / Ошибка";
//создаём сообщение
$tplForm = new PHPTemplate('./tpl/message.tpl');
$content["url"]="/";
$content["button"]="Закрыть";
$tplForm->set('content', $content);
$content["text"]=$tplForm->fetch();
$tpl->set('content', $content);
//показываем страницу
echo $tpl->fetch();
?>
Когда я создавал базу данных то забыл создать таблицу, которая будет хранить информацию о разделах сайта.
Давайте создадим временный файл с любым названием и таким содержимым.
<?php
//Доступ к БД
define($config['unicod'] , true);
include_once 'db.php';
// Подключение к БД
$connection = @mysqli_connect($dbsettings['server'], $dbsettings['user'], $dbsettings['pass'], $dbsettings['name']);
mysqli_set_charset ( $connection , "utf8" );
if ($connection == false){
print("Ошибка: Невозможно подключиться к MySQL " . mysqli_connect_error());
}
//создаём таблицу
$Table = "CREATE TABLE `Chapter` ( ";
$Table .= " `id` int(9) NOT NULL auto_increment,";
$Table .= " `Name` text NOT NULL,";
$Table .= " `Translit` text NOT NULL,";
$Table .= " `Priority` int(9) NOT NULL,";
$Table .= "PRIMARY KEY (`id`) ";
$Table .= ") ENGINE=MyISAM CHARSET=utf8 ;";
mysqli_query($connection,$Table) or die("MySQL Error: ".mysql_error());
//Добавление столбца к таблице
$Table = "ALTER TABLE Content ADD COLUMN Chapter text;";
mysqli_query($connection,$Table) or die("MySQL Error: ".mysql_error());
echo "ok";
?>
После запуска, в базу данных, добавится таблица Chapter, а в таблицу Content добавится столбец Chapter.
Когда появится надпись ok - файл можно удалить.
Создадим админку, где пока сможем создавать разделы сайта.
Файл admin.php.
<?php
include_once 'connect.php';
//Проверяем статус администратора
if($dataUser['Rang']!='Administrator'){
header('Location: error.php?go=403');
exit();
}else{
//получаем данные
$go = valid($_GET['go']);
$tplForm = new PHPTemplate('./tpl/message.tpl');
//меню админки
$tplUser = new PHPTemplate('./tpl/admin_menu.tpl');
$content["user"]=$tplUser->fetch();
$content["url"]="admin.php";
$content["message"]="Вы в админке";
$content["button"]=" ";
if($go=="menu"){
$content["message"] = "Разделы сайта
";
//показываем все разделы сайта
$sql = 'SELECT * FROM Chapter ORDER BY Priority DESC';
$result = mysqli_query($connection, $sql);
while ($row = mysqli_fetch_array($result)) {
$content["message"] .= '<a href="admin.php?go=edit_menu&m=' . $row['id'] . '">' . $row['Name'] . '</a>
';
}
$content["url"]="admin.php?go=add_menu";
$content["button"]="Добавить меню";
}
if($go=="add_menu"){
$tplForm = new PHPTemplate('./tpl/input2.tpl');
$content["message"] = "Новый раздел";
$content["url"]="admin.php?go=save_menu";
$content["button"]="Сохранить";
$content["input1"]="Название";
$content["input2"]="Приоритет";
}
if($go=="save_menu"){
$name = valid($_POST['input1']);
$priority = valid($_POST['input2']);
$url = translit($name);
$Table = "INSERT INTO Chapter SET";
$Table .= " Name='".$name."',";
$Table .= " Translit='".$url."',";
$Table .= " Priority='".$priority."'";
mysqli_query($connection,$Table) or die("MySQL Error: ".mysql_error()."");
header('Location: admin.php?go=menu');
}
if($go=="edit_menu"){
$m = valid($_GET['m']);
$sql = 'SELECT * FROM Chapter WHERE id="'.$m.'"';
$result = mysqli_query($connection, $sql);
$menu = mysqli_fetch_assoc($result);
$tplForm = new PHPTemplate('./tpl/input2.tpl');
$content["message"] = "Редактирование";
$content["url"]="admin.php?go=save_edit_menu&m=".$menu['id'];
$content["button"]="Сохранить";
$content["input1"]="Название";
$content["input2"]="Приоритет";
$content["result1"]=$menu['Name'];
$content["result2"]=$menu['Priority'];
$content["link"]="<a href='admin.php?go=del_menu&m=".$menu['id']."'>Удалить</a>";
}
if($go=="save_edit_menu"){
$name = valid($_POST['input1']);
$priority = valid($_POST['input2']);
$m = valid($_GET['m']);
$url = translit($name);
$Table = "UPDATE Chapter SET";
$Table .= " Name='".$name."',";
$Table .= " Translit='".$url."',";
$Table .= " Priority='".$priority."'";
$Table .= " where (id='".$m."')";
mysqli_query($connection,$Table) or die("MySQL Error: ".mysql_error()."");
header('Location: admin.php?go=menu');
}
if($go=="del_menu"){
$m = valid($_GET['m']);
$Table = "DELETE FROM Chapter";
$Table .= " where (id='".$m."')";
mysqli_query($connection,$Table) or die("MySQL Error: ".mysql_error()."");
header('Location: admin.php?go=menu');
}
$content["title"]="Админка";
$content["horizontal_menu"]="Админка";
$tplForm->set('content', $content);
$content["text"]=$tplForm->fetch();
$tpl->set('content', $content);
//показываем страницу
echo $tpl->fetch();
}
?>
Для начала проверим пользователя на статус администратора.
Если он не админ – отправляем на 403 страницу.
Получаем данные для переменной $go и подключаем шаблон сообщения который выглядит так.
Файл ./tpl/message.tpl.
<form action="<?=$content["url"] ?>" class="form" method="post">
<?=$content["message"] ?>
<input class="center" type="submit" value="<?=$content["button"] ?>">
</form>
Также подключаем шаблон меню админки который, пока, выглядит так.
Файл ./tpl/admin_menu.tpl.
<div class="block" style="text-align: center; width:100%">
<b>Админка</b><br/>
<a href="admin.php?go=menu">Меню</a><br/>
<a href="/" style="color: red">Выход</a><br/>
</div>
$go==”menu” - показывает разделы сайта.
$go==”add_menu” - выводит шаблон ./tpl/input2.tpl для добавления нового раздела.
<form action="<?=$content["url"] ?>" class="form" method="post">
<?=$content["message"] ?>
<input name="input1" placeholder="<?=$content["input1"] ?>" value="<?=$content["result1"] ?>"><br/>
<input name="input2" type="number" placeholder="<?=$content["input2"] ?>" value="<?=$content["result2"] ?>"><br/>
<?=$content["link"] ?>
<input class="center" type="submit" value="<?=$content["button"] ?>">
</form>
В этой форме вводим название раздела и выставляем числовой приоритет.
Приоритет нужен для показывания разделов в правильном порядке.
Например “меню 1” имеет приоритет равным 10, а “меню 2” имеет приоритет равным 20. Показываться будут друг за другом, чтобы вставить “меню 3” между ними, можно назначить приоритет этого раздела 15.
$go=="save_menu" - сохраняет раздел. В таблицу Chapter записывается введённые названия и приоритет, а в строку Translit записывается название переведённое в транслитеру, для создания URLа, с помощью функции translit, которую нужно добавить в файл function.php
//функция перевода строки в транслит
function translit($str) {
$russian = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', ' ');
$translit = array('A', 'B', 'V', 'G', 'D', 'E', 'YO', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'yo', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya', '_');
return str_replace($russian, $translit, $str);
}
$go=="edit_menu" - выводит форму для редактирования раздела.
$go=="save_edit_menu" - сохраняет редактирование.
$go=="del_menu" - удаляет раздел. Желательно довести этот код до ума – проверку прикреплённого контента к этому разделу или перенос на другой раздел, если контент привязан к удаляемому разделу.