admin/answer.php
<?php declare(strict_types=1);
/**
* Module: SmartFAQ
* Author: The SmartFactory <www.smartfactory.ca>
* Licence: GNU
*/
use Xmf\Request;
use XoopsModules\Smartfaq;
use XoopsModules\Smartfaq\Constants;
use XoopsModules\Smartfaq\Helper;
require_once __DIR__ . '/admin_header.php';
/** @var Smartfaq\Helper $helper */
$helper = Helper::getInstance();
$op = Request::getCmd('op', Request::getCmd('op', '', 'GET'), 'POST');
// Creating the answer handler object
/** @var \XoopsModules\Smartfaq\AnswerHandler $answerHandler */
$answerHandler = Helper::getInstance()->getHandler('Answer');
/**
* @param string $faqid
*/
function editfaq(string $faqid = ''): void
{
global $answerHandler, $xoopsUser, $xoopsConfig, $xoopsDB, $modify, $xoopsModule, $XOOPS_URL, $myts, $pathIcon16;
/** @var Smartfaq\Helper $helper */
$helper = Helper::getInstance();
$smartModuleConfig = $helper->getConfig();
require_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';
// Creating the FAQ object
$faqObj = new Smartfaq\Faq($faqid);
// Creating the category object
$categoryObj = $faqObj->category();
if ($faqObj->notLoaded()) {
redirect_header('index.php', 1, _AM_SF_NOFAQSELECTED);
}
switch ($faqObj->status()) {
case Constants::SF_STATUS_ANSWERED:
$breadcrumb_action1 = _AM_SF_SUBMITTED;
$breadcrumb_action2 = _AM_SF_APPROVING;
$collapsableBar_title = _AM_SF_SUBMITTED_TITLE;
$collapsableBar_info = _AM_SF_SUBMITTED_INFO;
$button_caption = _AM_SF_APPROVE;
$an_status = Constants::SF_AN_STATUS_PROPOSED;
break;
}
$module_id = $xoopsModule->getVar('mid');
/** @var \XoopsGroupPermHandler $grouppermHandler */
$grouppermHandler = xoops_getHandler('groupperm');
$groups = $xoopsUser ? $xoopsUser->getGroups() : XOOPS_GROUP_ANONYMOUS;
if (!Smartfaq\Utility::userIsAdmin()
&& (!$grouppermHandler->checkRight('category_admin', $faqObj->categoryid(), $groups, $module_id))) {
redirect_header('<script>javascript:history.go(-1)</script>', 1, _NOPERM);
}
// Retreiving the official answer
$official_answer = $faqObj->answer();
Smartfaq\Utility::collapsableBar('bottomtable', 'bottomtableicon');
echo "<img id='bottomtableicon' src=" . XOOPS_URL . '/modules/' . $xoopsModule->dirname() . "/assets/images/icon/close12.gif alt=''></a> " . _AM_SF_SUBMITTED_ANSWER . '</h3>';
echo "<div id='bottomtable'>";
echo '<span style="color: #567; margin: 3px 0 12px 0; font-size: small; display: block; ">' . _AM_SF_SUBMITTED_ANSWER_INFO . '</span>';
$proposed_answers = $answerHandler->getAllAnswers($faqid, Constants::SF_AN_STATUS_PROPOSED);
if (0 === count($proposed_answers)) {
redirect_header('index.php', 1, _AM_SF_NOANSWERS);
}
echo "<table width='100%' cellspacing=1 cellpadding=3 border=0 class = outer>
<tr>
<td class='head' width='100px'>" . _AM_SF_CATEGORY . "</td>
<td class='even'>" . $categoryObj->name() . "</td>
</tr>
<tr>
<td class='head' width='100px'>" . _AM_SF_QUESTION . "</td>
<td class='even'>" . $faqObj->question() . '</td>
</tr>';
if ($official_answer) {
echo "
<tr>
<td class='head' width='100px'>" . _AM_SF_ANSWER_OFFICIAL . "</td>
<td class='even'>" . $official_answer->answer() . '</td>
</tr>';
}
echo "</table><br>\n";
echo "<table width='100%' cellspacing=1 cellpadding=3 border=0 class = outer>";
echo '<tr>';
echo "<th width='40' class='bg3' align='center'><b>" . _AM_SF_ARTID . '</b></td>';
echo "<th class='bg3' class='bg3' align='center'><b>" . _AM_SF_ANSWER . '</b></td>';
echo "<th width='90' class='bg3' align='center'><b>" . _AM_SF_ANSWERED . '</b></td>';
echo "<th width='180' class='bg3' align='center'><b>" . _AM_SF_CREATED . '</b></td>';
echo "<th width='120' class='bg3' align='center'><b>" . _AM_SF_ACTION . '</b></td>';
echo '</tr>';
$merge = '';
$modify = '';
$approve = '';
foreach ($proposed_answers as $proposed_answer) {
if (Constants::SF_STATUS_NEW_ANSWER == $faqObj->status()) {
$merge = "<a href='faq.php?op=merge&faqid="
. $faqObj->faqid()
. '&answerid='
. $proposed_answer->answerid()
. "'><img src='"
. XOOPS_URL
. '/modules/'
. $xoopsModule->dirname()
. "/assets/images/icon/merge.gif' title='"
. _AM_SF_FAQ_MERGE
. "' alt='"
. _AM_SF_FAQ_MERGE
. "'></a> ";
$approve = "<a href='answer.php?op=selectanswer&faqid=" . $faqid . '&answerid=' . $proposed_answer->answerid() . "'><img src='" . $pathIcon16 . '/on.png' . "' title='" . _AM_SF_FAQ_APPROVE_NEW_ANSWER . "' alt='" . _AM_SF_APPROVESUB . "'></a>";
}
$modify = "<a href='faq.php?op=mod&faqid=" . $faqObj->faqid() . '&answerid=' . $proposed_answer->answerid() . "'><img src='" . $pathIcon16 . '/edit.png' . "' title='" . _AM_SF_FAQ_REVIEW . "' alt='" . _AM_SF_FAQ_REVIEW . "'></a> ";
$delete = "<a href='answer.php?op=del&faqid=" . $faqObj->faqid() . '&answerid=' . $proposed_answer->answerid() . "'><img src='" . $pathIcon16 . '/delete.png' . "' title='" . _AM_SF_DELETESUBM . "' alt='" . _AM_SF_DELETESUBM . "'></a>";
echo '<tr>';
echo "<td class='head' align='center'>" . $proposed_answer->answerid() . '</td>';
echo "<td class='even' align='left'>" . $proposed_answer->answer() . '</td>';
//show name of the answer submitter
$submitter = Smartfaq\Utility::getLinkedUnameFromId($proposed_answer->uid(), $smartModuleConfig['userealname']);
echo "<td class='even' align='center'>" . $submitter . '</td>';
echo "<td class='even' align='center'>" . $proposed_answer->datesub() . '</td>';
echo "<td class='even' align='center'> $merge $modify $approve $delete </td>";
echo '</tr>';
}
echo "</table>\n<br>";
}
$redirect_msg = '';
$redirect_page = '';
/* -- Available operations -- */
switch ($op) {
case 'mod':
xoops_cp_header();
require_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';
global $xoopsUser, $xoopsConfig, $xoopsDB, $xoopsModule, $modify, $myts;
$faqid = Request::getInt('faqid', 0, 'GET');
editfaq($faqid);
break;
case 'selectanswer':
global $xoopsUser;
$faqid = Request::getInt('faqid', 0, 'GET');
$answerid = Request::getInt('answerid', 0, 'GET');
// Creating the FAQ object
$faqObj = new Smartfaq\Faq($faqid);
if ($faqObj->notLoaded()) {
redirect_header('index.php', 1, _AM_SF_NOFAQSELECTED);
}
// Creating the answer object
$answerObj = new Smartfaq\Answer($answerid);
if ($answerObj->notLoaded()) {
redirect_header('index.php', 1, _AM_SF_NOFAQSELECTED);
}
$answerObj->setVar('status', Constants::SF_AN_STATUS_APPROVED);
$notifToDo_answer = null;
$notifToDo_faq = null;
switch ($faqObj->status()) {
// This was an Open Question that became a Submitted FAQ
case Constants::SF_STATUS_ANSWERED:
if (1 === $helper->getConfig('autoapprove_submitted_faq')) {
// We automatically approve Submitted Q&A
$redirect_msg = _AM_SF_ANSWER_APPROVED_PUBLISHED;
$faqObj->setVar('status', Constants::SF_STATUS_PUBLISHED);
$answerObj->setVar('status', Constants::SF_AN_STATUS_APPROVED);
$notifToDo_faq = [Constants::SF_NOT_FAQ_PUBLISHED];
} else {
// Submitted Q&A need approbation
$redirect_msg = _AM_SF_ANSWER_APPROVED_NEED_APPROVED;
$faqObj->setVar('status', Constants::SF_STATUS_SUBMITTED);
$answerObj->setVar('status', Constants::SF_AN_STATUS_APPROVED);
$notifToDo_faq = [Constants::SF_NOT_FAQ_SUBMITTED];
}
break;
// This is a published FAQ for which a user submitted a new answer and we just accepeted one
case Constants::SF_STATUS_NEW_ANSWER:
$redirect_msg = _AM_SF_FAQ_NEW_ANSWER_PUBLISHED;
$faqObj->setVar('status', Constants::SF_STATUS_PUBLISHED);
$answerObj->setVar('status', Constants::SF_AN_STATUS_APPROVED);
$notifToDo_answer = [Constants::SF_NOT_ANSWER_APPROVED];
break;
}
// Storing the FAQ object in the database
if (!$faqObj->store()) {
redirect_header('<script>javascript:history.go(-1)</script>', 2, _AM_SF_ERROR_FAQ_NOT_SAVED);
}
// Storing the answer object in the database
if (!$answerObj->store()) {
redirect_header('<script>javascript:history.go(-1)</script>', 2, _AM_SF_ERROR_ANSWER_NOT_SAVED);
}
// Send FAQ notifications
if (!empty($notifToDo_faq)) {
$faqObj->sendNotifications($notifToDo_faq);
}
// Send answer notifications
if (!empty($notifToDo_answer)) {
$answerObj->sendNotifications($notifToDo_answer);
}
redirect_header('index.php', 2, $redirect_msg);
break;
case 'del':
global $xoopsUser, $xoopsConfig, $xoopsDB;
$faqid = Request::getInt('faqid', 0, 'POST');
$faqid = Request::getInt('faqid', $faqid, 'GET');
$answerid = Request::getInt('answerid', 0, 'POST');
$answerid = Request::getInt('answerid', $answerid, 'GET');
$confirm = Request::getInt('confirm', 0, 'POST');
$faqObj = new Smartfaq\Faq($faqid);
$answerObj = new Smartfaq\Answer($answerid);
if ($confirm) {
$answerObj->setVar('status', Constants::SF_AN_STATUS_REJECTED);
$answerObj->store();
switch ($faqObj->status()) {
// Open Question for which we are rejecting an answer
case Constants::SF_STATUS_ANSWERED:
$redirect_page = 'index.php';
$redirect_msg = _AM_SF_ANSWER_REJECTED_OPEN_QUESTION;
$faqObj->setVar('status', Constants::SF_STATUS_OPENED);
break;
case Constants::SF_STATUS_NEW_ANSWER:
$proposed_answers = $answerHandler->getAllAnswers($faqid, Constants::SF_AN_STATUS_PROPOSED);
if (count($proposed_answers) > 0) {
// This question has other proposed answer
$redirect_page = 'answer.php?op=mod&faqid=' . $faqid;
$redirect_msg = _AM_SF_ANSWER_REJECTED;
} else {
// The question has no other proposed answer
$redirect_page = 'index.php';
$redirect_msg = _AM_SF_ANSWER_REJECTED;
$faqObj->setVar('status', Constants::SF_STATUS_PUBLISHED);
}
break;
}
$faqObj->store();
redirect_header($redirect_page, 3, $redirect_msg);
} else {
xoops_cp_header();
xoops_confirm(['op' => 'del', 'answerid' => $answerid, 'confirm' => 1, 'faqid' => $faqid], 'answer.php', _AM_SF_DELETETHISANSWER, _AM_SF_DELETE);
xoops_cp_footer();
}
exit();
case 'default':
default:
xoops_cp_header();
require_once XOOPS_ROOT_PATH . '/class/xoopsformloader.php';
global $xoopsUser, $xoopsConfig, $xoopsDB, $xoopsModule;
$helper = Helper::getInstance();
editfaq();
break;
}
require_once __DIR__ . '/admin_footer.php';