<?php
/**
* @package XenCentral Feedback System
* @author DNF Technology
* @copyright Drnoyan & Nalyan LDA, Portugal, EU
* @license http://dnf.technology/terms/
* @link http://customers.dnf.technology
* @version 2.0.0 Beta 10
* @revision 12
*/
namespace XenCentral\Feedback\Pub\Controller;
use XF\Db\Exception;
use XF\Mvc\ParameterBag;
use XF\Pub\Controller\AbstractController;
class Feedback extends AbstractController
{
use FeedbackAbstractController;
public function actionIndex()
{
return $this->rerouteController(__CLASS__, 'View');
}
public function actionView(ParameterBag $params)
{
$fb_id = $params->fb_id;
if (!\XF::visitor()->canViewFeedback() ) {
$this->_getReportSuspicious()->reportActivity('viewfeedback');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious()->reportActivity('viewinvalidfeedback', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
$with = [];
$user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
$commentModel = $this->_getCommentModel();
// get all feedback user got
$comments = $commentModel->getAllComments($fb_id);
$userModel = $this->_getUserModel();
$sidebar = $this->getSidebar($userModel->getUserById($user['user_id'], array(
'PermissionCombination'
)),
\XF::visitor()->canUseFeedback() && $user['user_id'] != \XF::visitor()->user_id);
$viewParams = array(
'user' => $user,
'feedback' => $feedback,
'comments' => $comments,
'sidebar' => $sidebar,
'cancomment' => ((\XF::visitor()->canAdminFeedback() || $this->_getFeedbackModel()->isTrader($feedback, \XF::visitor()->user_id)) && (\XF::visitor()->user_id == $feedback['fromuserid'] || \XF::visitor()->user_id == $feedback['foruserid']))
);
$this->_getActivityModel()->viewFeedback($user, $feedback);
return $this->view('XenCentral\Feedback:ViewFeedback', 'xcfs_feedback_view', $viewParams);
}
public function actionAddFeedback(ParameterBag $params)
{
if (!\XF::visitor()->canUseFeedback() || ! \XF::visitor()->feedbackRestricted(\XF::visitor())) {
$this->_getReportSuspicious()->reportActivity('addfeedback');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$fb_id = $params->fb_id;
$feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious()->reportActivity('addreplyfeedback', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
$user_id = $feedback['fromuserid'];
if ($user_id == \XF::visitor()->user_id) {
$this->_getReportSuspicious()->reportActivity('submitselffeedback');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$with = [];
$user = \XF::em()->find('XF:User', $user_id, $with);
if (!$user) {
$this->_getReportSuspicious()->reportActivity('feedbackusernotfound', array(
'user_id' => $user_id
));
return $this->error(\XF::phrase('requested_user_not_found'));
}
$breadCrumbs['userlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback', $user),
'value' => \XF::phrase('xcfs_feedback_for_x', array(
'username' => $user['username']
)),
'node_id' => $user['user_id']
);
$breadCrumbs['addfeedback'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/add-feedback', $user),
'value' => \XF::phrase('xcfs_add_feedback_for_x', array(
'username' => $user['username']
))
);
$viewParams = array(
'user' => $user,
'feedback' => array(
'type' => $feedback['type'],
'fb_id' => 0,
'amount' => -2,
'dealurl' => $feedback['dealurl']
),
'breadCrumbs' => $breadCrumbs,
'disableURL' => $feedback['dealurl'] != '',
'commenttext' => '',
'showCommentForm' => $this->_getOptionsModel()->getShowCommentForm(),
'requireComment' => $this->_getOptionsModel()->getRequireComment()
);
$this->_getActivityModel()->addFeedback($user);
return $this->view('XenCentral\Feedback:AddFeedback', 'xcfs_add_feedback', $viewParams);
}
public function actionAddComment(ParameterBag $params)
{
$fb_id = $params->fb_id;
$feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('addcommentfeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
if (\XF::visitor()->canAdminFeedback() && !$this->_getFeedbackModel()->isTrader($feedback, \XF::visitor()->user_id)
) {
$this->_getReportSuspicious( )->reportActivity('addcomment');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$user_id = $feedback['foruserid'];
$with = ['PermissionCombination'];
$user = \XF::em()->find('XF:User', $user_id, $with);
if (!$user) {
$this->_getReportSuspicious( )->reportActivity('feedbackusernotfound', array(
'user_id' => $user_id
));
return $this->error(\XF::phrase('requested_user_not_found'));
}
$breadCrumbs['userlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback', $user),
'value' => \XF::phrase('xcfs_feedback_for_x', array(
'username' => $user['username']
)),
'node_id' => $user['user_id']
);
$breadCrumbs['feedbacklink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
'value' => $feedback['review'],
'node_id' => $feedback['fb_id']
);
$breadCrumbs['commentlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/add-comment', $feedback),
'value' => \XF::phrase('xcfs_add_comment'),
'node_id' => $feedback['fb_id']
);
$viewParams = array(
'user' => $user,
'feedback' => $feedback,
'breadCrumbs' => $breadCrumbs,
'comment' => array(
'message' => ''
)
);
$this->_getActivityModel()->addComment($feedback, $user);
return $this->view('XenCentral\Feedback:AddComment', 'xcfs_comment_add', $viewParams);
}
public function actionDoAddComment(ParameterBag $params)
{
$this->assertPostOnly();
$fb_id = $this->filter('fb_id', 'uint');
$comment_id=$params->comment_id;
if ($comment_id) {
return $this->rerouteController('XenCentral\Feedback:Comment', 'do-edit-comment');
}
$feedbackModel = $this->_getFeedbackModel();
$feedback = $feedbackModel->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('addcommentfeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
if (!\XF::visitor()->canAdminFeedback() && !$this->_getFeedbackModel()->isTrader($feedback, \XF::visitor()->user_id)
) {
$this->_getReportSuspicious( )->reportActivity('addcomment');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$with = [];
$user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
$input['comment_html'] = $this->filter('comment_html', 'str');
$input['comment_html'] = $this->plugin('XF:Editor')->fromInput('comment_html');
$checker= $this->app()->spam()->contentChecker();
$checker->check($user, $this->filter('comment_html', 'str'));
if($checker->getFinalDecision()=='denied'){
$this->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
}
$visitor = \XF::visitor();
$comment = $this->plugin('XF:Editor')->fromInput('comment');
$commentWriter = $this->em()->create('XenCentral\Feedback:FeedbackComment');
$commentWriter->set('fb_id', $fb_id);
$commentWriter->set('user_id', $visitor->user_id);
$commentWriter->set('message', $comment);
$commentWriter->preSave();
$commentWriter->save();
$this->_getActivityModel()->commentSaved($feedback, $user);
return $this->redirect(\XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
\XF::phrase('xcfs_your_comment_has_been_posted'));
}
public function actionEdit(ParameterBag $params)
{
$fb_id = $params->fb_id;
$feedbackModel = $this->_getFeedbackModel();
$feedback = $feedbackModel->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('addcommentfeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
if (!$feedback['canedit']) {
$this->_getReportSuspicious( )->reportActivity('feedbackedit', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$user_id = $feedback['foruserid'];
$with = [];
$user = \XF::em()->find('XF:User', $user_id, $with);
if (!$user) {
$this->_getReportSuspicious( )->reportActivity('feedbackusernotfound', array(
'user_id' => $user_id
));
return $this->error(\XF::phrase('requested_user_not_found'));
}
$comment = $this->_getCommentModel()->getFirstComment($fb_id);
$breadCrumbs['userlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback', $user),
'value' => \XF::phrase('xcfs_edit_feedback'),
'node_id' => $user['user_id']
);
$breadCrumbs['feedbacklink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
'value' => $feedback['review']
);
$breadCrumbs['editlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/edit', $feedback),
'value' => \XF::phrase('xcfs_edit_feedback')
);
$viewParams = array(
'user' => $user,
'breadCrumbs' => $breadCrumbs,
'feedback' => $feedback,
'commenttext' => $comment['message'],
'showCommentForm'=> $this->_getOptionsModel()->getShowCommentForm(),
);
$this->_getActivityModel()->editFeedback($feedback, $user);
return $this->view('XenCentralFeedback:AddFeedback', 'xcfs_add_feedback', $viewParams);
}
public function actionDoEditFeedback(ParameterBag $params)
{
$fb_id = $this->filter('fb_id', 'uint');
$feedbackModel = $this->_getFeedbackModel();
$feedback = $feedbackModel->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('editfeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
if (!$feedback['canedit']) {
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$user_id = $feedback['foruserid'];
$with = [];
$user = \XF::em()->find('XF:User', $user_id, $with);
if (!$user) {
$this->_getReportSuspicious( )->reportActivity('feedbackusernotfound', array(
'user_id' => $user_id
));
return $this->error(\XF::phrase('requested_user_not_found'));
}
$input = $this->filter(array(
'type' => 'str',
'amount' => 'int',
'dealurl' => 'str',
'review' => 'str',
'comment_html' => 'str'
));
$input['review'] = htmlspecialchars($input['review']);
if (!$input['amount']) {
$input['amount'] = -2;
}
$checker= $this->app()->spam()->contentChecker();
$checker->check($user, $input['comment_html']);
if($checker->getFinalDecision()=='denied'){
$this->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
}
/**
* @var XenCentral_Feedback_DataWriter_Feedback
*/
if ($feedback['fb_id'])
{
$feedbackWriter = $this->em()->find('XenCentral\Feedback:Feedback', $feedback['fb_id']);
$feedbackWriter->set('foruserid', $feedback['foruserid']);
$feedbackWriter->set('fromuserid', $feedback['fromuserid']);
$feedbackWriter->set('amount', $input['amount']);
$feedbackWriter->set('type', $input['type']);
$feedbackWriter->set('dealurl', $input['dealurl']);
$feedbackWriter->set('review', $input['review']);
}
if (!$input['comment_html']) {
if ($this->_getOptionsModel()->getRequireComment()) {
$this->error(\XF::phrase('xcfs_please_enter_comment_text'));
}
}
$feedbackWriter->preSave();
$feedbackWriter->save();
$message = $this->plugin('XF:Editor')->fromInput('comment');
if (!empty($input['comment_html'])) {
if ( $comment = $this->_getCommentModel()->getFirstComment( $fb_id ) ) {
$commentWriter = $this->em()->find( 'XenCentral\Feedback:FeedbackComment', $comment );
$commentWriter->set( 'message', $message);
} else {
$commentWriter = $this->em()->create( 'XenCentral\Feedback:FeedbackComment' );
$commentWriter->set( 'fb_id', $fb_id );
$commentWriter->set( 'user_id', $feedback['foruserid'] );
$commentWriter->set( 'message', $message );
$commentWriter->preSave();
}
$commentWriter->save();
}
$this->_getActivityModel()->savedFeedback($feedback, $user);
return $this->redirect( \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
\XF::phrase('xcfs_feedback_has_been_edited'));
}
public function actionDelete(ParameterBag $params)
{
$fb_id = $params->fb_id;
$feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('deletefeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
if (!$feedback['canedit']) {
$this->_getReportSuspicious( )->reportActivity('feedbackdelete', array(
'fb_id' => $fb_id
));
return $this->error(XF::phrase('xcfs_cannot_view_the_page'));
}
$with = [];
$user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
$breadCrumbs = array();
$breadCrumbs['userlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback', $user),
'value' => \XF::phrase('xcfs_feedback_for_x', array(
'username' => $user['username']
))
);
$breadCrumbs['feedbacklink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
'value' => $feedback['review']
);
$breadCrumbs['deletelink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/delete', $feedback),
'value' => \XF::phrase('xcfs_delete_feedback')
);
$viewParams = array(
'user' => $user,
'feedback' => $feedback,
'breadCrumbs' => $breadCrumbs
);
return $this->view('XenCentralFeedback:DeleteFeedback', 'xcfs_feedback_delete', $viewParams);
}
public function actionDoDeleteFeedback(ParameterBag $params)
{
$fb_id = $params->fb_id;
$feedback = $this->em()->find('XenCentral\Feedback:Feedback', [
'fb_id' => $fb_id
]);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('deletefeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
if (!\XF::visitor()->canEdit()) {
$this->_getReportSuspicious( )->reportActivity('feedbackdelete', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$with = [];
$user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
/**
* @var XenCentral_Feedback_DataWriter_Comment
*/
$feedback->delete();
$this->_getActivityModel()->deletedFeedback($user);
return $this->redirect(\XF::app()->router('public')->buildLink('feedback', $user),
\XF::phrase('xcfs_feedback_has_been_deleted'));
}
public function actionReport(ParameterBag $params)
{
if (!\XF::visitor()->canUseFeedback()) {
$this->_getReportSuspicious( )->reportActivity('reportfeedback');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$fb_id = $params->fb_id;
$feedback = $this->_getFeedbackModel()->getFeedbackById($fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('reportfeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
$with = [];
$user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
$breadCrumbs = array();
$breadCrumbs['userlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback', $user),
'value' => \XF::phrase('xcfs_feedback_for_x', array(
'username' => $user['username']
))
);
$breadCrumbs['feedbacklink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/view', $feedback),
'value' => $feedback['review']
);
$breadCrumbs['reportlink'] = array(
'href' => \XF::app()->router('public')->buildLink('feedback/feedback/report', $feedback),
'value' => \XF::phrase('xcfs_report_feedback')
);
$viewParams = array(
'user' => $user,
'feedback' => $feedback,
'breadCrumbs' => $breadCrumbs
);
return $this->view('XenCentralFeedback:ReportFeedback', 'xcfs_feedback_report', $viewParams);
}
public function actionDoReportFeedback(ParameterBag $params)
{
if (!\XF::visitor()->canUseFeedback()) {
$this->_getReportSuspicious( )->reportActivity('reportfeedback');
return $this->error(\XF::phrase('xcfs_cannot_view_the_page'));
}
$fb_id = $params->fb_id;
$feedback = $this->em()->find('XenCentral\Feedback:Feedback', $fb_id);
if (!$feedback) {
$this->_getReportSuspicious( )->reportActivity('reportfeedbackinvalid', array(
'fb_id' => $fb_id
));
return $this->error(\XF::phrase('xcfs_invalid_feedback_id'));
}
$message = $this->filter('message', 'str');
if (!$message) {
$this->_getReportSuspicious( )->reportActivity('emptyreport');
return $this->error(\XF::phrase('xcxf_please_enter_reason_for_reporting_this_feedback'));
}
$with = [];
$user = \XF::em()->find('XF:User', $feedback['foruserid'], $with);
$checker= $this->app()->spam()->contentChecker();
$checker->check($user, $message);
if($checker->getFinalDecision()=='denied'){
$this->error(\XF::phrase('your_content_cannot_be_submitted_try_later'));
}
$reportModel = $this->_getReportModel($feedback);
$this->_getActivityModel()->reportedFeedback($feedback, $user);
$reportPlugin = $this->plugin('XF:Report');
return $reportPlugin->actionReport(
'feedback', $feedback,
$this->buildLink('feedback', $feedback),
$this->buildLink('feedback', $feedback)
);
}
public static function getSessionActivityDetailsForList(array $activities)
{
return \XF::phrase('xcfs_viewing_feedback');
}
}