From 013ad7401c0f48a9e0820beb6fd1a28d317d9b1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=92=D0=B0=D1=80?= =?UTF-8?q?=D0=BB=D0=B0=D0=BC=D0=BE=D0=B2?= Date: Fri, 10 Jun 2016 23:33:29 +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=92=D0=BE?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=81/=D0=BE=D1=82=D0=B2=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++ class.faq.php | 267 +++++++++++++++++++++++++++++++++ index.php | 4 + lang/index.php | 4 + lang/ru.txt | 28 ++++ module.php | 115 ++++++++++++++ sql.php | 62 ++++++++ templates/admin_faq_edit.tpl | 71 +++++++++ templates/admin_faq_list.tpl | 124 +++++++++++++++ templates/admin_quest_edit.tpl | 96 ++++++++++++ templates/index.php | 4 + templates/show_faq.tpl | 24 +++ 12 files changed, 812 insertions(+) create mode 100644 README.md create mode 100644 class.faq.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/admin_faq_edit.tpl create mode 100644 templates/admin_faq_list.tpl create mode 100644 templates/admin_quest_edit.tpl create mode 100644 templates/index.php create mode 100644 templates/show_faq.tpl diff --git a/README.md b/README.md new file mode 100644 index 0000000..63d9986 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +## faq + +# Вопрос/ответ v1.0.1 + + +## Модуль создания раширенной справочной системы на основе тегов. + + +## Перед копированием модуля в папку modules, удалите файл README.md, копируйте только корневую папку faq со всем ее содержимым внутри! + +## Changelog: + +26.11.2015 - версия 1.0.1 \ No newline at end of file diff --git a/class.faq.php b/class.faq.php new file mode 100644 index 0000000..fcd889a --- /dev/null +++ b/class.faq.php @@ -0,0 +1,267 @@ +Query("SELECT * FROM ". PREFIX ."_module_faq"); + while ($row = $sql->FetchRow()) array_push($faq, $row); + + $AVE_Template->assign("faq_arr", $faq); + $AVE_Template->assign("content", $AVE_Template->fetch($tpl_dir . "admin_faq_list.tpl")); + } + + /** + * Создание новой рубрики + * + */ + public static function faqNew() + { + global $AVE_DB; + + if (isset($_POST['new_faq_title']) && trim($_POST['new_faq_title'])) + { + $AVE_DB->Query("INSERT INTO " . PREFIX . "_module_faq SET id = '', faq_title = '" . mb_substr($_POST['new_faq_title'], 0, 100) . "', faq_description = '" . mb_substr($_POST['new_faq_desc'], 0, 255) . "'"); + } + + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + /** + * Удаление рубрики вместе с вопросами и ответами + * + * @param string $tpl_dir путь к директории с шаблонами модуля + */ + public static function faqDelete($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (isset($_GET['fid']) && is_numeric($_GET['fid']) && $_GET['fid'] > 0) + { + $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_faq WHERE id = '" . $_GET['fid'] . "'"); + $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_faq_quest WHERE faq_id = '" . $_GET['fid'] . "'"); + + $AVE_Template->clear_cache($tpl_dir . 'show_faq.tpl', $_GET['fid']); + } + + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + /** + * Запись изменений в наименованиях и описаниях рубрик + * + * @param string $tpl_dir путь к директории с шаблонами модуля + */ + public static function faqListSave($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + foreach($_POST['faq_title'] as $id => $faq_title) + { + if (is_numeric($id) && $id > 0 && trim($faq_title)) + { + $AVE_DB->Query("UPDATE " . PREFIX . "_module_faq SET faq_title = '" . mb_substr($faq_title, 0, 100) . "', faq_description = '" . mb_substr($_POST['faq_description'][$id], 0, 255) . "' WHERE id = '" . $id . "'"); + + $AVE_Template->clear_cache($tpl_dir . 'show_faq.tpl', $id); + } + } + + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + /** + * Вывод списка вопросов и ответов определённой рубрики + * + * @param string $tpl_dir путь к директории с шаблонами модуля + */ + public static function faqQuestionList($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (!(isset($_GET['fid']) && is_numeric($_GET['fid']) && $_GET['fid'] > 0)) + { + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + $questions = array(); + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_faq_quest WHERE faq_id = '" . $_GET['fid'] . "'"); + while ($row = $sql->FetchRow()) array_push($questions, $row); + + $r_name = $AVE_DB->Query("SELECT * FROM ". PREFIX ."_module_faq WHERE id = '" . $_GET['fid'] . "'")->FetchRow(); + + $AVE_Template->assign("questions", $questions); + $AVE_Template->assign("RubricName", $r_name->faq_title); + $AVE_Template->assign("content", $AVE_Template->fetch($tpl_dir . "admin_faq_edit.tpl")); + } + + /** + * Вывод формы редактирования вопроса и ответа на него + * + * @param string $tpl_dir путь к директории с шаблонами модуля + */ + public static function faqQuestionEdit($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (! (isset($_GET['fid']) && is_numeric($_GET['fid']) && $_GET['fid'] > 0)) + { + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + if (isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0) + { + $faq = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_module_faq_quest + WHERE + faq_id = '" . (int)$_GET['fid'] . "' + AND + id = '" . (int)$_GET['id'] . "' + ")->FetchAssocArray(); + + if ($faq === false) + { + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + } + else + { + $faq = array( + 'id' => '', + 'faq_quest' => '', + 'faq_answer' => '', + 'faq_id' => $_GET['fid'] + ); + } + + switch ($_SESSION['use_editor']) + { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 100; + $config = array(); + $faq['faq_quest'] = $oCKeditor->editor('faq_quest', $faq['faq_quest'], $config); + + $oCKeditor2 = new CKeditor(); + $oCKeditor2->returnOutput = true; + $oCKeditor2->config['toolbar'] = 'Small'; + $oCKeditor2->config['height'] = 400; + $config2 = array(); + $faq['faq_answer'] = $oCKeditor2->editor('faq_answer', $faq['faq_answer'], $config2); + break; + + case '1': + // Elrte и Elfinder + break; + } + + + $AVE_Template->assign($faq); + + $AVE_Template->assign("content", $AVE_Template->fetch($tpl_dir . "admin_quest_edit.tpl")); + } + + /** + * Запись нового или изменённого вопроса и ответа на него + * + * @param string $tpl_dir путь к директории с шаблонами модуля + */ + public static function faqQuestionSave($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (!(isset($_POST['fid']) && is_numeric($_POST['fid']) && $_POST['fid'] > 0)) + { + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + if (isset($_POST['id']) && is_numeric($_POST['id']) && $_POST['id'] > 0) + { + $AVE_DB->Query("UPDATE " . PREFIX . "_module_faq_quest SET faq_quest = '" . $_POST['faq_quest'] . "', faq_answer = '" . $_POST['faq_answer'] . "' WHERE id = '" . $_POST['id'] . "'"); + } + else + { + if ($AVE_DB->Query("SELECT 1 FROM " . PREFIX . "_module_faq WHERE id = '" . $_POST['fid'] . "'")->GetCell()) + { + $AVE_DB->Query("INSERT INTO " . PREFIX . "_module_faq_quest SET id = '', faq_id = '" . $_POST['fid'] . "', faq_quest = '" . $_POST['faq_quest'] . "', faq_answer = '" . $_POST['faq_answer'] . "'"); + } + } + + $AVE_Template->clear_cache($tpl_dir . 'show_faq.tpl', $_POST['fid']); + + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=questlist&fid=" . $_POST['fid'] . "&cp=" . SESSION); + exit; + } + + /** + * Удаление вопроса и ответа на него + * + * @param string $tpl_dir путь к директории с шаблонами модуля + */ + public static function faqQuestionDelete($tpl_dir) + { + global $AVE_DB, $AVE_Template; + + if (!(isset($_GET['fid']) && isset($_GET['id']) + && is_numeric($_GET['fid']) && is_numeric($_GET['id']) + && $_GET['fid'] > 0 && $_GET['id'] > 0)) + { + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=1&cp=" . SESSION); + exit; + } + + $AVE_DB->Query("DELETE FROM " . PREFIX . "_module_faq_quest WHERE faq_id = '" . $_GET['fid'] . "' AND id = '" . $_GET['id'] . "'"); + + $AVE_Template->clear_cache($tpl_dir . 'show_faq.tpl', $_GET['fid']); + + header("Location:index.php?do=modules&action=modedit&mod=faq&moduleaction=questlist&fid=" . $_GET['fid'] . "&cp=" . SESSION); + exit; + } + + /** + * Вывод модуля вопросов и ответов в публичной части + * + * @param int $id идентификатор рубрики вопросов и ответов + */ + public static function faqShow($id) + { + global $AVE_DB, $AVE_Template; + + $faq = $AVE_DB->Query("SELECT faq_title, faq_description FROM " . PREFIX . "_module_faq WHERE id = '" . (int)$id . "'")->fetchArray(); + + $questions = array(); + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module_faq_quest WHERE faq_id = '" . (int)$id . "'"); + while ($row = $sql->FetchRow()) array_push($questions, $row); + + $AVE_Template->assign($faq); + $AVE_Template->assign('questions', $questions); + } +} + +?> diff --git a/index.php b/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/lang/index.php b/lang/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/lang/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/lang/ru.txt b/lang/ru.txt new file mode 100644 index 0000000..3664e79 --- /dev/null +++ b/lang/ru.txt @@ -0,0 +1,28 @@ +FAQ_EDIT = "Редактирование рубрики" +FAQ_EDIT_RUB = "Редактирование рубрики" +FAQ_EDIT_TIP = "В данном разделе представлен список вопросов и ответов выбранной рубрики. Вы можете добавить новый вопрос и ответ на него, перейти к редактированию существующих вопросов и ответов или удалить вопросы и ответы на них." +FAQ_QUEST = "Вопрос" +FAQ_ANSWER = "Ответ" +FAQ_INSERT = "Здесь вы можете редактировать выбранный вопрос и ответ на него." +FAQ_SAVE = "Сохранить" +FAQ_ENTER_NAME = "Пожалуйста, укажите название рубрики" +FAQ_ITEM_NAME = "Название рубрики вопросов и ответов:" +FAQ_BUTTON_SAVE = "Сохранить изменения" +FAQ_BUTTON_ADD = "Добавить рубрику" +FAQ_LIST = "Вопрос-Ответ" +FAQ_LIST_TIP = "В разделе представлен список рубрик модуля Вопрос-Ответ. Вы можете изменить наименование и описание рубрики, перейти к управлению вопросами и ответами определённой рубрики или удалить рубрику вместе с её вопросами и ответами." +FAQ_NAME = "Название рубрики" +FAQ_DESC = "Описание рубрики" +FAQ_TAG = "Системный тег" +FAQ_ACTIONS = "Действия" +FAQ_EDIT_HINT = "Редактировать рубрику" +FAQ_QEDIT_HINT = "Редактировать вопрос и ответ" +FAQ_DELETE_HINT = "Удалить рубрику вместе с вопросами и ответами" +FAQ_QDELETE_HINT = "Удалить вопрос и ответ на него" +FAQ_NO_ITEMS = "В настоящий момент нет данных" +FAQ_ADD = "Добавить рубрику" +FAQ_ADD_QUEST = "Добавить вопрос" +FAQ_BACK = "Управление рубриками" +FAQ_INSERT_H = "Добавление или Редактирование вопросов и ответов" +FAQ_INNAME = "Введите вопрос" +FAQ_INDESC = "Введите ответ на вопрос" diff --git a/module.php b/module.php new file mode 100644 index 0000000..85cb13d --- /dev/null +++ b/module.php @@ -0,0 +1,115 @@ +"; +} + +/** + * Обработка тега модуля + * + * @param int $id идентификатор рубрики вопросов и ответов + */ +function mod_faq($id) +{ + global $AVE_Template; + + $AVE_Template->caching = 1; // Включаем кеширование + $AVE_Template->cache_lifetime = -1; // Неограниченное время жизни кэша +// $AVE_Template->cache_dir .= '/faq'; // Папка для кеша модуля + + $tpl_dir = BASE_DIR . '/modules/faq/templates/'; // Путь к шаблону модуля + + // Если нету в кеше, то начинаем обрабатывать + if (!$AVE_Template->is_cached($tpl_dir . 'show_faq.tpl', $id)) + { + // Проверяем, есть ли папка для кеша, если нет (первый раз) — создаем + if (!is_dir($AVE_Template->cache_dir)) + { + $oldumask = umask(0); + @mkdir($AVE_Template->cache_dir, 0777); + umask($oldumask); + } + + require_once(BASE_DIR . '/modules/faq/class.faq.php'); + + Faq::faqShow($id); + } + + echo rewrite_link($AVE_Template->fetch($tpl_dir . 'show_faq.tpl', $id)); + + $AVE_Template->caching = false; // Отключаем кеширование +} + +/** + * Администрирование + */ +if (defined('ACP') && !empty($_REQUEST['moduleaction'])) +{ + require_once(BASE_DIR . '/modules/faq/class.faq.php'); + + $tpl_dir = BASE_DIR . '/modules/faq/templates/'; + $lang_file = BASE_DIR . '/modules/faq/lang/' . $_SESSION['user_language'] . '.txt'; + + $AVE_Template->config_load($lang_file); + + switch ($_REQUEST['moduleaction']) + { + case '1': + Faq::faqList($tpl_dir); + break; + + case 'new': + Faq::faqNew(); + break; + + case 'del': + Faq::faqDelete($tpl_dir); + break; + + case 'save': + Faq::faqListSave($tpl_dir); + break; + + case 'questlist': + Faq::faqQuestionList($tpl_dir); + break; + + case 'questedit': + Faq::faqQuestionEdit($tpl_dir); + break; + + case 'questsave': + Faq::faqQuestionSave($tpl_dir); + break; + + case 'questdel': + Faq::faqQuestionDelete($tpl_dir); + break; + } +} + +?> \ No newline at end of file diff --git a/sql.php b/sql.php new file mode 100644 index 0000000..1e8f842 --- /dev/null +++ b/sql.php @@ -0,0 +1,62 @@ + \ No newline at end of file diff --git a/templates/admin_faq_edit.tpl b/templates/admin_faq_edit.tpl new file mode 100644 index 0000000..57dccc5 --- /dev/null +++ b/templates/admin_faq_edit.tpl @@ -0,0 +1,71 @@ +
{#FAQ_EDIT_RUB#}
+ +
+
+ {#FAQ_EDIT_TIP#} +
+
+ + + + +
+
+
{if $smarty.request.id != ''}{#FAQ_EDIT_RUB#}{else}{#FAQ_EDIT_RUB#}{/if}
+ + +
+ + + + + + + + + + + + + + {if $questions} + {foreach from=$questions item=question} + + + + + + + + + + {/foreach} + {else} + + + + + {/if} +
{#FAQ_QUEST#}{#FAQ_ANSWER#}{#FAQ_ACTIONS#}
+ {$question->faq_quest|strip_tags|escape|truncate:100} + + {$question->faq_answer|strip_tags|escape|truncate:80} + + + + +
+
    +
  • {#FAQ_NO_ITEMS#}
  • +
+
+
diff --git a/templates/admin_faq_list.tpl b/templates/admin_faq_list.tpl new file mode 100644 index 0000000..d397eae --- /dev/null +++ b/templates/admin_faq_list.tpl @@ -0,0 +1,124 @@ + + + +
{#FAQ_LIST#}
+ +
+
+ {#FAQ_LIST_TIP#} +
+
+ + + + +
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + {if $faq_arr} + {foreach from=$faq_arr item=faq} + + + + + + + + + + + + {/foreach} + + + + + {else} + + + + {/if} + +
{#FAQ_NAME#}{#FAQ_DESC#}{#FAQ_TAG#}{#FAQ_ACTIONS#}
+
+
+
+
+
+
+ + + +
+ +
+
    +
  • {#FAQ_NO_ITEMS#}
  • +
+
+
+
+ + +
+
+
diff --git a/templates/admin_quest_edit.tpl b/templates/admin_quest_edit.tpl new file mode 100644 index 0000000..842043f --- /dev/null +++ b/templates/admin_quest_edit.tpl @@ -0,0 +1,96 @@ +{if $smarty.session.use_editor == 0} + + + +{/if} + +{if $smarty.session.use_editor == 1} + + + + + + + + + + + + + + +{/if} + +
+
{#FAQ_INSERT_H#}
+
+ +
+
+ {#FAQ_INSERT#} +
+
+ + + + +
+
+
{if $smarty.request.id != ''}{#FAQ_EDIT_RUB#}{else}{#FAQ_EDIT_RUB#}{/if}
+ + +
+ +
+ + + + + + + + + + + + + + + + + + + + +
{#FAQ_INNAME#}
+
+ {if $smarty.session.use_editor == 0} + {$faq_quest} + {elseif $smarty.session.use_editor == 1} + + {/if} +
+
{#FAQ_INDESC#}
+
+ {if $smarty.session.use_editor == 0} + {$faq_answer} + {elseif $smarty.session.use_editor == 1} + + {/if} +
+
+ + + +
+
+
diff --git a/templates/index.php b/templates/index.php new file mode 100644 index 0000000..4ca25aa --- /dev/null +++ b/templates/index.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/templates/show_faq.tpl b/templates/show_faq.tpl new file mode 100644 index 0000000..55cf54c --- /dev/null +++ b/templates/show_faq.tpl @@ -0,0 +1,24 @@ +

{$faq_title}

+ +{if $questions} +
+{foreach from=$questions item=question} +

{$question->faq_quest}

+
+

{$question->faq_quest}

+ {$question->faq_answer} +
+{/foreach} +
+{literal} + +{/literal} +{/if}