Masterok CMS 1.3 Добавлена админка
Исправление
1. Обновим класс /engine/classes/template.php
Добавим метод render, чтобы можно было явно рендерить шаблон без нарушения инкапсуляции:
<?php
class Template {
private $theme;
private $vars = [];
public function __construct($theme = 'default') {
$this->theme = $theme;
if (!file_exists(ROOT_DIR . '/templates/' . $theme)) {
$this->theme = 'default';
}
}
public function assign($key, $value) {
$this->vars[$key] = $value;
}
public function display($template) {
$file = ROOT_DIR . '/templates/' . $this->theme . '/' . $template . '.tpl';
if (file_exists($file)) {
$content = file_get_contents($file);
foreach ($this->vars as $key => $value) {
$content = str_replace('{' . $key . '}', $value, $content);
}
echo $content;
} else {
echo "Шаблон $template не найден!";
}
}
// Новый метод для рендеринга произвольного шаблона
public function render($file) {
if (file_exists($file)) {
$content = file_get_contents($file);
foreach ($this->vars as $key => $value) {
$content = str_replace('{' . $key . '}', $value, $content);
}
echo $content;
} else {
die("Шаблон не найден по пути: $file");
}
}
}
2. Обновим /admin/index.php
Теперь будем использовать метод render:
<?php
require_once '../engine/init.php';
// Проверка роли
if (!$user_id || $db->query("SELECT role FROM users WHERE id = $user_id")->fetch_assoc()['role'] !== 'admin') {
header('Location: /login.php');
exit;
}
$template->assign('title', 'Админ-панель - MasterOK CMS');
$template->render(ROOT_DIR . '/admin/templates/admin_main.tpl');
3. Обновим /admin/categories.php
<?php
require_once '../engine/init.php';
if (!$user_id || $db->query("SELECT role FROM users WHERE id = $user_id")->fetch_assoc()['role'] !== 'admin') {
header('Location: /login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['add'])) {
$name = $_POST['name'];
$db->query("INSERT INTO categories (name) VALUES ('$name')");
} elseif (isset($_POST['edit'])) {
$id = $_POST['id'];
$name = $_POST['name'];
$db->query("UPDATE categories SET name = '$name' WHERE id = $id");
} elseif (isset($_POST['delete'])) {
$id = $_POST['id'];
$db->query("DELETE FROM categories WHERE id = $id");
}
}
$categories = $db->query("SELECT * FROM categories");
$list = '';
while ($cat = $categories->fetch_assoc()) {
$list .= "<tr>
<td>{$cat['id']}</td>
<td>{$cat['name']}</td>
<td>
<form method='post' style='display:inline;'>
<input type='hidden' name='id' value='{$cat['id']}'>
<input type='text' name='name' value='{$cat['name']}' required>
<button type='submit' name='edit' class='button small'>Сохранить</button>
</form>
<form method='post' style='display:inline;'>
<input type='hidden' name='id' value='{$cat['id']}'>
<button type='submit' name='delete' class='button small delete'>Удалить</button>
</form>
</td>
</tr>";
}
$template->assign('title', 'Управление категориями');
$template->assign('categories', $list);
$template->render(ROOT_DIR . '/admin/templates/admin_categories.tpl');
4. Обновим /admin/users.php
<?php
require_once '../engine/init.php';
if (!$user_id || $db->query("SELECT role FROM users WHERE id = $user_id")->fetch_assoc()['role'] !== 'admin') {
header('Location: /login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['edit'])) {
$id = $_POST['id'];
$role = $_POST['role'];
$db->query("UPDATE users SET role = '$role' WHERE id = $id");
} elseif (isset($_POST['delete'])) {
$id = $_POST['id'];
$db->query("DELETE FROM users WHERE id = $id");
}
}
$users = $db->query("SELECT * FROM users");
$list = '';
while ($user = $users->fetch_assoc()) {
$list .= "<tr>
<td>{$user['id']}</td>
<td>{$user['username']}</td>
<td>{$user['first_name']} {$user['last_name']}</td>
<td>{$user['phone']}</td>
<td>
<form method='post' style='display:inline;'>
<input type='hidden' name='id' value='{$user['id']}'>
<select name='role'>
<option value='user' " . ($user['role'] == 'user' ? 'selected' : '') . ">Заказчик</option>
<option value='freelancer' " . ($user['role'] == 'freelancer' ? 'selected' : '') . ">Фрилансер</option>
<option value='admin' " . ($user['role'] == 'admin' ? 'selected' : '') . ">Админ</option>
</select>
<button type='submit' name='edit' class='button small'>Сохранить</button>
</form>
<form method='post' style='display:inline;'>
<input type='hidden' name='id' value='{$user['id']}'>
<button type='submit' name='delete' class='button small delete'>Удалить</button>
</form>
</td>
</tr>";
}
$template->assign('title', 'Управление пользователями');
$template->assign('users', $list);
$template->render(ROOT_DIR . '/admin/templates/admin_users.tpl');
5. Обновим /admin/orders.php
<?php
require_once '../engine/init.php';
if (!$user_id || $db->query("SELECT role FROM users WHERE id = $user_id")->fetch_assoc()['role'] !== 'admin') {
header('Location: /login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['delete'])) {
$id = $_POST['id'];
$db->query("DELETE FROM orders WHERE id = $id");
}
$orders = $db->query("SELECT o.*, u.username FROM orders o LEFT JOIN users u ON o.user_id = u.id");
$list = '';
while ($order = $orders->fetch_assoc()) {
$list .= "<tr>
<td>{$order['id']}</td>
<td>{$order['title']}</td>
<td>{$order['username']}</td>
<td>{$order['created_at']}</td>
<td>
<a href='/order.php?id={$order['id']}' class='button small'>Просмотр</a>
<form method='post' style='display:inline;'>
<input type='hidden' name='id' value='{$order['id']}'>
<button type='submit' name='delete' class='button small delete'>Удалить</button>
</form>
</td>
</tr>";
}
$template->assign('title', 'Управление заказами');
$template->assign('orders', $list);
$template->render(ROOT_DIR . '/admin/templates/admin_orders.tpl');
Что сделать
- Обнови файл /engine/classes/template.php, добавив метод render.
- Замени код в файлах админки (/admin/index.php, /admin/categories.php, /admin/users.php, /admin/orders.php) на новый.
- Проверь, что шаблоны лежат в /admin/templates/:
- admin_main.tpl
- admin_categories.tpl
- admin_users.tpl
- admin_orders.tpl
- Зайди на http://masterok.lt/admin/ под логином admin (пароль admin123) и протестируй.
Почему так получилось
В предыдущем варианте я пытался напрямую работать с приватным свойством $vars, что нарушило инкапсуляцию класса Template. Новый метод render использует внутреннюю логику класса и решает проблему.
Результат
Теперь админка должна открываться без ошибок. Если всё работает, ты увидишь меню с кнопками для управления категориями, пользователями и заказами.
Скачать файл: 1_2-dobavlena-adminka.zip [327.72 Kb]
Рекламное место для вашего банера 100% ширина — от 50 евро/мес.
Реклама на сайте и тарифы на подписку. Тарифы