В продолжении статьи о верстки рейтинга, рассмотрим PHP-скрипты системы отзывов и рейтинга в интернет-магазине.
Важно! Скрипты приведены для ознакомления и требуют болле детальной обработки входящих данных, также не стоит публиковать отзывы на сайте без модерации.
На странице товара, в форме клиент пишет отзыв и ставит рейтинг, тут понадобятся звезды для формы.
<h1>Оставьте отзыв о товаре</h1>
<form method="post" action="">
<label>Ваша оценка</label>
<div class="rating-area">
<input type="radio" id="star-5" name="rating" value="5">
<label for="star-5" title="Оценка «5»"></label>
<input type="radio" id="star-4" name="rating" value="4">
<label for="star-4" title="Оценка «4»"></label>
<input type="radio" id="star-3" name="rating" value="3">
<label for="star-3" title="Оценка «3»"></label>
<input type="radio" id="star-2" name="rating" value="2">
<label for="star-2" title="Оценка «2»"></label>
<input type="radio" id="star-1" name="rating" value="1">
<label for="star-1" title="Оценка «1»"></label>
</div>
<label>Ваше имя<label>
<input type="text" name="name">
<label>Отзыв</label>
<textarea name="text">
Внешний вид формы:
В обработчике формы, отзыв с рейтингом добавляется в БД отдельной записью с привязкой к товару.
if (isset($_POST['send'])) {
$form['prod_id'] = intval($_POST['prod_id']); // ID товара
$form['rating'] = intval($_POST['rating']); // Оценка
$form['name'] = $_POST['name']; // Имя
$form['text'] = $_POST['text']; // Отзыв
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("
INSERT INTO
`reviews`
SET
`prod_id` = :prod_id,
`rating` = :rating,
`name` = :name,
`text` = :text,
`date` = UNIX_TIMESTAMP()
");
$sth->execute($form);
}
Итак, отзывы и оценки собираются формой, теперь нужно вывести результат. Обычно в верху страницы выводится общая среднеарифметическая оценка.
$sth = $dbh->prepare("SELECT * FROM `reviews` WHERE `prod_id` = ? AND `rating` > 0");
$sth->execute(array($prod_id));
$data = $sth->fetchAll(PDO::FETCH_ASSOC);
if (!empty($data)) {
$rating = 0;
$count = count($data);
foreach ($data as $row) {
$rating += $row['rating'];
}
$rating = $rating / $count;
?>
<p>Средний рейтинг <?php echo round($rating, 1); ?></p>
<div class="rating-result">
<span class="<?php if (ceil($rating) >= 1) echo 'active'; ?>"></span>
<span class="<?php if (ceil($rating) >= 2) echo 'active'; ?>"></span>
<span class="<?php if (ceil($rating) >= 3) echo 'active'; ?>"></span>
<span class="<?php if (ceil($rating) >= 4) echo 'active'; ?>"></span>
<span class="<?php if (ceil($rating) >= 5) echo 'active'; ?>"></span>
</div>
<p>На основе <?php echo $count; ?> оценок</p>
<?php
}
Далее идет вывод отзывов клиентов с их оценками.
<h2>Отзывы</h2>
<a class="button frame" href="/form">Оставить отзыв</a>
<?php foreach ($data as $row): ?>
<div class="rating-items">
<p><?php echo $row['text']; ?></p>
<div class="rating-mini">
<span class="<?php if ($row['rating'] >= 1) echo 'active'; ?>"></span>
<span class="<?php if ($row['rating'] >= 2) echo 'active'; ?>"></span>
<span class="<?php if ($row['rating'] >= 3) echo 'active'; ?>"></span>
<span class="<?php if ($row['rating'] >= 4) echo 'active'; ?>"></span>
<span class="<?php if ($row['rating'] >= 5) echo 'active'; ?>"></span>
</div>
<p><?php echo $row['name']; ?> <?php echo date('d.m.Y', ['date']); ?></p>
</div>
<?php endforeach; ?>
Для вывода рейтинга в списке товаров понадобится мини версия звезд, а из данных общая оценка и количество отзывов.
<?php foreach ($prods as $prod): ?>
<div class="prod-item">
<img src="http://site.ru/prod/<?php echo $prod['img']; ?>">
<?php
$sth = $dbh->prepare("
SELECT
SUM(`rating`) AS `total`,
COUNT(`id`) AS `count`
FROM
`reviews`
WHERE
`prod_id` = ?
AND `rating` > 0
");
$sth->execute(array($prod['id']));
$data = $sth->fetch(PDO::FETCH_ASSOC);
$rating = ceil($data['rating'] / $data['count']);
?>
<div class="rating-mini">
<span class="<?php if ($rating >= 1) echo 'active'; ?>"></span>
<span class="<?php if ($rating >= 2) echo 'active'; ?>"></span>
<span class="<?php if ($rating >= 3) echo 'active'; ?>"></span>
<span class="<?php if ($rating >= 4) echo 'active'; ?>"></span>
<span class="<?php if ($rating >= 5) echo 'active'; ?>"></span>
</div>
<span><?php echo $data['count']; ?></span>
<a href="http://site.ru/prod/<?php echo $prod['url']; ?>">
<?php echo $prod['name']; ?>
</a>
</div>
<?php endforeach; ?>
Для удобства поиска товаров можно ввести сортировку по рейтингу по примеру SQL-запроса.