| 09:48 | ![]() |
Тема: Есть вап мастера?
AND- царицаВот код оповещений (+/-)
// Отправляем уведомление
mysql_query("INSERT INTO `cms_mail` SET
`user_id` = '" . $this->target_id . "',
`from_id` = '0',
`text` = '" . mysql_real_escape_string($this->user_data['name'] . ' оставил(а) отпечаток на вашей аватарке') . "',
`time` = '" . time() . "',
`sys` = '1',
`read` = '0'
");
mysql_query("INSERT INTO `cms_mail` SET
`user_id` = '" . $this->target_id . "',
`from_id` = '0',
`text` = '" . mysql_real_escape_string($this->user_data['name'] . ' оставил(а) отпечаток на вашей аватарке') . "',
`time` = '" . time() . "',
`sys` = '1',
`read` = '0'
");
Почему не работает? Голову себе сломал.
Если, что вот полный код файла
Тык (+/-)
<?php
define('_IN_JOHNCMS', 1);
$headmod = 'otp';
require('../incfiles/core.php');
$textl = 'Отпечаток';
require('../incfiles/head.php');
class otp
{
private $user_id;
private $user_data;
private $target_user;
private $target_id;
public function __construct()
{
$this->user_id = core::$user_id;
$this->user_data = core::$user_data;
$this->target_id = isset($_GET['id']) ? abs(intval($_GET['id'])) : 0;
$this->target_user = functions::get_user($this->target_id);
if (!$this->user_id) {
header('Location: ../login.php');
exit;
}
if (!$this->target_user) {
echo functions::display_error('Пользователь не найден');
exit;
}
// ЗАЩИТА: если пользователь пытается поставить отпечаток самому себе - перенаправляем
if ($this->user_id == $this->target_id) {
header('Location: otp_my.php');
exit;
}
}
public function display()
{
$textl = 'Отпечаток для ' . $this->target_user['name'];
// Обработка формы
if (isset($_POST['save'])) {
$this->processForm();
// РЕШЕНИЕ: После успешной обработки формы делаем редирект
if (!isset($_SESSION['errors'])) {
header('Location: ?id=' . $this->target_id);
exit;
}
}
// Вывод страницы
echo '<div class="phdr"><b>' . $textl . '</b></div>';
// Показываем ошибки, если есть
if (isset($_SESSION['errors'])) {
echo functions::display_error($_SESSION['errors']);
unset($_SESSION['errors']);
}
// Показываем сообщение об успехе, если есть
if (isset($_SESSION['message'])) {
echo '<div class="gmenu">' . $_SESSION['message'] . '</div>';
unset($_SESSION['message']);
}
// Показываем пользователя с информацией об отпечатках
$this->displayUserWithStamps();
// Форма добавления отпечатка
$this->displayForm();
// Ссылка на просмотр всех отпечатков
echo '<div class="phdr"><a href="otp_m.php?id=' . $this->target_id . '">Посмотреть все отпечатки</a></div>';
}
private function processForm()
{
$errors = array();
// Дополнительная проверка на случай прямого POST-запроса
if ($this->user_id == $this->target_id) {
$errors[] = 'Нельзя ставить отпечаток самому себе';
}
// Проверяем баллы (ИЗМЕНЕНО: 50 → 500)
if ($this->user_data['balans'] < 500) {
$errors[] = 'У вас недостаточно монет (нужно 500)';
}
// Проверяем выбранный отпечаток
if (!isset($_POST['ava']) || !in_array($_POST['ava'], range(1, 18))) {
$errors[] = 'Не выбран отпечаток';
}
// Проверяем комментарий
$komm = isset($_POST['komm']) ? trim($_POST['komm']) : '';
if (mb_strlen($komm) > 512) {
$errors[] = 'Комментарий превышает 512 символов';
}
if (!empty($errors)) {
$_SESSION['errors'] = implode('<br>', $errors);
return;
}
// Получаем размеры фото
$photo_path = ROOTPATH . 'files/users/photo/' . $this->target_id . '_small.jpg';
if (!file_exists($photo_path)) {
$_SESSION['errors'] = 'Фото пользователя не найдено';
return;
}
list($width, $height) = getimagesize($photo_path);
$left = rand(0, $width - 20);
$top = rand(0, $height - 25);
// Координаты для маленького аватара (52px)
$left_small = rand(0, 52 - 20);
$top_small = rand(0, 52 - 25);
$time_expire = time() + 60 * 60 * 24 * 2; // 2 дня
// Добавляем отпечаток в базу (ОБНОВЛЕНО: добавлены координаты для маленького аватара)
mysql_query("INSERT INTO `cms_otp` SET
`target_id` = '" . $this->target_id . "',
`user_id` = '" . $this->user_id . "',
`stamp_type` = '" . intval($_POST['ava']) . "',
`position_left` = '$left',
`position_top` = '$top',
`position_left_small` = '$left_small',
`position_top_small` = '$top_small',
`comment` = '" . mysql_real_escape_string($komm) . "',
`time_created` = '" . time() . "',
`time_expire` = '$time_expire'
");
$stamp_id = mysql_insert_id();
// Списываем монеты (ИЗМЕНЕНО: 50 → 500)
mysql_query("UPDATE `users` SET `balans` = `balans` - 500 WHERE `id` = '" . $this->user_id . "'");
// Отправляем уведомление
mysql_query("INSERT INTO `cms_mail` SET
`user_id` = '" . $this->target_id . "',
`from_id` = '0',
`text` = '" . mysql_real_escape_string($this->user_data['name'] . ' оставил(а) отпечаток на вашей аватарке') . "',
`time` = '" . time() . "',
`sys` = '1',
`read` = '0'
");
$_SESSION['message'] = 'Отпечаток успешно добавлен!';
// Обновляем данные пользователя
$this->user_data = functions::get_user($this->user_id);
}
private function displayUserWithStamps()
{
// Получаем активные отпечатки (ВСЕ активные)
$req = mysql_query("SELECT * FROM `cms_otp` WHERE `target_id` = '" . $this->target_id . "' AND `time_expire` > '" . time() . "'");
$active_stamps = mysql_num_rows($req);
// Подготавливаем аргументы для display_user
$user_arg = array();
// Добавляем информацию об отпечатках в footer
if ($active_stamps > 0) {
$user_arg['footer'] = '<div style="margin-top: 5px;">' .
'<b>Активные отпечатки:</b> ' . $active_stamps .
'</div>';
}
// Выводим пользователя
echo '<div class="user">';
echo '<div style="position: relative; display: inline-block;">';
// Выводим пользователя обычным способом
echo functions::display_user($this->target_user, $user_arg);
// После вывода пользователя добавляем отпечатки поверх аватара
if ($active_stamps > 0) {
mysql_data_seek($req, 0);
while ($stamp = mysql_fetch_assoc($req)) {
echo '<img src="../otp/' . $stamp['stamp_type'] . '.png"
style="position: absolute;
left: ' . $stamp['position_left_small'] . 'px;
top: ' . $stamp['position_top_small'] . 'px;
width: 20px; height: 25px; z-index: 1000;"
alt="Отпечаток" />';
}
}
echo '</div>';
echo '</div>';
// Информация о цене и времени
echo '<div class="menu">';
echo '<p>Цена отпечатка: <strong>500 монет</strong></p>';
echo '<p>Отпечаток исчезнет через <strong>2 дня</strong></p>';
// Показываем комментарии к отпечаткам
$this->displayStampComments();
echo '</div>';
}
private function displayStampComments()
{
// Показываем только чужие комментарии
$req = mysql_query("SELECT o.*, u.name as user_name
FROM `cms_otp` o
LEFT JOIN `users` u ON o.user_id = u.id
WHERE o.target_id = '" . $this->target_id . "'
AND o.time_expire > '" . time() . "'
AND o.comment != ''
AND o.user_id != '" . $this->target_id . "'
ORDER BY o.time_created DESC
LIMIT 5");
if (mysql_num_rows($req)) {
echo '<p><b>Последние комментарии:</b></p>';
while ($stamp = mysql_fetch_assoc($req)) {
echo '<div style="border-bottom: 1px dashed #ccc; padding: 5px 0; font-size: small;">';
echo '<span class="gray">' . functions::checkout($stamp['user_name']) . ':</span> ' . functions::checkout($stamp['comment']);
echo '</div>';
}
}
}
private function displayForm()
{
// Проверяем баллы (ИЗМЕНЕНО: 50 → 500)
if ($this->user_data['balans'] < 500) {
echo '<div class="rmenu">У вас недостаточно монет для добавления отпечатка</div>';
return;
}
echo '<form method="post" action="?id=' . $this->target_id . '">';
echo '<div class="menu">';
echo '<p><b>Выберите отпечаток:</b></p>';
// Показываем доступные отпечатки
for ($i = 1; $i <= 18; $i++) {
echo '<label style="display: inline-block; margin: 5px; text-align: center;">';
echo '<img src="../otp/' . $i . '.png" alt="' . $i . '" style="width: 20px; height: 25px;" />
';
echo '<input type="radio" name="ava" value="' . $i . '" required="required" /> ' . $i;
echo '</label>';
if ($i % 6 == 0) {
echo '
';
}
}
echo '<p><b>Комментарий (необязательно):</b>
';
echo '<input type="text" name="komm" maxlength="512" style="width: 300px;" placeholder="Максимум 512 символов" /></p>';
// ИЗМЕНЕНО: 50 → 500 в тексте кнопки
echo '<p><input type="submit" name="save" value="Добавить отпечаток (500 монет)" /></p>';
echo '</div>';
echo '</form>';
}
}
// Запуск модуля
$otp = new otp();
$otp->display();
require('../incfiles/end.php');
define('_IN_JOHNCMS', 1);
$headmod = 'otp';
require('../incfiles/core.php');
$textl = 'Отпечаток';
require('../incfiles/head.php');
class otp
{
private $user_id;
private $user_data;
private $target_user;
private $target_id;
public function __construct()
{
$this->user_id = core::$user_id;
$this->user_data = core::$user_data;
$this->target_id = isset($_GET['id']) ? abs(intval($_GET['id'])) : 0;
$this->target_user = functions::get_user($this->target_id);
if (!$this->user_id) {
header('Location: ../login.php');
exit;
}
if (!$this->target_user) {
echo functions::display_error('Пользователь не найден');
exit;
}
// ЗАЩИТА: если пользователь пытается поставить отпечаток самому себе - перенаправляем
if ($this->user_id == $this->target_id) {
header('Location: otp_my.php');
exit;
}
}
public function display()
{
$textl = 'Отпечаток для ' . $this->target_user['name'];
// Обработка формы
if (isset($_POST['save'])) {
$this->processForm();
// РЕШЕНИЕ: После успешной обработки формы делаем редирект
if (!isset($_SESSION['errors'])) {
header('Location: ?id=' . $this->target_id);
exit;
}
}
// Вывод страницы
echo '<div class="phdr"><b>' . $textl . '</b></div>';
// Показываем ошибки, если есть
if (isset($_SESSION['errors'])) {
echo functions::display_error($_SESSION['errors']);
unset($_SESSION['errors']);
}
// Показываем сообщение об успехе, если есть
if (isset($_SESSION['message'])) {
echo '<div class="gmenu">' . $_SESSION['message'] . '</div>';
unset($_SESSION['message']);
}
// Показываем пользователя с информацией об отпечатках
$this->displayUserWithStamps();
// Форма добавления отпечатка
$this->displayForm();
// Ссылка на просмотр всех отпечатков
echo '<div class="phdr"><a href="otp_m.php?id=' . $this->target_id . '">Посмотреть все отпечатки</a></div>';
}
private function processForm()
{
$errors = array();
// Дополнительная проверка на случай прямого POST-запроса
if ($this->user_id == $this->target_id) {
$errors[] = 'Нельзя ставить отпечаток самому себе';
}
// Проверяем баллы (ИЗМЕНЕНО: 50 → 500)
if ($this->user_data['balans'] < 500) {
$errors[] = 'У вас недостаточно монет (нужно 500)';
}
// Проверяем выбранный отпечаток
if (!isset($_POST['ava']) || !in_array($_POST['ava'], range(1, 18))) {
$errors[] = 'Не выбран отпечаток';
}
// Проверяем комментарий
$komm = isset($_POST['komm']) ? trim($_POST['komm']) : '';
if (mb_strlen($komm) > 512) {
$errors[] = 'Комментарий превышает 512 символов';
}
if (!empty($errors)) {
$_SESSION['errors'] = implode('<br>', $errors);
return;
}
// Получаем размеры фото
$photo_path = ROOTPATH . 'files/users/photo/' . $this->target_id . '_small.jpg';
if (!file_exists($photo_path)) {
$_SESSION['errors'] = 'Фото пользователя не найдено';
return;
}
list($width, $height) = getimagesize($photo_path);
$left = rand(0, $width - 20);
$top = rand(0, $height - 25);
// Координаты для маленького аватара (52px)
$left_small = rand(0, 52 - 20);
$top_small = rand(0, 52 - 25);
$time_expire = time() + 60 * 60 * 24 * 2; // 2 дня
// Добавляем отпечаток в базу (ОБНОВЛЕНО: добавлены координаты для маленького аватара)
mysql_query("INSERT INTO `cms_otp` SET
`target_id` = '" . $this->target_id . "',
`user_id` = '" . $this->user_id . "',
`stamp_type` = '" . intval($_POST['ava']) . "',
`position_left` = '$left',
`position_top` = '$top',
`position_left_small` = '$left_small',
`position_top_small` = '$top_small',
`comment` = '" . mysql_real_escape_string($komm) . "',
`time_created` = '" . time() . "',
`time_expire` = '$time_expire'
");
$stamp_id = mysql_insert_id();
// Списываем монеты (ИЗМЕНЕНО: 50 → 500)
mysql_query("UPDATE `users` SET `balans` = `balans` - 500 WHERE `id` = '" . $this->user_id . "'");
// Отправляем уведомление
mysql_query("INSERT INTO `cms_mail` SET
`user_id` = '" . $this->target_id . "',
`from_id` = '0',
`text` = '" . mysql_real_escape_string($this->user_data['name'] . ' оставил(а) отпечаток на вашей аватарке') . "',
`time` = '" . time() . "',
`sys` = '1',
`read` = '0'
");
$_SESSION['message'] = 'Отпечаток успешно добавлен!';
// Обновляем данные пользователя
$this->user_data = functions::get_user($this->user_id);
}
private function displayUserWithStamps()
{
// Получаем активные отпечатки (ВСЕ активные)
$req = mysql_query("SELECT * FROM `cms_otp` WHERE `target_id` = '" . $this->target_id . "' AND `time_expire` > '" . time() . "'");
$active_stamps = mysql_num_rows($req);
// Подготавливаем аргументы для display_user
$user_arg = array();
// Добавляем информацию об отпечатках в footer
if ($active_stamps > 0) {
$user_arg['footer'] = '<div style="margin-top: 5px;">' .
'<b>Активные отпечатки:</b> ' . $active_stamps .
'</div>';
}
// Выводим пользователя
echo '<div class="user">';
echo '<div style="position: relative; display: inline-block;">';
// Выводим пользователя обычным способом
echo functions::display_user($this->target_user, $user_arg);
// После вывода пользователя добавляем отпечатки поверх аватара
if ($active_stamps > 0) {
mysql_data_seek($req, 0);
while ($stamp = mysql_fetch_assoc($req)) {
echo '<img src="../otp/' . $stamp['stamp_type'] . '.png"
style="position: absolute;
left: ' . $stamp['position_left_small'] . 'px;
top: ' . $stamp['position_top_small'] . 'px;
width: 20px; height: 25px; z-index: 1000;"
alt="Отпечаток" />';
}
}
echo '</div>';
echo '</div>';
// Информация о цене и времени
echo '<div class="menu">';
echo '<p>Цена отпечатка: <strong>500 монет</strong></p>';
echo '<p>Отпечаток исчезнет через <strong>2 дня</strong></p>';
// Показываем комментарии к отпечаткам
$this->displayStampComments();
echo '</div>';
}
private function displayStampComments()
{
// Показываем только чужие комментарии
$req = mysql_query("SELECT o.*, u.name as user_name
FROM `cms_otp` o
LEFT JOIN `users` u ON o.user_id = u.id
WHERE o.target_id = '" . $this->target_id . "'
AND o.time_expire > '" . time() . "'
AND o.comment != ''
AND o.user_id != '" . $this->target_id . "'
ORDER BY o.time_created DESC
LIMIT 5");
if (mysql_num_rows($req)) {
echo '<p><b>Последние комментарии:</b></p>';
while ($stamp = mysql_fetch_assoc($req)) {
echo '<div style="border-bottom: 1px dashed #ccc; padding: 5px 0; font-size: small;">';
echo '<span class="gray">' . functions::checkout($stamp['user_name']) . ':</span> ' . functions::checkout($stamp['comment']);
echo '</div>';
}
}
}
private function displayForm()
{
// Проверяем баллы (ИЗМЕНЕНО: 50 → 500)
if ($this->user_data['balans'] < 500) {
echo '<div class="rmenu">У вас недостаточно монет для добавления отпечатка</div>';
return;
}
echo '<form method="post" action="?id=' . $this->target_id . '">';
echo '<div class="menu">';
echo '<p><b>Выберите отпечаток:</b></p>';
// Показываем доступные отпечатки
for ($i = 1; $i <= 18; $i++) {
echo '<label style="display: inline-block; margin: 5px; text-align: center;">';
echo '<img src="../otp/' . $i . '.png" alt="' . $i . '" style="width: 20px; height: 25px;" />
';
echo '<input type="radio" name="ava" value="' . $i . '" required="required" /> ' . $i;
echo '</label>';
if ($i % 6 == 0) {
echo '
';
}
}
echo '<p><b>Комментарий (необязательно):</b>
';
echo '<input type="text" name="komm" maxlength="512" style="width: 300px;" placeholder="Максимум 512 символов" /></p>';
// ИЗМЕНЕНО: 50 → 500 в тексте кнопки
echo '<p><input type="submit" name="save" value="Добавить отпечаток (500 монет)" /></p>';
echo '</div>';
echo '</form>';
}
}
// Запуск модуля
$otp = new otp();
$otp->display();
require('../incfiles/end.php');
Может поможет кто-нить) Разъяснит как работают в джоне оповещения.
johncms 6.2.2 если это важно






