File size: 8.25Kb
<?php
require_once __DIR__ . '/../config/bootstrap.php';
require_once __DIR__ . '/../config/auth.php';
require_once __DIR__ . '/../config/functions.php';
if (!is_admin()) {
http_response_code(403);
die("Доступ запрещён");
}
require_once __DIR__ . '/../includes/header.php';
try {
$stmt = $pdo->query(
"SELECT o.id, u.email, u.name, o.total, o.status, o.created_at,
COUNT(oi.id) as items_count
FROM orders o
JOIN users u ON o.user_id = u.id
LEFT JOIN order_items oi ON o.id = oi.order_id
GROUP BY o.id
ORDER BY o.created_at DESC"
);
$orders = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
die("Ошибка загрузки заказов: " . htmlspecialchars($e->getMessage()));
}
?>
<div class="container my-5">
<h1 class="mb-4">
<i class="bi bi-cart-check"></i> Управление заказами
</h1>
<div class="glass p-4 card-ui fade-in">
<div class="table-responsive">
<table class="table table-hover table-striped align-middle">
<thead class="table-dark">
<tr>
<th>#ID</th>
<th>Пользователь</th>
<th>Email</th>
<th>Сумма</th>
<th>Товаров</th>
<th>Статус</th>
<th>Дата создания</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
<?php if (empty($orders)): ?>
<tr>
<td colspan="8" class="text-center text-muted py-4">
<i class="bi bi-inbox"></i> Нет заказов
</td>
</tr>
<?php else: ?>
<?php foreach ($orders as $order): ?>
<tr>
<td><?= e($order['id']) ?></td>
<td><?= e($order['name'] ?? 'Не указано') ?></td>
<td><?= e($order['email']) ?></td>
<td>
<span class="badge bg-success rounded-pill">
<?= number_format($order['total'] ?? 0, 2) ?> ₽
</span>
</td>
<td>
<span class="badge bg-primary rounded-pill">
<?= e($order['items_count'] ?? 0) ?> шт.
</span>
</td>
<td>
<select class="form-select form-select-sm"
onchange="updateStatus(<?= $order['id'] ?>, this.value)"
style="width: 150px;">
<?php
$statuses = [
'Новый' => 'bg-secondary',
'В обработке' => 'bg-info',
'Печать' => 'bg-warning',
'Доставляется' => 'bg-primary',
'Доставлен' => 'bg-success',
'Отменен' => 'bg-danger'
];
foreach ($statuses as $status => $class):
$selected = ($order['status'] ?? 'Новый') === $status ? 'selected' : '';
?>
<option value="<?= e($status) ?>" <?= $selected ?>>
<?= e($status) ?>
</option>
<?php endforeach; ?>
</select>
</td>
<td><?= date('d.m.Y H:i', strtotime($order['created_at'])) ?></td>
<td>
<div class="btn-group btn-group-sm">
<a href="/admin/order_view.php?id=<?= e($order['id']) ?>"
class="btn btn-outline-primary">
<i class="bi bi-eye"></i> Просмотр
</a>
<button class="btn btn-outline-danger"
onclick="deleteOrder(<?= e($order['id']) ?>)">
<i class="bi bi-trash"></i>
</button>
</div>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
<script>
function updateStatus(orderId, status) {
if (!confirm("Изменить статус заказа #" + orderId + " на \"" + status + "\"?")) {
return;
}
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '<?= $_SESSION['csrf_token'] ?? '' ?>';
fetch('/ajax/admin/update_status.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
},
body: JSON.stringify({
id: orderId,
status: status,
csrf: csrfToken
})
})
.then(res => {
if (!res.ok) {
throw new Error('Network response was not ok: ' + res.status);
}
return res.json();
})
.then(data => {
if (data.success) {
alert('Статус заказа успешно обновлён');
const row = document.querySelector(`tr td:first-child:contains("${orderId}")`)?.closest('tr');
if (row) {
const statusCell = row.querySelector('td:nth-child(6)');
if (statusCell) {
statusCell.innerHTML = `
<select class="form-select form-select-sm"
onchange="updateStatus(${orderId}, this.value)"
style="width: 150px;">
${data.status_options || ''}
</select>
`;
}
}
} else {
alert('Ошибка: ' + (data.error || 'Неизвестная ошибка'));
}
})
.catch(error => {
console.error('Error:', error);
alert('Ошибка соединения с сервером');
});
}
function deleteOrder(orderId) {
if (!confirm("Вы уверены, что хотите удалить заказ #" + orderId + "?")) {
return;
}
const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '<?= $_SESSION['csrf_token'] ?? '' ?>';
fetch('/ajax/admin/delete_order.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
},
body: JSON.stringify({
id: orderId,
csrf: csrfToken
})
})
.then(res => res.json())
.then(data => {
if (data.success) {
alert('Заказ удалён');
location.reload();
} else {
alert('Ошибка: ' + (data.error || 'Неизвестная ошибка'));
}
})
.catch(error => {
console.error('Error:', error);
alert('Ошибка соединения с сервером');
});
}
</script>
<?php
require_once __DIR__ . '/../includes/footer.php';
?>