From c116d722c1d07d787ac0de0ce35a10ac79caeab3 Mon Sep 17 00:00:00 2001 From: SVarlamov Date: Sat, 11 Jun 2016 12:56:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D0=90=D1=80?= =?UTF-8?q?=D1=85=D0=B8=D0=B2=20=D0=BD=D0=BE=D0=B2=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++ admin/admin_archive_edit.tpl | 93 +++++++++++++ admin/admin_archive_list.tpl | 106 +++++++++++++++ admin/index.php | 8 ++ class.newsarchive.php | 253 +++++++++++++++++++++++++++++++++++ index.php | 8 ++ lang/index.php | 8 ++ lang/ru.txt | 35 +++++ module.php | 208 ++++++++++++++++++++++++++++ sql.php | 42 ++++++ templates/archive_result.tpl | 48 +++++++ templates/index.php | 8 ++ templates/public_archive.tpl | 18 +++ 13 files changed, 850 insertions(+) create mode 100644 README.md create mode 100644 admin/admin_archive_edit.tpl create mode 100644 admin/admin_archive_list.tpl create mode 100644 admin/index.php create mode 100644 class.newsarchive.php create mode 100644 index.php create mode 100644 lang/index.php create mode 100644 lang/ru.txt create mode 100644 module.php create mode 100644 sql.php create mode 100644 templates/archive_result.tpl create mode 100644 templates/index.php create mode 100644 templates/public_archive.tpl diff --git a/README.md b/README.md new file mode 100644 index 0000000..d5eb7a2 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +## newsarchive + +# Модуль Архив новостей v1.3 + + +## Данный модуль предзназначен для организации архива документов по выбранным рубрикам в системе. + + * Параметры модуля позволяют определить возможность показа пустых месяцев и ежедневное меню навигации. + + +## Перед копированием модуля в папку modules, удалите файл README.md, копируйте только корневую папку newsarchive со всем ее содержимым внутри! + +## Changelog: + +02.05.2014 - версия 1.3 \ No newline at end of file diff --git a/admin/admin_archive_edit.tpl b/admin/admin_archive_edit.tpl new file mode 100644 index 0000000..e6b067b --- /dev/null +++ b/admin/admin_archive_edit.tpl @@ -0,0 +1,93 @@ + + + +
{#ARCHIVE_EDIT#}
+ +
+
+ {#ARCHIVE_EDIT_TIP#} +
+
+ + + + +
+
+
{#ARCHIVE_EDIT#}
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{#ARCHIVE_PARAMS#}{#ARCHIVE_DATAS#}
{#ARCHIVE_ITEM_NAME#}
{#ARCHIVE_RUBS_SELECT#} + +
{#ARCHIVE_SHOW_DAYS#} + newsarchive_show_days == 1}checked="checked"{/if}> + newsarchive_show_days == 0}checked="checked"{/if}> +
{#ARCHIVE_SHOW_EMPTY#} + newsarchive_show_empty == 1}checked="checked"{/if}> + newsarchive_show_empty == 0}checked="checked"{/if}> +
+
+
\ No newline at end of file diff --git a/admin/admin_archive_list.tpl b/admin/admin_archive_list.tpl new file mode 100644 index 0000000..760c85c --- /dev/null +++ b/admin/admin_archive_list.tpl @@ -0,0 +1,106 @@ + + + +
{#ARCHIVE_LIST#}
+ +
+
+ {#ARCHIVE_LIST_TIP#} +
+
+ + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + {if $archives} + {foreach from=$archives item=archive} + + + + + + + + + {/foreach} + {else} + + + + {/if} +
Id{#ARCHIVE_NAME#}{#ARCHIVE_USE_RUBRIKS#}{#ARCHIVE_TAG#}{#ARCHIVE_ACTIONS#}
{$archive->id}{$archive->newsarchive_name|escape:html|stripslashes}{if !$archive->rubric_title}{#ARCHIVE_NO_RUBRIKS#}{else}{$archive->rubric_title}{/if}
+ + + +
+
    +
  • {#ARCHIVE_NO_ITEMS#}
  • +
+
+
+ + + +
+
+
\ No newline at end of file diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..9c20174 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/class.newsarchive.php b/class.newsarchive.php new file mode 100644 index 0000000..aeb7278 --- /dev/null +++ b/class.newsarchive.php @@ -0,0 +1,253 @@ +Query("SELECT * FROM " . PREFIX . "_module_newsarchive"); + while ($row = $sql->FetchRow()) + { + array_push($archives, $row); + } + + $cnt = count($archives); + for ($i=0; $i< $cnt; $i++) + { + $ids[] = explode(',', $archives[$i]->newsarchive_rubrics); + } + + $sql = $AVE_DB->Query(" + SELECT + Id, + rubric_title + FROM " . PREFIX . "_rubrics + "); + while ($row = $sql->FetchRow()) + { + for ($i=0; $i< $cnt; $i++) + { + if (in_array($row->Id, $ids[$i])) + { + @$archives[$i]->rubric_title = strstr($archives[$i]->rubric_title . ', ' . $row->rubric_title, ' '); + } + } + } + + $AVE_Template->assign('archives', $archives); + $AVE_Template->assign('content', $AVE_Template->fetch($adm_tpl_dir . 'admin_archive_list.tpl')); + } + + /** + * Метод, отвечающий за схранение изменений в списке всех архивов в Панели управления + * + */ + function newsarchiveListSave() + { + global $AVE_DB; + + foreach ((array)$_POST['newsarchive_name'] as $id => $newsarchive_name) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_newsarchive + SET newsarchive_name = '" . $newsarchive_name . "' + WHERE id = '" . (int)$id . "' + "); + } + + header('Location:index.php?do=modules&action=modedit&mod=newsarchive&moduleaction=1&cp=' . SESSION); + exit; + } + + /** + * Метод, отвечающий за вывод списка месяцев в публичной части сайта (Основная функция вывода) + * + * @param string $tpl_dir - путь к папке с шаблонами + * @param int $id - идентификатор архива новостей + */ + function newsarchiveShow($tpl_dir, $id) + { + global $AVE_DB, $AVE_Template; + + $months = array('','Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'); + $mid = array('','01','02','03','04','05','06','07','08','09','10','11','12'); + $dd = array(); + $doctime = get_settings('use_doctime') + ? ("AND document_published <= " . time() . " AND (document_expire = 0 OR document_expire >= " . time() . ")") : ''; + + $row = $AVE_DB->Query(" + SELECT + newsarchive_rubrics, + newsarchive_show_empty + FROM " . PREFIX . "_module_newsarchive + WHERE id = '" . $id . "' + ")->FetchRow(); + + $query = $AVE_DB->Query(" + SELECT + MONTH(FROM_UNIXTIME(document_published)) AS `month`, + YEAR(FROM_UNIXTIME(document_published)) AS `year`, + COUNT(*) AS nums + FROM " . PREFIX . "_documents + WHERE rubric_id IN (" . $row->newsarchive_rubrics . ") + AND Id != '1' + AND Id != '" . PAGE_NOT_FOUND_ID . "' + AND document_deleted = '0' + AND document_status = '1' + AND document_published > UNIX_TIMESTAMP(DATE_FORMAT((CURDATE() - INTERVAL 15 YEAR),'%Y-%m-01')) + " . $doctime . " + GROUP BY `year`,`month` + ORDER BY `year` DESC,`month` DESC + "); + + while ($res = $query->FetchRow()) + { + $res->mid = $mid[$res->month]; + $res->month = $months[$res->month]; + array_push($dd, $res); + } + + $AVE_Template->assign('archiveid', $id); + $AVE_Template->assign('newsarchive_show_empty', $row->newsarchive_show_empty); + $AVE_Template->assign('months', $dd); + + if (file_exists($tpl_dir . 'public_archive-'. $id .'.tpl')) { + $AVE_Template->display($tpl_dir . 'public_archive-'. $id .'.tpl'); + } else { + $AVE_Template->display($tpl_dir . 'public_archive.tpl'); + } + + } + + /** + * Метод, отвечающий за добавление нового архива в Панели управления + * + */ + function newsarchiveNew() + { + global $AVE_DB; + + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_module_newsarchive + SET + id = '', + newsarchive_name = '" . $_POST['newsarchive_name_new'] . "', + newsarchive_rubrics = '', + newsarchive_show_days = '1', + newsarchive_show_empty = '' + "); + + header('Location:index.php?do=modules&action=modedit&mod=newsarchive&moduleaction=edit&cp=' . SESSION . '&id=' . $AVE_DB->InsertId()); + exit; + } + + /** + * Метод, отвечающий за вывод данных для редактирования выбранного архива + * + * @param string $tpl_dir - путь к папке с шаблонами + */ + function newsarchiveEdit($tpl_dir, $adm_tpl_dir) + { + global $AVE_DB, $AVE_Template; + + $id = intval($_GET['id']); + $archives = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_module_newsarchive + WHERE id = '" . $id . "' + ")->FetchRow(); + + $ids = @explode(',', $archives->newsarchive_rubrics); + + $sql = $AVE_DB->Query(" + SELECT + Id, + rubric_title + FROM " . PREFIX . "_rubrics + "); + $newsarchive_rubrics = array(); + while ($row = $sql->FetchRow()) + { + if (in_array($row->Id, $ids)) + { + $row->sel = 1; + array_push($newsarchive_rubrics, $row); + } + else + { + $row->sel = 0; + array_push($newsarchive_rubrics, $row); + } + } + + $AVE_Template->assign('archives', $archives); + $AVE_Template->assign('newsarchive_rubrics', $newsarchive_rubrics); + $AVE_Template->assign('content', $AVE_Template->fetch($adm_tpl_dir . 'admin_archive_edit.tpl')); + } + + /** + * Метод, отвечающий за сохранение изменений для редактируемого архива + * + */ + function newsarchiveSave() + { + global $AVE_DB; + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module_newsarchive + SET + newsarchive_name = '" . $_POST['newsarchive_name'] . "', + newsarchive_rubrics = '" . implode(',', (array)$_POST['newsarchive_rubrics']) . "', + newsarchive_show_days = '" . $_POST['newsarchive_show_days'] . "', + newsarchive_show_empty = '" . $_POST['newsarchive_show_empty'] . "' + WHERE + id = '" . intval($_POST['id']) . "' + "); + + header('Location:index.php?do=modules&action=modedit&mod=newsarchive&moduleaction=1&cp=' . SESSION); + exit; + } + + /** + * Метод, отвечающий за удаление выбранного архива из Панели управления + * + */ + function newsarchiveDelete() + { + global $AVE_DB; + + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module_newsarchive + WHERE id = '" . intval($_GET['id']) . "' + "); + + header('Location:index.php?do=modules&action=modedit&mod=newsarchive&moduleaction=1&cp=' . SESSION); + exit; + } +} + +?> \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..9c20174 --- /dev/null +++ b/index.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/lang/index.php b/lang/index.php new file mode 100644 index 0000000..9c20174 --- /dev/null +++ b/lang/index.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/lang/ru.txt b/lang/ru.txt new file mode 100644 index 0000000..14b3c5f --- /dev/null +++ b/lang/ru.txt @@ -0,0 +1,35 @@ +ARCHIVE_EDIT = "Редактирование архива" +ARCHIVE_EDIT_TIP = "В данном разделе вы можете установить необходимые параметры для архива. Параметр "Показывать пустые месяцы" определяет будут ли показаны в Публичной части сайта те месяцы, в которых отсутствуют документы. Параметр "Показывать дни" определяет будет ли показан список дней для выбранного месяца. Параметр "Рубрики для сбора данных" определяет те рубрики, из которых будет формироваться данный архив документов. Для выбора нескольких рубрик зажмите клавишу CTRL." +ARCHIVE_ENTER_NAME = "Пожалуйста, укажите название архива" +ARCHIVE_ITEM_NAME = "Название архива:" +ARCHIVE_RUBS_SELECT = "Рубрики для сбора данных:" +ARCHIVE_SHOW_DAYS = "Показывать дни?" +ARCHIVE_SHOW_EMPTY = "Показывать пустые месяцы?" +ARCHIVE_BUTTON_SAVE = "Сохранить изменения" +ARCHIVE_BUTTON_ADD = "Добавить архив" +ARCHIVE_YES = "Да" +ARCHIVE_NO = "Нет" +ARCHIVE_LIST = "Архив документов" +ARCHIVE_LIST_TIP = "В данном разделе приведен список всех архивов в системе." +ARCHIVE_NAME = "Название архива" +ARCHIVE_TAG = "Системный тег" +ARCHIVE_USE_RUBRIKS = "Включает рубрики" +ARCHIVE_ACTIONS = "Действия" +ARCHIVE_NO_RUBRIKS = "Рубрики не выбраны" +ARCHIVE_EDIT_HINT = "Редактировать данный архив" +ARCHIVE_DELETE_HINT = "Удалить данный архив" +ARCHIVE_NO_ITEMS = "В настоящий момент архивов нет" +ARCHIVE_ADD = "Добавить новый архив" +ARCHIVE_FROM = "Архив за" +ARCHIVE_YEAR = "года" +ARCHIVE_DAYS = "Календарные дни:" +ARCHIVE_NOT_FOUND = "Документов не найдено" +ARCHIVE_TITLE = "Архив документов" +ARCHIVE_DOC_NAME = "Название документа" +ARCHIVE_PUBLIC_DATE = "Дата публикации" +ARCHIVE_IN_RUBRIC = "В рубрике" +ARCHIVE_ALL_DAY = "Все" +ARCHIVE_RETURN = "Вернуться к списку всех архивов" +ARCHIVE_LISTS = "Список всех архивов" +ARCHIVE_PARAMS = "Параметр" +ARCHIVE_DATAS = "Значение" \ No newline at end of file diff --git a/module.php b/module.php new file mode 100644 index 0000000..f4d164c --- /dev/null +++ b/module.php @@ -0,0 +1,208 @@ +"; +} + +/** + * Обработка тега модуля + * + * @param int $newsarchive_id - идентификатор архива + */ +function mod_newsarchive($newsarchive_id) +{ + global $AVE_Template; + + $newsarchive_id = preg_replace('/\D/', '', $newsarchive_id); + + if (is_numeric($newsarchive_id) && $newsarchive_id > 0) + { + require_once(BASE_DIR . '/modules/newsarchive/class.newsarchive.php'); + $Newsarchive = new Newsarchive; + + $tpl_dir = BASE_DIR . '/modules/newsarchive/templates/'; + $lang_file = BASE_DIR . '/modules/newsarchive/lang/' . $_SESSION['user_language'] . '.txt'; + + $AVE_Template->config_load($lang_file, 'admin'); + + $Newsarchive->newsarchiveShow($tpl_dir, $newsarchive_id); + } +} + +/** + * Выборка докуметов из БД на основании Месяца, Года и Дня + * День необязательный параметр + * + * @param int $newsarchive_id идентификатор архива + * @param int $month месяц + * @param int $year год + * @param int $day день + */ +function show_by($newsarchive_id, $month, $year, $day = 0) +{ + global $AVE_DB, $AVE_Template; + + if(defined('MODULE_CONTENT')) return; + + $assign = array(); + + $tpl_dir = BASE_DIR . '/modules/newsarchive/templates/'; + $adm_tpl_dir = BASE_DIR . '/modules/newsarchive/admin/'; + $lang_file = BASE_DIR . '/modules/newsarchive/lang/' . $_SESSION['user_language'] . '.txt'; + $AVE_Template->config_load($lang_file, 'admin'); + + // Определяем, пришел ли в запросе номер дня + $db_day = (is_numeric($day) && $day != 0) ? "AND DAYOFMONTH(FROM_UNIXTIME(a.document_published)) = '" . $day . "'" : ''; + + // Выбираем все параметры для запроса с текущим ID + $newsarchive = $AVE_DB->Query(" + SELECT * + FROM ".PREFIX."_module_newsarchive + WHERE id = '" . (int)$newsarchive_id . "' + ")->FetchRow(); + + // Формирование условий сортировки выводимых документов + $db_sort = 'ORDER BY a.document_published ASC'; + if(isset($_REQUEST['sort'])) + { + switch($_REQUEST['sort']) + { + case 'title': $db_sort = 'ORDER BY a.document_title ASC'; break; + case 'title_desc': $db_sort = 'ORDER BY a.document_title DESC'; break; + case 'date': $db_sort = 'ORDER BY a.document_published ASC'; break; + case 'date_desc': $db_sort = 'ORDER BY a.document_published DESC'; break; + case 'rubric': $db_sort = 'ORDER BY b.rubric_title ASC'; break; + case 'rubric_desc': $db_sort = 'ORDER BY b.rubric_title DESC'; break; + default: $db_sort = 'ORDER BY a.document_published ASC'; break; + } + } + + $doctime = get_settings('use_doctime') + ? ("AND document_published <= " . time() . " AND (document_expire = 0 OR document_expire >= " . time() . ")") : ''; + + // Выбираем из БД документы. которые соответствуют условиям для запроса и модуля + $query = $AVE_DB->Query(" + SELECT + a.Id, + a.rubric_id, + a.document_title, + a.document_alias, + a.document_published, + b.rubric_title + FROM + " . PREFIX . "_documents as a, + " . PREFIX . "_rubrics as b + WHERE rubric_id IN (" . $newsarchive->newsarchive_rubrics . ") + AND MONTH(FROM_UNIXTIME(a.document_published)) = '" . (int)$month . "' + AND YEAR(FROM_UNIXTIME(a.document_published))= '" . (int)$year . "' + " . $db_day . " + AND a.rubric_id = b.Id + AND a.Id != '". PAGE_NOT_FOUND_ID . "' + AND document_deleted != '1' + AND document_status != '0' + " . $doctime . " + " . $db_sort . " + "); + + // Заполняем массив докуметов результатами из БД + $documents = array(); + while($doc = $query->FetchRow()) + { + $doc->document_alias = rewrite_link('index.php?id=' . $doc->Id . '&doc=' . (empty($doc->document_alias) ? prepare_url($doc->document_title) : $doc->document_alias)); + array_push($documents, $doc); + } + + // Формируем меню навигации по дням + $day_in_month = date('t', mktime(0, 0, 0, (int)$month, 1, (int)$year)); + $m_arr = array(null, 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'); + + $assign['newsarchive'] = $newsarchive; + $assign['documents'] = $documents; + $assign['days'] = range(1, $day_in_month); + $assign['month_name'] = $m_arr[(int)$month]; + $assign['year'] = (int)$year; + $assign['month'] = (int)$month; + $assign['day'] = (int)$day; + + $AVE_Template->assign($assign); + + define('MODULE_TITLE', $AVE_Template->get_config_vars('ARCHIVE_FROM') . ' ' . $m_arr[(int)$month] . ', ' . (int)$year . ' ' . $AVE_Template->get_config_vars('ARCHIVE_YEAR')); + if (file_exists($tpl_dir . 'archive_result-'. (int)$newsarchive_id .'.tpl')) { + define('MODULE_CONTENT', $AVE_Template->fetch($tpl_dir . 'archive_result-'. (int)$newsarchive_id .'.tpl')); + }else{ + define('MODULE_CONTENT', $AVE_Template->fetch($tpl_dir . 'archive_result.tpl')); + } +} + +// Включаем проверку входных данных и показываем результаты в зависимости от запроса +if (isset($_GET['module']) && $_GET['module'] == 'newsarchive' && !empty($_GET['month']) && !empty($_GET['year'])) +{ + show_by($_GET['id'], $_GET['month'], $_GET['year'], isset($_GET['day']) ? $_GET['day'] : 0); +} + +// Кусок кода, отвечающий за управление модулем в админке +if (defined('ACP') && !empty($_REQUEST['moduleaction'])) +{ + require_once(BASE_DIR . '/modules/newsarchive/class.newsarchive.php'); + $Newsarchive = new Newsarchive; + + $tpl_dir = BASE_DIR . '/modules/newsarchive/templates/'; + $adm_tpl_dir = BASE_DIR . '/modules/newsarchive/admin/'; + $lang_file = BASE_DIR . '/modules/newsarchive/lang/' . $_SESSION['admin_language'] . '.txt'; + $AVE_Template->config_load($lang_file); + + switch($_REQUEST['moduleaction']) + { + case '1': + $Newsarchive->newsarchiveList($tpl_dir, $adm_tpl_dir); + break; + + case 'add': + $Newsarchive->newsarchiveNew(); + break; + + case 'del': + $Newsarchive->newsarchiveDelete(); + break; + + case 'savelist': + $Newsarchive->newsarchiveListSave(); + break; + + case 'edit': + $Newsarchive->newsarchiveEdit($tpl_dir, $adm_tpl_dir); + break; + + case 'saveedit': + $Newsarchive->newsarchiveSave(); + break; + } +} + +?> \ No newline at end of file diff --git a/sql.php b/sql.php new file mode 100644 index 0000000..81464e6 --- /dev/null +++ b/sql.php @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/templates/archive_result.tpl b/templates/archive_result.tpl new file mode 100644 index 0000000..a945e6a --- /dev/null +++ b/templates/archive_result.tpl @@ -0,0 +1,48 @@ +

{#ARCHIVE_FROM#} {$month_name}, {$year} {#ARCHIVE_YEAR#}



+ +{if $newsarchive->newsarchive_show_days == 1} +
{#ARCHIVE_DAYS#}
+ + + + {if $day == 0} + + {else} + + {/if} + {foreach from=$days item=month_day} + {if $day == $month_day} + + {else} + + {/if} + {/foreach} + +
{#ARCHIVE_ALL_DAY#}{#ARCHIVE_ALL_DAY#}{$month_day|string_format:"%02d"}{$month_day|string_format:"%02d"}
+{/if} + +{if !$documents} + {#ARCHIVE_NOT_FOUND#} +{else} + + + {if $day == 0} + + + + {else} + + + + {/if} + + + {foreach from=$documents item=document} + + + + + + {/foreach} +
{#ARCHIVE_DOC_NAME#}{#ARCHIVE_PUBLIC_DATE#}{#ARCHIVE_IN_RUBRIC#}{#ARCHIVE_DOC_NAME#}{#ARCHIVE_PUBLIC_DATE#}{#ARCHIVE_IN_RUBRIC#}
{$document->document_title}{$document->document_published|date_format:$DATE_FORMAT|pretty_date}{$document->rubric_title}
+{/if} \ No newline at end of file diff --git a/templates/index.php b/templates/index.php new file mode 100644 index 0000000..9c20174 --- /dev/null +++ b/templates/index.php @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/templates/public_archive.tpl b/templates/public_archive.tpl new file mode 100644 index 0000000..c6a59b2 --- /dev/null +++ b/templates/public_archive.tpl @@ -0,0 +1,18 @@ + \ No newline at end of file