Модуль «Вопросы и ответы» для JohnCMS 9.2.0+
Особенности:
— Вопросы можно помечать несколькими тегами для удобной фильтрации
— Возможность голосовать за вопросы и ответы
— Присутствует поддержка выгрузки файлов
— Вопросы можно уточнять, а ответы комментировать
— Присутствует поиск
— Интеграция с уведомлениями: автор вопроса может указать, хочет ли он получать уведомления о новых ответах
Демонстрация:
http://john.annimon.com/qa/
Скриншоты:
https://imgur.com/a/hegy2i8
Установка:
1. Скачать архив и распаковать в корень сайта
2. Проверить наличие файла
/config/routes.local.php
2.1. Если файла нет (+/-)
Создать
/config/routes.local.php с содержимым:
<?php
$map->addRoute(['GET', 'POST'], '/qa/[{action}/[{param}]]', 'modules/qa/index.php');
2.2. Если файл есть (+/-)
Добавить в
/config/routes.local.php строку
$map->addRoute(['GET', 'POST'], '/qa/[{action}/[{param}]]', 'modules/qa/index.php');
3. Проверить наличие файла
/config/places.local.php
3.1. Если файла нет (+/-)
Создать
/config/places.local.php с содержимым:
<?php
return [
'/qa' => '<a href="#home#/qa/">Вопросы и ответы</a>',
'/qa/ask' => '<a href="#home#/qa/">Задаёт вопрос</a>',
];
3.2. Если файл есть (+/-)
Добавить в
/config/places.local.php перед последним "];" строки
'/qa' => '<a href="#home#/qa/">Вопросы и ответы</a>',
'/qa/ask' => '<a href="#home#/qa/">Задаёт вопрос</a>',
4. Проверить наличие файла
/config/notifications.local.php
4.1. Если файла нет (+/-)
Создать
/config/notifications.local.php с содержимым:
<?php
return [
'qa' => [
'name' => 'Вопросы и ответы',
'events' => [
'new_answer' => [
'name' => 'Новый ответ',
'message' => 'На ваш вопрос «#title#» ответили. <a class="alert-link" href="/qa/findanswer/#id#">Посмотреть ответ</a>.',
],
],
],
];
4.2. Если файл есть (+/-)
Добавить в
/config/notifications.local.php перед последним "];" строки
'qa' => [
'name' => 'Вопросы и ответы',
'events' => [
'new_answer' => [
'name' => 'Новый ответ',
'message' => 'На ваш вопрос «#title#» ответили. <a class="alert-link" href="/qa/findanswer/#id#">Посмотреть ответ</a>.',
],
],
],
5. Дать права
0777 для папки
/upload/qa/
6. Перейти по адресу
ваш.сайт/qa/install/
7. [
Опционально] Добавить в
themes/default/templates/system/app/sidebar-main-menu.phtml в удобное место следующие строки:
html (+/-)
<li>
<a href="/qa/">
<svg class="icon">
<use xlink:href="<?= $this->asset('icons/qa.svg') ?>#qa"/>
</svg>
<span class="flex-grow-1">Вопросы и ответы</span>
<?php $qa_counters = di('qa_counters'); ?>
<?php if ($qa_counters['new'] > 0): ?>
<span class="badge badge-pill badge-danger">+ <?= $tools->formatNumber($qa_counters['new']) ?></span>
<?php endif ?>
</a>
</li>
# Master-X (09.04.2020 / 18:05)
aNNiMON, http://f0366268.xsph.ru/qa/install
Адрес со слэшем в конце напиши.
Нажимаю на вопрос и выдает ошибку
aNNiMON, А категории будут ???
как нужна добавить chat.php 9.2.0 ? откуда взять его?
# DieHardMy (18.04.2020 / 09:10)
Нажимаю на вопрос и выдает ошибку
Нужно исключить ONLY_FULL_GROUP_BY из sql_mode
Если нет возможности или желания сделать это глобально, то просто примените патч. Файл закинуть в modules/qa/ и выполнить:
cd modules/qa
patch -p1 < fix_only_full_group.patch
Или вручную добавьте в Dao/Questions.php для метода public function getById(int $id) в самом начале строку
$this->pdo()->query("SET sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', ''));");
GECKTOR, нет, категории не вижу смысла делать. В моём представлении эту задачу прекрасно решают теги.
Stack Exchange вот тоже не заморачивались и у них категории это просто другие сайты.
В qna Хабра тоже не вижу категорий, только теги.
sensizlik,
# aNNiMON (20.04.2020 / 16:15)
Нужно исключить ONLY_FULL_GROUP_BY из sql_mode
Запрос можно исправить, что бы настройки не трогать.
*** (+/-)
SELECT `qa_questions`.*,
COALESCE(u1.`name`, qa_questions.author_name) as `author_name`,
u1.`rights` as `author_rights`,
u1.`lastdate`,
u2.`name` as `editor_name`,
UNIX_TIMESTAMP(`created_at`) as `asking_time`,
UNIX_TIMESTAMP(`edited_at`) as `editing_time`,
(SELECT COALESCE(SUM(`value`), 0) FROM qa_question_votes WHERE `qa_questions`.`id` = `question_id`) AS `rating`
FROM `qa_questions`
LEFT JOIN `users` u1 ON `qa_questions`.`author_id` = u1.`id`
LEFT JOIN `users` u2 ON `qa_questions`.`edited_by` = u2.`id`
-- LEFT JOIN `qa_question_votes` ON `qa_questions`.`id` = `qa_question_votes`.`question_id`
WHERE `qa_questions`.`id` = ?
И в файле /modules/qa/classes/Actions/AbstractAction.php
на 32-х битных системах могут появиться отрицательные значения(со знаком)
$hash = sprintf("%u", crc32(mb_strtolower($tag)));