diff --git a/README.md b/README.md index 17b48b0..3f45f7f 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,30 @@ ### media -## Модуль Баннер v2.26.0 +## Модуль Баннер v3.31.0 -### Модуль позволяет: +### для AVE.CMS ALT ≥ ≥ v3.31 + +* Модуль позволяет: * Организовать удобное управление показами рекламных баннеров на вашем сайте. * Для того, чтобы отобразить рекламный баннер, разместите системный тег [mod_banner:XXX] в нужном месте вашего шаблона сайта или содержимом документа. * Идентификаторы системных тегов указаны в разделе - Управление категориями. - * Допустимые форматы рекламных баннеров: jpg, jpeg, png, gif, swf. - + * Допустимые форматы рекламных баннеров: jpg, jpeg, png, gif, webp. +* Установка: + * Скачайте архив с модулем banner-main.zip и положите его в папку modules, разархивируйте, после чего у вас появится папка media, ее оставляем архив banner-main.zip удаляем. + * Перейдите в раздел управления модулями вкладка Неустановленные модули, установите модуль Баннер. + * Перейдите к управлению модулем, в созданном при установке примере перейдите в раздел Управление категориями, скопируйте системный тег ```[mod_banner:1]``` принадлежащий Категории 1 и разместите его в документе или Основном шаблоне или в шаблоне Рубрики. +* Шаблон вывода в публичной части сайта: + * Верстка публичной части модуля находится в шаблоне modules/media/templates/banner_viewer.tpl ### Changelog: +28.03.2026 - обновление модуля - версия 3.32 - рефакторинг кода для работы в ave.cms ALT v3.31. Добавлен шаблон вывода в публичной части сайта. + 04.09.2019 - версия 2.26.0 - адаптация для версии ave.cms 3.26 25.09.2016 - Исправления (css + html) вывода пагинации страниц. 03.06.2016 - Исправлен баг с неправильным формированием пути к изображению баннера, при размещении его на странице с сылкой типа site.ru/folder/link/ -03.06.2016 - добавлен атрибут style="width:100%" для изображения баннера, при использовании в адаптивной верстке. \ No newline at end of file +03.06.2016 - добавлен атрибут style="width:100%" для изображения баннера, при использовании в адаптивной верстке. \ No newline at end of file diff --git a/class/banner.php b/class/banner.php index 1c9c2b4..993b8ba 100644 --- a/class/banner.php +++ b/class/banner.php @@ -7,441 +7,476 @@ * @subpackage module_Banner * @filesource */ -class ModulBanner { +class ModuleBanner { /** - * СВОЙСТВА + * СВОЙСТВА */ - var $_limit = 15; - var $_allowed_files = - array( - 'image/jpg', - 'image/jpeg', - 'image/pjpeg', - 'image/x-png', - 'image/png', - 'image/gif', - 'application/x-shockwave-flash' - ); - -/** - * ВНЕШНИЕ МЕТОДЫ - */ - - function displayBanner($id) { - global $AVE_DB; - - mt_rand(); - $banner_id = ''; - $output = ''; - - $cur_hour = date('G'); - $and_time = "AND ((ZStart = '0' AND ZEnde = '0') OR (ZStart <= '$cur_hour' AND ZEnde > '$cur_hour') OR (ZStart > ZEnde AND (ZStart BETWEEN ZStart AND '$cur_hour' OR ZEnde BETWEEN '$cur_hour' AND ZEnde)))"; - $and_category = (!empty($id) && is_numeric($id)) ? "AND KatId = '" . $id . "'" : ''; - - $num = $AVE_DB->Query(" - SELECT Id - FROM " . PREFIX . "_modul_banners - WHERE Aktiv = '1' - AND (MaxKlicks = '0' OR (Klicks < MaxKlicks AND MaxKlicks != '0')) - AND (MaxViews = '0' OR (Views < MaxViews AND MaxViews != '0')) - " . $and_time . " - " . $and_category . " - ")->NumRows(); - - $zufall = ($num) ? rand(1,3) : 3; - - $sql = $AVE_DB->Query(" - SELECT - Id, - Bannertags, - Target, - Bannername, - BildAlt, - Width, - Height - FROM " . PREFIX . "_modul_banners - WHERE Aktiv = '1' - AND (MaxKlicks = '0' OR (Klicks < MaxKlicks AND MaxKlicks != '0')) - AND (MaxViews = '0' OR (Views < MaxViews AND MaxViews != '0')) - " . $and_time . " - " . $and_category . " - AND Gewicht <= '" . $zufall . "' - "); - $num = $sql->NumRows(); - - $banner_id = ($num == 1) ? 0 : rand(0, $num-1); - - $sql->DataSeek($banner_id); - $banner = $sql->FetchAssocArray(); - - if(!empty($banner['Bannertags'])) - { - if (stristr($banner['Bannertags'], '.swf') === false) - { - $output = '' . $banner['Bannername'] . ': ' . $banner['BildAlt'] . ''; - } - else - { - $output = '
'; - $output .= ' '; - $output .= ' '; - $output .= ' '; - $output .= ' '; - $output .= ' '; - $output .= ' '; - $output .= ' '; - $output .= '
'; - } - - if(!empty($banner['Id'])) - { - $AVE_DB->Query(" - UPDATE " . PREFIX . "_modul_banners - SET Views = Views + 1 - WHERE Id = '" . $banner['Id'] . "' - "); - } - } - - echo $output; - } - - function fetch_addclick($id) { - global $AVE_DB; - - switch($_REQUEST['action']) { - case '': - case 'addclick': - $sql = $AVE_DB->Query(" - SELECT BannerUrl - FROM " . PREFIX . "_modul_banners - WHERE Id = '" . $id . "' - LIMIT 1 - "); - $banner_url = $sql->GetCell(); - if(!empty($banner_url)) { - $AVE_DB->Query(" - UPDATE " . PREFIX . "_modul_banners - SET Klicks = Klicks + 1 - WHERE Id = '" . $id . "' - "); - header('Location:' . $banner_url); - } - - exit; - break; - } - } - - function showBanner($tpl_dir) { - global $AVE_DB, $AVE_Template; - - $limit = $this->_limit; - $sql = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_modul_banners"); - $num = $sql->NumRows(); - - $seiten = ceil($num / $limit); - $start = get_current_page() * $limit - $limit; - - $items = array(); - $sql = $AVE_DB->Query(" - SELECT * - FROM " . PREFIX . "_modul_banners - LIMIT " . $start . "," . $limit - ); - while($row = $sql->FetchRow()) { - array_push($items, $row); - } - - if($num > $limit) - { - $page_nav = ' {t} '; - $page_nav = get_pagination($seiten, 'page', $page_nav); - $AVE_Template->assign('page_nav', $page_nav); - } - - $AVE_Template->assign('items', $items); - $AVE_Template->assign('mod_path', BANNER_DIR); - $AVE_Template->assign('kategs', $this->_showKategs()); - $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'banners.tpl')); - } - - function editBanner($tpl_dir,$id) { - global $AVE_DB, $AVE_Template; - - $sql = $AVE_DB->Query(" - SELECT * - FROM " . PREFIX . "_modul_banners - WHERE Id = '" . $id . "' - "); - $row = $sql->FetchRow(); - - if (stristr(($row->Bannertags),'.swf') === false) $row->swf = false; else $row->swf = true; - - if(@!is_writeable(BASE_DIR . '/modules/' . BANNER_DIR . '/files/')) { - $AVE_Template->assign('folder_protected', 1); - } - - $AVE_Template->assign('item', $row); - $AVE_Template->assign('mod_path', BANNER_DIR); - $AVE_Template->assign('formaction', 'index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=quicksave&cp=' . SESSION . '&id=' . $_REQUEST['id'] . '&pop=1'); - $AVE_Template->assign('kategs', $this->_showKategs()); - $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'form.tpl')); - } - - function deleteBanner($id) { - global $AVE_DB; - - $sql = $AVE_DB->Query(" - SELECT - Bannertags, - Bannername - FROM " . PREFIX . "_modul_banners - WHERE Id = '" . $id . "' - "); - $row = $sql->FetchRow(); - - @unlink(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $row->Bannertags); - $AVE_DB->Query(" - DELETE - FROM " . PREFIX . "_modul_banners - WHERE Id = '" . $id . "' - "); - - reportLog($_SESSION['user_name'] . ' - удалил баннер (' . $row->Bannername . ')', 2, 2); - - header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=1&cp=' . SESSION); - exit; - } - - function quickSave($id) { - global $AVE_DB, $config_vars; - - if(!empty($_POST['del'])) { - $sql = $AVE_DB->Query(" - SELECT Bannertags - FROM " . PREFIX . "_modul_banners - WHERE Id = '" . $id . "' - "); - $row = $sql->FetchRow(); - - $AVE_DB->Query(" - UPDATE " . PREFIX . "_modul_banners - SET Bannertags = '' - WHERE Id = '" . $id . "' - "); - - @unlink(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $row->Bannertags); - } - - if(!empty($_POST['Bannername'])) { - $d_name = strtolower($_FILES['New']['name']); - $d_name = str_replace(' ','', $d_name); - $d_tmp = $_FILES['New']['tmp_name']; - - if(!empty($_FILES['New']['type'])) { - if(in_array($_FILES['New']['type'], $this->_allowed_files)) { - $d_name = preg_replace('/[^ ._a-z0-9-]/', '_', $d_name); - if(file_exists(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) $d_name = $this->_Zufall() . '__' . $d_name; - - if(@move_uploaded_file($d_tmp, BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) { - @chmod(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name, 0777); - echo ""; - - $AVE_DB->Query(" - UPDATE " . PREFIX . "_modul_banners - SET Bannertags = '" . $d_name . "' - WHERE Id = '" . $id . "' - "); - - reportLog($_SESSION['user_name'] . ' - заменил изображение баннера на (' . $d_name . ')', 2, 2); - - } else { - echo ""; - } - - } else { - echo ""; - } - } - - $AVE_DB->Query(" - UPDATE " . PREFIX . "_modul_banners - SET - Bannername = '" . $_REQUEST['Bannername'] . "', - BannerUrl = '" . $_REQUEST['BannerUrl'] . "', - Gewicht = '" . $_REQUEST['Gewicht'] . "', - Views = '" . $_REQUEST['Anzeigen'] . "', - Klicks = '" . $_REQUEST['Klicks'] . "', - BildAlt = '" . $_REQUEST['BildAlt'] . "', - KatId = '" . $_REQUEST['KatId'] . "', - MaxKlicks = '" . $_REQUEST['MaxKlicks'] . "', - MaxViews = '" . $_REQUEST['MaxViews'] . "', - ZStart = '" . $_REQUEST['ZStart'] . "', - ZEnde = '" . $_REQUEST['ZEnde'] . "', - Aktiv = '" . $_REQUEST['Aktiv'] . "', - Target = '" . $_REQUEST['Target'] . "', - Width = '" . $_REQUEST['Width'] . "', - Height = '" . $_REQUEST['Height'] . "' - WHERE - Id = '" . $id . "' - "); - reportLog($_SESSION['user_name'] . ' - изменил параметры баннера (' . stripslashes($_REQUEST['Bannername']) . ')', 2, 2); - } - - header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=1&cp=' . SESSION); - exit; - } - - function newBanner($tpl_dir) { - global $AVE_DB, $AVE_Template, $config_vars; - - switch($_REQUEST['sub']) { - case '': - if(!@is_writeable(BASE_DIR . '/modules/' . BANNER_DIR . '/files/')) { - $AVE_Template->assign('folder_protected', 1); - } - $AVE_Template->assign('mod_path', BANNER_DIR); - $AVE_Template->assign('kategs', $this->_showKategs()); - $AVE_Template->assign('formaction', 'index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=newbanner&sub=save&cp=' . SESSION . '&pop=1'); - $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'form.tpl')); - break; - - case 'save': - if(!empty($_POST['Bannername'])) { - $file = ''; - - $d_name = strtolower($_FILES['New']['name']); - $d_name = str_replace(' ', '', $d_name); - $d_tmp = $_FILES['New']['tmp_name']; - - if(!empty($_FILES['New']['type'])) { - if(in_array($_FILES['New']['type'], $this->_allowed_files)) { - $d_name = preg_replace('/[^ ._a-z0-9-]/', '_', $d_name); - if(file_exists(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) $d_name = $this->_Zufall() . '__' . $d_name; - - if(@move_uploaded_file($d_tmp, BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) { - @chmod(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name, 0777); - echo ""; - reportLog($_SESSION['user_name'] . ' - добавил изображение баннера (' . $d_name . ')', 2, 2); - $file = $d_name; - } else { - echo ""; - } - } else { - echo ""; - } - } - - $AVE_DB->Query(" - INSERT - INTO " . PREFIX . "_modul_banners - SET - KatId = '" . $_REQUEST['KatId'] . "', - Bannertags = '" . $file . "', - BannerUrl = '" . $_REQUEST['BannerUrl'] . "', - Gewicht = '" . $_REQUEST['Gewicht'] . "', - Bannername = '" . $_REQUEST['Bannername'] . "', - BildAlt = '" . $_REQUEST['BildAlt'] . "', - MaxKlicks = '" . $_REQUEST['MaxKlicks'] . "', - MaxViews = '" . $_REQUEST['MaxViews'] . "', - ZStart = '" . $_REQUEST['ZStart'] . "', - ZEnde = '" . $_REQUEST['ZEnde'] . "', - Aktiv = '" . $_REQUEST['Aktiv'] . "', - Target = '" . $_REQUEST['Target'] . "', - Width = '" . $_REQUEST['Width'] . "', - Height = '" . $_REQUEST['Height'] . "' - "); - - reportLog($_SESSION['user_name'] . ' - добавил новый баннер (' . stripslashes($_REQUEST['Bannername']) . ')', 2, 2); - } - header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=1&cp=' . SESSION); - exit; - } - } - - function bannerKategs($tpl_dir) { - global $AVE_DB, $AVE_Template; - - switch($_REQUEST['sub']) { - case '' : - $items = array(); - $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_modul_banner_categories"); - while($row = $sql->FetchRow()) { - array_push($items, $row); - } - $AVE_Template->assign('items', $items); - $AVE_Template->assign('mod_path', BANNER_DIR); - $AVE_Template->assign('kategs', $this->_showKategs()); - $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'kategs.tpl')); - break; - - case 'save' : - foreach($_POST['KatName'] as $id => $kateg) { - if(!empty($kateg)) { - $AVE_DB->Query(" - UPDATE " . PREFIX . "_modul_banner_categories - SET KatName = '" . $kateg . "' - WHERE Id = '" . $id . "' - "); - } - } - - foreach($_POST['del'] as $id => $kateg) { - $AVE_DB->Query(" - DELETE - FROM " . PREFIX . "_modul_banners - WHERE KatId = '" . $id . "' - "); - $AVE_DB->Query(" - DELETE - FROM " . PREFIX . "_modul_banner_categories - WHERE Id = '" . $id . "' - "); - - reportLog($_SESSION['user_name'] . ' - удалил категорию баннеров (' . $id . ')', 2, 2); - } - - header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=kategs&cp=' . SESSION); - break; - - case 'new' : - if(!empty($_REQUEST['KatName'])) { - $sql = $AVE_DB->Query(" - INSERT - INTO " . PREFIX . "_modul_banner_categories - SET KatName = '" . $_REQUEST['KatName'] . "' - "); - - reportLog($_SESSION['user_name'] . ' - добавил новую категорию (' . stripslashes($_REQUEST['KatName']) . ')', 2, 2); - } - - header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=kategs&cp=' . SESSION); - break; - } - } - -/** - * ВНУТРЕННИЕ МЕТОДЫ - */ - - function _Zufall() { - $zufall = rand(1000, 99999); - return $zufall; - } - - function _showKategs() { - global $AVE_DB; - - $kategs = array(); - $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_modul_banner_categories"); - while($row = $sql->FetchRow()) { - array_push($kategs, $row); - } - - return $kategs; - } + var $_limit = 15; + var $_allowed_files = + array( + 'image/jpg', + 'image/jpeg', + 'image/pjpeg', + 'image/x-png', + 'image/png', + 'image/gif', + 'image/webp' + ); + +function displayBanner($id) { + global $AVE_DB, $AVE_Template; + + mt_rand(); + + $cur_hour = (int)date('G'); + // Сохраняем ваше оригинальное условие времени полностью + $and_time = "AND ((start_hour = '0' AND end_hour = '0') OR (start_hour <= '$cur_hour' AND end_hour > '$cur_hour') OR (start_hour > end_hour AND (start_hour BETWEEN start_hour AND '$cur_hour' OR end_hour BETWEEN '$cur_hour' AND end_hour)))"; + $and_category = (!empty($id) && is_numeric($id)) ? "AND category_id = '" . (int)$id . "'" : ''; + + $num_rows = $AVE_DB->Query(" + SELECT id + FROM " . PREFIX . "_module_banners + WHERE is_active = '1' + AND (max_clicks = '0' OR (clicks < max_clicks AND max_clicks != '0')) + AND (max_views = '0' OR (views < max_views AND max_views != '0')) + " . $and_time . " + " . $and_category . " + ")->NumRows(); + + // Ваша логика выбора порога веса + $weight_limit = ($num_rows) ? rand(1, 3) : 3; + + $sql = $AVE_DB->Query(" + SELECT + id, + banner_file, + target, + banner_name, + image_alt, + width, + height + FROM " . PREFIX . "_module_banners + WHERE is_active = '1' + AND (max_clicks = '0' OR (clicks < max_clicks AND max_clicks != '0')) + AND (max_views = '0' OR (views < max_views AND max_views != '0')) + " . $and_time . " + " . $and_category . " + AND weight <= '" . (int)$weight_limit . "' + "); + $num = $sql->NumRows(); + + if ($num == 0) return; + + $target_index = ($num == 1) ? 0 : rand(0, $num - 1); + + $sql->DataSeek($target_index); + $banner = $sql->FetchAssocArray(); + + if(!empty($banner['banner_file'])) + { + // Передаем переменные в Smarty + $AVE_Template->assign([ + 'banner' => $banner, + 'mod_path' => BANNER_DIR, + 'abs_path' => ABS_PATH + ]); + + // Выводим через шаблон (путь подставьте свой, обычно так) + $AVE_Template->display(BASE_DIR . '/modules/' . BANNER_DIR . '/templates/banner_viewer.tpl'); + + if(!empty($banner['id'])) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_banners + SET views = views + 1 + WHERE id = '" . (int)$banner['id'] . "' + "); + } + } + } + +function fetch_addclick($id) { + global $AVE_DB; + + // Используем ?? '', чтобы не было Warning, если action не передан + $action = $_REQUEST['action'] ?? ''; + + switch($action) { + case '': + case 'addclick': + $sql = $AVE_DB->Query(" + SELECT banner_url + FROM " . PREFIX . "_module_banners + WHERE id = '" . (int)$id . "' + LIMIT 1 + "); + + $banner_url = $sql->GetCell(); + + if(!empty($banner_url)) { + // Сначала обновляем счетчик кликов + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_banners + SET clicks = clicks + 1 + WHERE id = '" . (int)$id . "' + "); + + // Затем перенаправляем пользователя + header('Location: ' . $banner_url); + } else { + // Если URL пустой или баннер не найден, возвращаем на главную + header('Location: index.php'); + } + + exit; + break; + } } -?> + + function showBanners($tpl_dir) { + global $AVE_DB, $AVE_Template; + + $limit = (int)$this->_limit; + $sql = $AVE_DB->Query("SELECT id FROM " . PREFIX . "_module_banners"); + $num = $sql->NumRows(); + + $seiten = ceil($num / $limit); + $start = (int)(get_current_page() * $limit - $limit); + if ($start < 0) $start = 0; + + $items = array(); + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_banners + LIMIT " . (int)$start . "," . (int)$limit . " + "); + while($row = $sql->FetchRow()) { + array_push($items, $row); + } + + if($num > $limit) + { + $page_nav = ' {t} '; + $page_nav = get_pagination($seiten, 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $AVE_Template->assign('items', $items); + $AVE_Template->assign('mod_path', BANNER_DIR); + $AVE_Template->assign('kategs', $this->_showCategories()); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'banners.tpl')); + } + + function editBanner($tpl_dir,$id) { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_banners + WHERE id = '" . (int)$id . "' + "); + $row = $sql->FetchRow(); + + if (stristr(($row->banner_file),'.swf') === false) $row->swf = false; else $row->swf = true; + + if(@!is_writeable(BASE_DIR . '/modules/' . BANNER_DIR . '/files/')) { + $AVE_Template->assign('folder_protected', 1); + } + + $AVE_Template->assign('item', $row); + $AVE_Template->assign('mod_path', BANNER_DIR); + $AVE_Template->assign('formaction', 'index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=quicksave&cp=' . SESSION . '&id=' . (int)$id . '&pop=1'); + $AVE_Template->assign('kategs', $this->_showCategories()); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'form.tpl')); + } + + function deleteBanner($id) { + global $AVE_DB; + + $sql = $AVE_DB->Query(" + SELECT + banner_file, + banner_name + FROM " . PREFIX . "_module_banners + WHERE id = '" . (int)$id . "' + "); + $row = $sql->FetchRow(); + + @unlink(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $row->banner_file); + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_banners + WHERE id = '" . (int)$id . "' + "); + + reportLog($_SESSION['user_name'] . ' - удалил баннер (' . $row->banner_name . ')', 2, 2); + + header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=1&cp=' . SESSION); + exit; + } + + function quickSave($id) { + global $AVE_DB, $config_vars; + + if(!empty($_POST['del'])) { + $sql = $AVE_DB->Query(" + SELECT banner_file + FROM " . PREFIX . "_module_banners + WHERE id = '" . (int)$id . "' + "); + $row = $sql->FetchRow(); + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_banners + SET banner_file = '' + WHERE id = '" . (int)$id . "' + "); + + @unlink(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $row->banner_file); + } + + if(!empty($_POST['banner_name'])) { + $d_name = strtolower($_FILES['New']['name']); + $d_name = str_replace(' ','', $d_name); + $d_tmp = $_FILES['New']['tmp_name']; + + if(!empty($_FILES['New']['type'])) { + if(in_array($_FILES['New']['type'], $this->_allowed_files)) { + $d_name = preg_replace('/[^ ._a-z0-9-]/', '_', $d_name); + if(file_exists(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) $d_name = $this->_getRandomPrefix() . '__' . $d_name; + + if(@move_uploaded_file($d_tmp, BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) { + @chmod(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name, 0777); + echo ""; + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_banners + SET banner_file = '" . addslashes($d_name) . "' + WHERE id = '" . (int)$id . "' + "); + + reportLog($_SESSION['user_name'] . ' - заменил изображение баннера на (' . $d_name . ')', 2, 2); + + } else { + echo ""; + } + + } else { + echo ""; + } + } + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_banners + SET + banner_name = '" . addslashes($_REQUEST['banner_name']) . "', + banner_url = '" . addslashes($_REQUEST['banner_url']) . "', + weight = '" . (int)$_REQUEST['weight'] . "', + views = '" . (int)$_REQUEST['views'] . "', + clicks = '" . (int)$_REQUEST['clicks'] . "', + image_alt = '" . addslashes($_REQUEST['image_alt']) . "', + category_id = '" . (int)$_REQUEST['category_id'] . "', + max_clicks = '" . (int)$_REQUEST['max_clicks'] . "', + max_views = '" . (int)$_REQUEST['max_views'] . "', + start_hour = '" . (int)$_REQUEST['start_hour'] . "', + end_hour = '" . (int)$_REQUEST['end_hour'] . "', + is_active = '" . (int)$_REQUEST['is_active'] . "', + target = '" . addslashes($_REQUEST['target']) . "', + width = '" . (int)$_REQUEST['width'] . "', + height = '" . (int)$_REQUEST['height'] . "' + WHERE + id = '" . (int)$id . "' + "); + reportLog($_SESSION['user_name'] . ' - изменил параметры баннера (' . stripslashes($_REQUEST['banner_name']) . ')', 2, 2); + } + + header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=1&cp=' . SESSION); + exit; + } + +function newBanner($tpl_dir) { + global $AVE_DB, $AVE_Template, $config_vars; + + // Определяем под-действие (создание или сохранение) + $sub = $_REQUEST['sub'] ?? ''; + + switch($sub) { + case '': + if(!@is_writeable(BASE_DIR . '/modules/' . BANNER_DIR . '/files/')) { + $AVE_Template->assign('folder_protected', 1); + } + + // Инициализируем пустой объект для Smarty, чтобы PHP 8.4 не ругался на отсутствие свойств + $item = new stdClass(); + $item->id = 0; + $item->banner_name = ''; + $item->category_id = 0; + $item->is_active = 1; + $item->target = '_blank'; + $item->banner_file = ''; + $item->banner_url = 'https://'; + $item->image_alt = ''; + $item->weight = 1; + $item->max_clicks = 0; + $item->max_views = 0; + $item->start_hour = 0; + $item->end_hour = 24; + $item->width = 0; + $item->height = 0; + + $AVE_Template->assign('item', $item); + $AVE_Template->assign('mod_path', BANNER_DIR); + $AVE_Template->assign('kategs', $this->_showCategories()); + $AVE_Template->assign('formaction', 'index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=newbanner&sub=save&cp=' . SESSION . '&pop=1'); + + // Рендерим шаблон формы + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'form.tpl')); + break; + + case 'save': + if(!empty($_POST['banner_name'])) { + $file = ''; + + // Проверяем, был ли загружен файл + if(!empty($_FILES['New']['name']) && $_FILES['New']['error'] == UPLOAD_ERR_OK) { + $d_name = strtolower($_FILES['New']['name']); + $d_name = str_replace(' ', '', $d_name); + $d_tmp = $_FILES['New']['tmp_name']; + + if(in_array($_FILES['New']['type'], $this->_allowed_files)) { + $d_name = preg_replace('/[^ ._a-z0-9-]/', '_', $d_name); + + if(file_exists(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) { + $d_name = $this->_getRandomPrefix() . '__' . $d_name; + } + + if(@move_uploaded_file($d_tmp, BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name)) { + @chmod(BASE_DIR . '/modules/' . BANNER_DIR . '/files/' . $d_name, 0777); + echo ""; + reportLog($_SESSION['user_name'] . ' - добавил изображение баннера (' . $d_name . ')', 2, 2); + $file = $d_name; + } else { + echo ""; + } + } else { + echo ""; + } + } + + // Выполняем запрос к БД с очисткой данных + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_module_banners + SET + category_id = '" . (int)($_REQUEST['category_id'] ?? 0) . "', + banner_file = '" . addslashes($file) . "', + banner_url = '" . addslashes($_REQUEST['banner_url'] ?? '') . "', + weight = '" . (int)($_REQUEST['weight'] ?? 1) . "', + banner_name = '" . addslashes($_REQUEST['banner_name'] ?? '') . "', + image_alt = '" . addslashes($_REQUEST['image_alt'] ?? '') . "', + max_clicks = '" . (int)($_REQUEST['max_clicks'] ?? 0) . "', + max_views = '" . (int)($_REQUEST['max_views'] ?? 0) . "', + start_hour = '" . (int)($_REQUEST['start_hour'] ?? 0) . "', + end_hour = '" . (int)($_REQUEST['end_hour'] ?? 24) . "', + is_active = '" . (int)($_REQUEST['is_active'] ?? 1) . "', + target = '" . addslashes($_REQUEST['target'] ?? '_blank') . "', + width = '" . (int)($_REQUEST['width'] ?? 0) . "', + height = '" . (int)($_REQUEST['height'] ?? 0) . "' + "); + + reportLog($_SESSION['user_name'] . ' - добавил новый баннер (' . stripslashes($_REQUEST['banner_name']) . ')', 2, 2); + } + + header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=1&cp=' . SESSION); + exit; + } + } + + function bannerCategories($tpl_dir) { + global $AVE_DB, $AVE_Template; + + switch($_REQUEST['sub']) { + case '' : + $items = array(); + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_banner_categories"); + while($row = $sql->FetchRow()) { + array_push($items, $row); + } + $AVE_Template->assign('items', $items); + $AVE_Template->assign('mod_path', BANNER_DIR); + $AVE_Template->assign('kategs', $this->_showCategories()); + $AVE_Template->assign('content', $AVE_Template->fetch($tpl_dir . 'kategs.tpl')); + break; + + case 'save' : + if (isset($_POST['category_name'])) { + foreach($_POST['category_name'] as $id => $kateg) { + if(!empty($kateg)) { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_banner_categories + SET category_name = '" . addslashes($kateg) . "' + WHERE id = '" . (int)$id . "' + "); + } + } + } + + if (isset($_POST['del'])) { + foreach($_POST['del'] as $id => $kateg) { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_banners + WHERE category_id = '" . (int)$id . "' + "); + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_banner_categories + WHERE id = '" . (int)$id . "' + "); + + reportLog($_SESSION['user_name'] . ' - удалил категорию баннеров (' . (int)$id . ')', 2, 2); + } + } + + header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=kategs&cp=' . SESSION); + break; + + case 'new' : + if(!empty($_REQUEST['category_name'])) { + $sql = $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_module_banner_categories + SET category_name = '" . addslashes($_REQUEST['category_name']) . "' + "); + + reportLog($_SESSION['user_name'] . ' - добавил новую категорию (' . stripslashes($_REQUEST['category_name']) . ')', 2, 2); + } + + header('Location:index.php?do=modules&action=modedit&mod=' . BANNER_DIR . '&moduleaction=kategs&cp=' . SESSION); + break; + } + } + +/** + * ВНУТРЕННИЕ МЕТОДЫ + */ + + function _getRandomPrefix() { + return rand(1000, 99999); + } + + function _showCategories() { + global $AVE_DB; + + $categories = array(); + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_banner_categories"); + while($row = $sql->FetchRow()) { + array_push($categories, $row); + } + + return $categories; + } +} +?> \ No newline at end of file diff --git a/files/media2_ave.jpg b/files/media_ave.jpg similarity index 100% rename from files/media2_ave.jpg rename to files/media_ave.jpg diff --git a/files/media_gitget.jpg b/files/media_gitget.jpg index 9e826ff..1f17f6d 100644 Binary files a/files/media_gitget.jpg and b/files/media_gitget.jpg differ diff --git a/info.php b/info.php index 7b2d5cf..8e85e76 100644 --- a/info.php +++ b/info.php @@ -4,7 +4,7 @@ $module = array( 'ModuleSysName' => 'media', - 'ModuleVersion' => '2.26.0', + 'ModuleVersion' => '3.31.0', 'ModuleAutor' => 'AVE.cms Team', 'ModuleCopyright' => '© 2007-' . date('Y') . ' AVE.cms', 'ModuleStatus' => 1, diff --git a/lang/ru.txt b/lang/ru.txt index caa4c87..d8809ba 100644 --- a/lang/ru.txt +++ b/lang/ru.txt @@ -1,6 +1,6 @@ [name] MODULE_NAME = "Баннер" -MODULE_DESCRIPTION = "Данный модуль позволяет организовать удобное управление показами рекламных баннеров на вашем сайте. Для того, чтобы отобразить рекламный баннер, разместите системный тег [mod_banner:XXX] в нужном месте вашего шаблона сайта или содержимом документа.
Допустимые форматы рекламных баннеров: jpg, jpeg, png, gif, swf" +MODULE_DESCRIPTION = "Данный модуль позволяет организовать удобное управление показами рекламных баннеров на вашем сайте. Для того, чтобы отобразить рекламный баннер, разместите системный тег [mod_banner:XXX] в нужном месте вашего шаблона сайта или содержимом документа.
Допустимые форматы рекламных баннеров: jpg, jpeg, png, gif, webp" [module] BANNER_MODULE_NAME = "Управление модулем баннер" @@ -34,8 +34,8 @@ BANNER_ENTER_NAME = "Пожалуйста, укажите название BANNER_PLEASE_NAME = "Пожалуйста, укажите название баннера" BANNER_NEW_CREATE = "Добавление нового баннера" BANNER_EDIT = "Редактирование баннера" -BANNER_EDIT_INFO = "В данном разделе вы можете отредактировать параметры баннера, а также сменить текущее изображение на новое.
Допустимые форматы файлов: jpg, jpeg, png, gif, swf" -BANNER_NEW_INFO = "В данном разделе вы можете добавить новый баннер, установить количество и время показов баннера.
Допустимые форматы файлов: jpg, jpeg, png, gif, swf" +BANNER_EDIT_INFO = "В данном разделе вы можете отредактировать параметры баннера, а также сменить текущее изображение на новое.
Допустимые форматы файлов: jpg, jpeg, png, gif, webp" +BANNER_NEW_INFO = "В данном разделе вы можете добавить новый баннер, установить количество и время показов баннера.
Допустимые форматы файлов: jpg, jpeg, png, gif, webp" BANNER_STATUS = "Активировать баннер?" BANNER_NAME_FORM = "Название баннера:" BANNER_CATEGORY_FORM = "Относится к категории:" @@ -70,10 +70,11 @@ BANNER_WRONG_TYPE = "Баннер не загружен. Данный тип BANNER_TARGET_TYPE = "Открывать в:" BANNER_OPEN_IN_NEW = "В новом окне" BANNER_OPEN_IN_THIS = "В текущем окне" -BANNER_WIDTH_SWF = "Ширина:" -BANNER_HEIGHT_SWF = "Высота:" -BANNER_FOR_SWF = "(для swf баннера)" +BANNER_WIDTH = "Ширина изображения баннера:" +BANNER_HEIGHT = "Высота изображения баннера:" +BANNER_FOR_SWF = "(0 - оставить как есть)" BANNER_MOD_ALLOWS = "Модуль позволяет:" BANNER_MOD_ALLOWS_A = "Организовать удобное управление показами рекламных баннеров на вашем сайте." BANNER_MOD_ALLOWS_B = "Для того, чтобы отобразить рекламный баннер, разместите системный тег [mod_banner:XXX] в нужном месте вашего шаблона сайта или содержимом документа. Идентификаторы тегов указаны в разделе - Управление категориями." -BANNER_MOD_ALLOWS_C = "Допустимые форматы рекламных баннеров: jpg, jpeg, png, gif, swf." +BANNER_MOD_ALLOWS_C = "Допустимые форматы рекламных баннеров: jpg, jpeg, png, gif, webp." +BANNER_SET_COPY = "Скопировать в буфер обмена" diff --git a/module.php b/module.php index 48d8751..242ca35 100644 --- a/module.php +++ b/module.php @@ -12,8 +12,6 @@ if(!defined('BASE_DIR')) exit; if(!defined('BANNER_DIR')) define('BANNER_DIR', 'media'); -echo BANNER_DIR; - /** * Обработка тэга модуля * @@ -22,7 +20,7 @@ echo BANNER_DIR; function mod_banner($banner_id) { require_once(BASE_DIR . '/modules/' . BANNER_DIR . '/class/banner.php'); - $banner = new ModulBanner; + $banner = new ModuleBanner; $banner->displayBanner(stripslashes($banner_id)); } @@ -31,7 +29,7 @@ if (isset($_REQUEST['module']) && $_REQUEST['module'] == BANNER_DIR) if (is_numeric($_REQUEST['id'])) { require_once(BASE_DIR . '/modules/' . BANNER_DIR . '/class/banner.php'); - $banner = new ModulBanner; + $banner = new ModuleBanner; $banner->fetch_addclick($_REQUEST['id']); } } @@ -46,7 +44,7 @@ if (defined('ACP') && !empty($_REQUEST['moduleaction'])) $lang_file = BASE_DIR . '/modules/' . BANNER_DIR . '/lang/' . $_SESSION['user_language'] . '.txt'; $AVE_Template->config_load($lang_file, 'module'); - $banner = new ModulBanner; + $banner = new ModuleBanner; $AVE_Template->config_load($lang_file, 'module'); $config_vars = $AVE_Template->get_config_vars(); @@ -55,7 +53,7 @@ if (defined('ACP') && !empty($_REQUEST['moduleaction'])) switch($_REQUEST['moduleaction']) { case '1': - $banner->showBanner($tpl_dir); + $banner->showBanners($tpl_dir); break; case 'quicksave': @@ -63,7 +61,7 @@ if (defined('ACP') && !empty($_REQUEST['moduleaction'])) break; case 'kategs': - $banner->bannerKategs($tpl_dir); + $banner->bannerCategories($tpl_dir); break; case 'editbanner': diff --git a/sql.php b/sql.php index 8388ab8..41b5361 100644 --- a/sql.php +++ b/sql.php @@ -1,57 +1,62 @@ \ No newline at end of file diff --git a/templates/banner_viewer.tpl b/templates/banner_viewer.tpl new file mode 100644 index 0000000..8d5d54f --- /dev/null +++ b/templates/banner_viewer.tpl @@ -0,0 +1,13 @@ +
+ + {$banner.banner_name|escape}: {$banner.image_alt|escape} 0}width="{$banner.width}"{/if} + {if $banner.height > 0}height="{$banner.height}"{/if} + loading="lazy"> + +
\ No newline at end of file diff --git a/templates/banners.tpl b/templates/banners.tpl index b9e9cc9..79e76e2 100644 --- a/templates/banners.tpl +++ b/templates/banners.tpl @@ -21,13 +21,28 @@
-
-
{#BANNER_SHOW_ALL#} |  - {#BANNER_NEW_LINK#} |  - {#BANNER_CATEG_LINK#}
-
+ + + +
+ + + + + + @@ -39,7 +54,8 @@ {foreach from=$items item=item} - {if ($item->Aktiv != 1) || ($item->Bannertags=='') || ($item->Klicks >= $item->MaxKlicks && $item->MaxKlicks != 0) || ($item->Views >= $item->MaxViews && $item->MaxViews != 0)} + {* Логика активности: Aktiv->is_active, Bannertags->banner_file, Klicks->clicks, Views->views *} + {if ($item->is_active != 1) || ($item->banner_file=='') || ($item->clicks >= $item->max_clicks && $item->max_clicks != 0) || ($item->views >= $item->max_views && $item->max_views != 0)} {assign var=active value=0} {else} {assign var=active value=1} @@ -52,21 +68,26 @@   {/if} - - + {* Id -> id, Bannername -> banner_name *} + + {* Bannertags -> banner_file *} + - - - + {* ZStart/ZEnde -> start_hour/end_hour *} + + {* Klicks/Views -> clicks/views *} + + {/foreach} diff --git a/templates/form.tpl b/templates/form.tpl index 7026232..2e93180 100644 --- a/templates/form.tpl +++ b/templates/form.tpl @@ -1,21 +1,24 @@ +
{if $smarty.request.moduleaction!='newbanner'}{#BANNER_EDIT#}{else}{#BANNER_NEW_CREATE#}{/if}
+
-{if $smarty.request.moduleaction!='newbanner'}{#BANNER_EDIT_INFO#}{else}{#BANNER_NEW_INFO#}{/if} + {if $smarty.request.moduleaction!='newbanner'}{#BANNER_EDIT_INFO#}{else}{#BANNER_NEW_INFO#}{/if}
-
+ + {if $folder_protected==1 && $smarty.request.moduleaction=='newbanner'}
{#BANNER_NOT_WRITABLE#} {else} @@ -27,54 +30,48 @@ function check_name() {ldelim} - + - + - + + {if $smarty.request.moduleaction != 'newbanner'} {/if} + - {if $item->Bannertags!='' && $smarty.request.moduleaction!='newbanner'} + {if $item->banner_file!='' && $smarty.request.moduleaction!='newbanner'} @@ -93,15 +90,15 @@ function check_name() {ldelim} {/if} - + @@ -109,29 +106,29 @@ function check_name() {ldelim} {if $smarty.request.moduleaction!='newbanner'} - + {/if} - + {if $smarty.request.moduleaction!='newbanner'} - + {/if} - + - - + + - - + +
 
  {#BANNER_NAME_TABLE#} {#BANNER_ACTIONS#}
{$item->Bannername}{$item->Bannertags}{$item->banner_name}{$item->banner_file} {foreach from=$kategs item=k} - {if $k->Id==$item->KatId}{$k->KatName}{/if} + {* Id -> id, KatId -> category_id, KatName -> category_name *} + {if $k->id==$item->category_id}{$k->category_name}{/if} {/foreach} {if $item->ZStart<10}0{/if}{$item->ZStart}:00 - {if $item->ZEnde<10}0{/if}{$item->ZEnde}:00{$item->Klicks} / {if $item->MaxKlicks==0}~{else}{$item->MaxKlicks}{/if}{$item->Views} / {if $item->MaxViews==0}~{else}{$item->MaxViews}{/if}{if $item->start_hour<10}0{/if}{$item->start_hour}:00 - {if $item->end_hour<10}0{/if}{$item->end_hour}:00{$item->clicks} / {if $item->max_clicks==0}~{else}{$item->max_clicks}{/if}{$item->views} / {if $item->max_views==0}~{else}{$item->max_views}{/if} -  +  -  + 
{#BANNER_STATUS#}Aktiv==1}checked{/if} />is_active==1}checked{/if} />
{#BANNER_NAME_FORM#}
{#BANNER_CATEGORY_FORM#} - {foreach from=$kategs item=k} - + {/foreach}
{#BANNER_TARGET_URL#}
{#BANNER_TARGET_TYPE#} - + +
{#BANNER_OLD_IMAGE#} - {if $item->Bannertags==''}-{else} - {if $item->swf == false} - - {else} - - - - - - - {/if} + {if $item->banner_file==''}-{else} + {* Убрали проверку на SWF, выводим только картинку *} + {/if}
{if $smarty.request.moduleaction != 'newbanner'} @@ -85,7 +82,7 @@ function check_name() {ldelim} {if $folder_protected==1 && $smarty.request.moduleaction!='newbanner'} {#BANNER_NOT_WRITABLE2#} {else} {/if}
{#BANNER_OLD_DELETE#}
{#BANNER_ALT_TEXT#}
{#BANNER_PRIOR#} - + + + {#BANNER_PRIOR_DESC#}
{#BANNER_VIEW_RESET#}
{#BANNER_VIEWS_MAX#}
{#BANNER_VIEWS_INFO#}
{#BANNER_UNLIMIT#} {#BANNER_UNLIMIT#}
{#BANNER_CLICK_RESET#}
{#BANNER_CLICKS#}
{#BANNER_CLICKS_INFO#}
{#BANNER_UNLIMIT#} {#BANNER_UNLIMIT#}
{#BANNER_HOUR_START#}
{#BANNER_START_INFO#}
- {section name=s loop=25 start=1} - + {/section} {#BANNER_START_INFO2#} @@ -140,21 +137,21 @@ function check_name() {ldelim}
{#BANNER_HOUR_END#}
{#BANNER_END_INFO#}
- {section name=e loop=25 start=1} - + {/section} {#BANNER_END_INFO2#}
{#BANNER_WIDTH_SWF#}
{#BANNER_FOR_SWF#}
{#BANNER_WIDTH#}
{#BANNER_FOR_SWF#}
(px)
{#BANNER_HEIGHT_SWF#}
{#BANNER_FOR_SWF#}
{#BANNER_HEIGHT#}
{#BANNER_FOR_SWF#}
(px)

{if $smarty.request.moduleaction == 'newbanner'} diff --git a/templates/kategs.tpl b/templates/kategs.tpl index 3638ba6..01c2b52 100644 --- a/templates/kategs.tpl +++ b/templates/kategs.tpl @@ -1,16 +1,20 @@ +
{#BANNER_MODULE_NAME#}
+
{#BANNER_MOD_ALLOWS#} @@ -21,25 +25,41 @@ function check_name() {ldelim}
+ +
-
-
{#BANNER_SHOW_ALL#} |  - {#BANNER_NEW_LINK#} |  - {#BANNER_CATEG_LINK#}
-
+ + +
+
+ + + + + @@ -48,33 +68,44 @@ function check_name() {ldelim} {foreach from=$items item=item} {/foreach}
 
  {#BANNER_CATEGORY_TAG#}
- + {* Id -> id *} + - +
+ + + +
- + {* KatName -> category_name *} +

+
{#BANNER_CATEGORY_NEW#}
+
- +
- - -
{#BANNER_CATEGORY#}
-   - +
+ + {#BANNER_CATEGORY#} + + + + +