PHP. Разработка модуля комментариев для сайта - Дмитрий Приходько
Шрифт:
Интервал:
Закладка:
// ratio – коэффициент пропорциональности
$w = 90; // квадратная 90x90. Можно поставить и другой размер.
$h = 90;
// создаём исходное изображение на основе
// исходного файла и определяем его размеры
$w_src = imagesx($im); //вычисляем ширину
$h_src = imagesy($im); //вычисляем высоту изображения
if ($w_src !== $h_src) {
exit('<h4>Стороны изображения для загрузки должны быть равны. Например 256*256.<br>Рекомендую использовать готовые аватары со специализированных сайтов.<br>
Или подготовьте картинку в графическом редакторе</h4><br><i>p.s. грузим аватары, а не картины</i>');
}
// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w, $w);
$white = imagecolorallocate($dest, 255, 255, 255);
imagefill($dest, 0, 0, $white);
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $h_src);
$date = time(); //вычисляем время в настоящий момент.
imagejpeg($dest, $path_to_90_directory . $date . ".jpg"); //сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен.
$avatar = $path_to_90_directory . $date . ".jpg"; //заносим в переменную путь до аватара.
$delfull = $path_to_90_directory . $filename;
unlink($delfull); //удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было – получить миниатюру.
} else {
//в случае несоответствия формата, выдаем соответствующее сообщение
exit("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>"); //останавливаем выполнение сценариев
}
//конец процесса загрузки и присвоения переменной $avatar адреса загруженной авы
}
/*.........................Сохраняем пользователя в базу......................*/
if (!isset($date)) {
$date = time();
}
try {
$sql = "INSERT INTO users (login,password,email,img,date) VALUES(:login,:password,:email,:img, :date)";
$result2 = $dsn->prepare($sql);
$result2->execute([
'login' => $login,
'password' => $password,
'email' => $email,
'img' => $avatar,
'date' => $date
]);
$role = 'user';
$authorid = $dsn->lastInsertId();
$sql = "INSERT INTO authorrole (authorid,roleid) VALUE (:authorid,:roleid)";
$resultrole = $dsn->prepare($sql);
$resultrole->execute([
'authorid' => $authorid,
'roleid' => $role
]);
echo '<img src="' . $avatar . '">';
echo ' ' . '<h3>' . $login . '</h3>' . ' ' . "Вы успешно зарегистрированы! <a href='/index.html'>Главная страница</a>";
} catch (PDOException $e) {
echo "You have an error: " . $e->getMessage() . "<br>";
echo "On line: " . $e->getLine();
}
$activation = md5($authorid) . md5($login);
$subject = "Подтверждение регистрации"; //тема сообщения
$message = "Здравствуйте! Спасибо за регистрацию в модуле комментариев chatnВаш логин: " . $login . "n
Перейдите по ссылке, чтобы активировать ваш аккаунт:nhttp://" . $_SERVER['HTTP_HOST'] . "/chat/admin/users/activation.php?login=" . $login . "&code=" . $activation . "nС уважением,n
Администратор модуля"; //содержание сообщение
mail($email, $subject, $message, "Content-type:text/plane; Charset=utf-8rn"); //отправляем сообщение
echo "<hr><h3>Вам на E-mail выслано письмо с cсылкой, для подтверждения регистрации.</h3> <br><b>Внимание! Ссылка действительна 1 час.</b>"; //говорим о отправленном письме пользователю
В этом скрипте проверяются данные пользователя и сохраняются в БД. Обработка изображений для аватара сделана только для квадрата, т.к. PHP это язык серверный и обработка изображений явно не его конек. Результаты при обработке прямоугольников мягко говоря разочаровывают, поэтому загрузка и обработка прямоугольных исходников не предусмотрена. Лучше взять готовый или подготовить аватар в графическом редакторе. Код в данном скрипте прокомментирован практически построчно, думается вопросов быть не должно.
С административным разделом закончили, приступаем к комментариям.
22. Комментарии
Для работы с комментариями используем папку «say», созданную ранее в разделе 3. На данном этапе она пуста и кроме папки «smiles» в которой хранятся заранее подготовленные смайлы в ней ничего нет.
23. Контроллер 3
Для вывода комментариев создаем контроллер 3 «say_controller.php».
Листинг 38. say_controller.php Путь: news/chat/ say_controller.php
<?php
error_reporting(E_ALL);
include_once $_SERVER['DOCUMENT_ROOT'] .'/chat/admin/clean.php';
include $_SERVER['DOCUMENT_ROOT'].'/chat/function/print_comment.php';
include $_SERVER['DOCUMENT_ROOT'].'/chat/function/print_smile_set.php';
$page_id = $_SERVER['PHP_SELF']; //индексируем страницу
/* Если пользователь авторизован вставляем ссылку Добавить комментарий */
if (isset($_SESSION['login'])) {
$userid = $_SESSION['userid'];
echo '<div class="addsay" id=""><a href="?addsay" class="aaddsays">Добавить комментарий</a></div>';
}
else {
$userid = '';
}
/* Устанавливаем условие видимости блока комментариев и кнопок показать и скрыть комментарии */
if (isset($_GET['opensay'])) {
$display_say = 'display:none;';
$display_but = 'display:flow-root;';
}
else {
$display_say = 'display:flow-root;';
$display_but = 'display:none;';
}
/* Применяем условие видимости к кнопкам показать и скрыть комментарии */
echo '<div class="opensay" style="'.$display_but.'"><a href="?" class="aopensays">Показать комментарии</a></div>';
echo '<div class="opensay" style="'.$display_say.'"><a href="?opensay" class="aopensays">Скрыть комментарии</a></div>';
/* Вставляем форму добавить комментарий */
if (isset($_GET['addsay'])){
$pageid = strtok($_SERVER['PHP_SELF'],'?');
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/say/form_addsay.html.php';
}
/* Выводим лист комментариев */
//сортируем в обратном порядке наверху последний комментарий
try {
include $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';
$sql = 'SELECT say.id, say.userid, say.saydate, say.saytext, users.login, users.img FROM say INNER JOIN users ON users.`id` = say.userid WHERE say.page_id = :page_id ORDER BY say.id DESC';
$s = $dsn->prepare($sql);
$s -> bindValue(':page_id', $page_id);
$s -> execute();
}
catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit();
}
foreach ($s as $row) {
$say[] = array(
'id' => $row['id'],
'saytext' => $row['saytext'],
'saydate' => $row['saydate'],
'img' => $row['img'],
'login' => $row['login'],
'userid' => $row['userid']);
}
include_once $_SERVER['DOCUMENT_ROOT'].'/chat/say/form_say.html.php';
Контроллер определяет условия видимости управляющих комментариями кнопок и форм ввода комментариев, индексирует страницу и формирует массив say[] с комментариями, который будет выводится в форме form_say.html.php после обработки.
Как видим у него также есть файлы которые нужно обрабатывать. Если сейчас подключить контроллер, то на странице будет ошибка. Файлы еще не готовы. В папке «chat» создаем папку «function» в которой будут находиться функции по обработке комментариев.
24. Папка функций
24.1 Печать смайлов
Для вывода набора доступных смайлов написана функция «print_smile_set.php»
Листинг 39. print_smile_set.php Путь: news/function/ print_smile_set.php
<?php
error_reporting(E_ALL);
/* печать блока доступных смайлов в виде кнопок */
function print_smile_set()
{
try {
include $_SERVER['DOCUMENT_ROOT'] . '/chat/dsn.php';
$sql = "SELECT smile, path FROM smiles";
$s = $dsn->query($sql);
$ress = $s->fetchall();
foreach ($ress as $row) :
$smiles_key = $row['smile'];
$smile_path = $row['path']; ?>
<input type="submit" name="smile" title="<?= $smiles_key; ?>" value="<?= $smiles_key; ?>"
style="background:url(<?= $smile_path; ?> );
background-repeat: no-repeat;float:left;height:45px;border:none;
width:50px;font-size:0;" />
<?php
endforeach;
} catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit();
}
}
Смайлы сделаны в виде кнопок. В свойстве «background» кнопки идет картинка смайла. Нажатие кнопки вставляет смайл.
Внимание! Стили CSS для смайлов задаются непосредственно в скрипте в строке <input … style=””>
24.2 Печать комментариев
Для печати комментариев служит функция «print_comment.php»
Листинг 40. print_comment.php Путь: news/function/ print_comment.php
<?php
/* печать комментария со смайлами */