Вопросы и ответы для JohnCMS 9.2.0+

1.83K
.
aNNiMON

Модуль «Вопросы и ответы» для 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>
Прикрепленные файлы:
.
Ars longa, vita brevis!

Класс!

.

aNNiMON, http://f0366268.xsph.ru/qa/install

.
Кадило крутится, лавэха мутится
# 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', ''));");
Прикрепленные файлы:
.
aNNiMON

GECKTOR, нет, категории не вижу смысла делать. В моём представлении эту задачу прекрасно решают теги.
Stack Exchange вот тоже не заморачивались и у них категории это просто другие сайты.
В qna Хабра тоже не вижу категорий, только теги.

sensizlik,

.
Hey guys! Finally I'm gonna change status!?
# 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)));
Всего: 15