v1.0.0.1
StocketBase
- <?php
-
- declare(strict_types=1);
-
- if (count(get_included_files()) === 1) {
- http_response_code(403);
- exit;
- }
-
- if (!Auth::hasRoleAtLeast(Auth::ROLE_STORE_MANAGER)) {
- echo '<p>You don\'t have access to reviews.</p>';
- return;
- }
-
- $usersDb = Database::users();
- $db = Database::site();
-
- $statusFilter = in_array($_GET['status'] ?? '', ['visible', 'hidden', 'flagged'], true) ? $_GET['status'] : 'flagged';
-
- $statement = $usersDb->prepare(
- 'SELECT r.*, u.display_name, u.email FROM product_reviews r LEFT JOIN user_accounts u ON u.id = r.user_account_id
- WHERE r.status = :status ORDER BY r.created_at DESC LIMIT 200'
- );
- $statement->execute(['status' => $statusFilter]);
- $reviews = $statement->fetchAll();
-
- $productIds = array_values(array_unique(array_map(static fn(array $review) => (int) $review['product_id'], $reviews)));
- $productTitles = [];
- if (!empty($productIds)) {
- $placeholders = implode(',', array_fill(0, count($productIds), '?'));
- $productStatement = $db->prepare("SELECT id, title FROM products WHERE id IN ($placeholders)");
- $productStatement->execute($productIds);
- foreach ($productStatement->fetchAll() as $row) {
- $productTitles[(int) $row['id']] = $row['title'];
- }
- }
-
- ?>
- <div class="dash-header-row">
- <h1 class="dash-title"><?= Icons::icon("star", "icon icon-lg") ?>Reviews</h1>
- </div>
-
- <div class="settings-tabs">
- <a href="dashboard.php?view=reviews&status=flagged" class="<?= $statusFilter === 'flagged' ? 'active' : '' ?>">Reported</a>
- <a href="dashboard.php?view=reviews&status=visible" class="<?= $statusFilter === 'visible' ? 'active' : '' ?>">Visible</a>
- <a href="dashboard.php?view=reviews&status=hidden" class="<?= $statusFilter === 'hidden' ? 'active' : '' ?>">Hidden</a>
- </div>
-
- <table class="dash-table">
- <thead>
- <tr>
- <th><?= Icons::icon('grid', 'icon icon-sm') ?>Product</th>
- <th><?= Icons::icon('user', 'icon icon-sm') ?>Customer</th>
- <th><?= Icons::icon('star', 'icon icon-sm') ?>Rating</th>
- <th><?= Icons::icon('message', 'icon icon-sm') ?>Review</th>
- <th><?= Icons::icon('clock', 'icon icon-sm') ?>Posted</th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- <?php foreach ($reviews as $review): ?>
- <tr>
- <td><?= htmlspecialchars($productTitles[(int) $review['product_id']] ?? ('#' . (int) $review['product_id'])) ?></td>
- <td><?= htmlspecialchars((string) ($review['display_name'] ?? $review['email'] ?? 'Anonymous')) ?></td>
- <td><?= $review['rating'] ? str_repeat('★', (int) $review['rating']) . str_repeat('☆', 5 - (int) $review['rating']) : 'No rating' ?></td>
- <td><?= htmlspecialchars(mb_strimwidth((string) $review['body'], 0, 140, '…')) ?></td>
- <td><?= htmlspecialchars($review['created_at']) ?></td>
- <td class="dash-table-actions">
- <?php if ($statusFilter !== 'visible'): ?>
- <form method="post" style="display:inline;">
- <?= Csrf::field() ?>
- <input type="hidden" name="action" value="moderate_review">
- <input type="hidden" name="review_id" value="<?= (int) $review['id'] ?>">
- <input type="hidden" name="decision" value="show">
- <button type="submit" class="dash-btn-small dash-btn-success"><?= Icons::icon('check', 'icon icon-sm') ?>Approve</button>
- </form>
- <?php endif; ?>
- <?php if ($statusFilter !== 'hidden'): ?>
- <form method="post" style="display:inline;">
- <?= Csrf::field() ?>
- <input type="hidden" name="action" value="moderate_review">
- <input type="hidden" name="review_id" value="<?= (int) $review['id'] ?>">
- <input type="hidden" name="decision" value="hide">
- <button type="submit" class="dash-btn-small dash-btn-danger"><?= Icons::icon('x', 'icon icon-sm') ?>Hide</button>
- </form>
- <?php endif; ?>
- </td>
- </tr>
- <?php endforeach; ?>
- <?php if (empty($reviews)): ?>
- <tr><td colspan="6">Nothing here right now.</td></tr>
- <?php endif; ?>
- </tbody>
- </table>
-