1. Главная / Блог / PHP+MySQL / Разделы сайта

Разделы сайта


Нет комментариев.


Здесь мы создадим админку и разделы сайта.


Для начала в .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" - удаляет раздел. Желательно довести этот код до ума – проверку прикреплённого контента к этому разделу или перенос на другой раздел, если контент привязан к удаляемому разделу.


Нет комментариев.


Оставить комментарий

Ваше имя:

Оценка