Ejemplo n.º 1
0
 public static function bbcodeHtmlSwitcher($post = '', $type = '', $isEditing = false)
 {
     $config = DiscussHelper::getConfig();
     if ($type == 'question') {
         $editor = $config->get('layout_editor');
     } else {
         if ($type == 'reply') {
             $editor = $config->get('layout_reply_editor');
         } else {
             if ($type == 'signature' || $type == 'description') {
                 $temp = $post;
                 $post = new stdClass();
                 $post->content_raw = $temp;
                 $post->content_type = 'bbcode';
                 $editor = 'bbcode';
             }
         }
     }
     if ($editor != 'bbcode') {
         $editor = 'html';
     }
     if ($post->content_type == 'bbcode') {
         if ($editor == 'bbcode') {
             //If content_type is bbcode and editor is bbcode
             if ($isEditing) {
                 $content = $post->content_raw;
             } else {
                 $content = $post->content_raw;
                 //$content = DiscussHelper::getHelper( 'String' )->escape( $content );
                 $content = EasyDiscussParser::bbcode($content);
                 $content = EasyDiscussParser::removeBrTag($content);
             }
         } else {
             //If content_type is bbcode and editor is html
             // Need content raw to work
             //$content = DiscussHelper::getHelper( 'String' )->escape( $post->content_raw );
             $content = EasyDiscussParser::bbcode($content);
             $content = EasyDiscussParser::removeBrTag($content);
         }
     } else {
         if ($editor == 'bbcode') {
             //If content_type is html and editor is bbcode
             if ($isEditing) {
                 $content = EasyDiscussParser::quoteBbcode($post->content_raw);
                 $content = EasyDiscussParser::smiley2bbcode($content);
                 // we need to parse smiley 1st before we parse htmltobbcode.
                 $content = EasyDiscussParser::html2bbcode($content);
             } else {
                 $content = $post->content_raw;
                 //Quote all bbcode here
                 $content = EasyDiscussParser::quoteBbcode($content);
             }
         } else {
             //If content_type is html and editor is html
             $content = $post->content_raw;
         }
     }
     // Apply censorship
     $content = DiscussHelper::wordFilter($content);
     return $content;
 }
Ejemplo n.º 2
0
 public function getContent()
 {
     if (!isset($this->_data['content'])) {
         $this->_data['content'] = DiscussHelper::wordFilter($this->content);
     }
     return $this->_data['content'];
 }
Ejemplo n.º 3
0
 public function display($tpl = null)
 {
     $app = JFactory::getApplication();
     $doc = JFactory::getDocument();
     $config = DiscussHelper::getConfig();
     // Sorting and filters.
     $sort = JRequest::getString('sort', DiscussHelper::getDefaultRepliesSorting());
     $filteractive = JRequest::getString('filter', 'allposts');
     $id = JRequest::getInt('id');
     $acl = DiscussHelper::getHelper('ACL');
     // Add noindex for print view by default.
     if (JRequest::getInt('print') == 1) {
         $doc->setMetadata('robots', 'noindex,follow');
     }
     // Get current logged in user.
     $my = JFactory::getUser();
     // Determine if the logged in user is an admin.
     $isAdmin = DiscussHelper::isSiteAdmin();
     // Load the post table out.
     $post = DiscussHelper::getTable('Post');
     $state = $post->load($id);
     // Need raw content for later use
     $post->content_raw = $post->content;
     // If id is not found, we need to redirect gracefully.
     if (!$state || !$post->published || !$id) {
         return JError::raiseError(404, JText::_('COM_EASYDISCUSS_SYSTEM_POST_NOT_FOUND'));
     }
     if ($post->private && $my->id != $post->user_id && !$isAdmin && !DiscussHelper::isModerator($post->category_id, $my->id)) {
         return JError::raiseError(404, JText::_('COM_EASYDISCUSS_SYSTEM_POST_NOT_FOUND'));
     }
     // Check whether this is a valid discussion
     if ($post->parent_id != 0 || $post->published == DISCUSS_ID_PENDING && (!$isAdmin && $post->user_id != $my->id)) {
         return JError::raiseError(404, JText::_('COM_EASYDISCUSS_SYSTEM_POST_NOT_FOUND'));
     }
     // check the discussion is under moderation
     if ($post->published == 4 && !DiscussHelper::isModerator($post->category_id, $my->id) && !$isAdmin) {
         DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_NOTICE_POST_SUBMITTED_UNDER_MODERATION'), 'error');
         $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=index', false));
         $app->close();
     }
     // Load the category.
     $category = DiscussHelper::getTable('Category');
     $category->load((int) $post->category_id);
     if ($post->category_id && !$category->canAccess()) {
         return JError::raiseError(404, JText::_('COM_EASYDISCUSS_SYSTEM_POST_NOT_FOUND'));
     }
     // Add pathway for category here.
     DiscussHelper::getHelper('Pathway')->setCategoryPathway($category);
     // Set breadcrumbs for this discussion.
     $this->setPathway($this->escape($post->title));
     // Mark as viewed for notifications.
     $this->logView();
     // Update hit count for this discussion.
     $post->hit();
     // Set page headers
     $this->setPageHeaders($post);
     // Before sending the title and content to be parsed, we need to store this temporarily in case it needs to be accessed.
     $post->title_clear = $post->title;
     // Filter badwords
     $post->title = DiscussHelper::wordFilter($post->title);
     $post->content = DiscussHelper::wordFilter($post->content);
     // Get the tags for this discussion
     $postsTagsModel = $this->getModel('PostsTags');
     $tags = $postsTagsModel->getPostTags($id);
     // Get adsense codes here.
     $adsense = DiscussHelper::getAdsense();
     $postsModel = DiscussHelper::getModel('Posts');
     // Get the answer for this discussion.
     $answer = $postsModel->getAcceptedReply($post->id);
     // Format the answer object.
     if ($answer) {
         $answer = DiscussHelper::formatReplies($answer, $category);
         $answer = $answer[0];
     }
     // Get a list of replies for this post.
     $data = $this->getReplies($category, $post, $sort, $answer);
     $replies = $data->replies;
     $totalReplies = $data->total;
     $hasMoreReplies = $data->more;
     $readMoreURI = $data->readmore;
     // Get comments for the post
     $commentLimit = $config->get('main_comment_pagination') ? $config->get('main_comment_pagination_count') : null;
     $post->comments = false;
     if ($config->get('main_commentpost')) {
         $comments = $post->getComments($commentLimit);
         $post->comments = DiscussHelper::formatComments($comments);
     }
     // get reply comments count
     $post->commentsCount = $post->getTotalComments();
     // Get the post access object here.
     $access = $post->getAccess($category);
     $post->access = $access;
     // Add custom values.
     $postOwner = $post->getOwner();
     $profileTable = DiscussHelper::getTable('Profile');
     if ($postOwner->id) {
         $profileTable->load($postOwner->id);
     }
     $post->user = $profileTable;
     // update user's post read flag
     if ($my->id != 0) {
         $profile = DiscussHelper::getTable('Profile');
         $profile->load($my->id);
         $profile->read($post->id);
     }
     $badgesTable = DiscussHelper::getTable('Profile');
     $badgesTable->load($post->user->id);
     $postBadges = $badgesTable->getBadges();
     // Get Likes model here.
     $post->likesAuthor = DiscussHelper::getHelper('Likes')->getLikesHTML($post->id, $my->id, 'post');
     $post->isVoted = DiscussHelper::getHelper('Post')->isVoted($post->id);
     // Format the content.
     $post->content = DiscussHelper::formatContent($post);
     // Test if trigger is necessary here.
     if ($config->get('main_content_trigger_posts')) {
         // Move aside the original content_raw
         $content_raw_temp = $post->content_raw;
         // Add the br tags in the content, we do it here so that the content triggers's javascript will not get added with br tags
         $post->content_raw = DiscussHelper::formatContent($post);
         $post->event = new stdClass();
         // Triger onContentPrepare here. Since it doesn't have any return value, just ignore this.
         DiscussHelper::triggerPlugins('content', 'onContentPrepare', $post);
         $post->event->afterDisplayTtle = DiscussHelper::triggerPlugins('content', 'onContentAfterTitle', $post, true);
         $post->event->beforeDisplayContent = DiscussHelper::triggerPlugins('content', 'onContentBeforeDisplay', $post, true);
         $post->event->afterDisplayContent = DiscussHelper::triggerPlugins('content', 'onContentAfterDisplay', $post, true);
         // Assign the processed content back
         $post->content = $post->content_raw;
         // Move back the original content_raw
         $post->content_raw = $content_raw_temp;
     }
     $theme = new DiscussThemes();
     // Get list of moderators from the site.
     $moderators = array();
     $composer = new DiscussComposer("replying", $post);
     // Set the discussion object.
     $theme->set('post', $post);
     $theme->set('composer', $composer);
     $theme->set('replies', $replies);
     $theme->set('answer', $answer);
     $theme->set('sort', $sort);
     $theme->set('adsense', $adsense);
     $theme->set('tags', $tags);
     $theme->set('totalReplies', $totalReplies);
     $theme->set('hasMoreReplies', $hasMoreReplies);
     $theme->set('access', $access);
     $theme->set('category', $category);
     $theme->set('moderators', $moderators);
     $theme->set('readMoreURI', $readMoreURI);
     $theme->set('postBadges', $postBadges);
     echo $theme->fetch('post.php');
 }
Ejemplo n.º 4
0
 /**
  * Triggers when an edited reply is saved.
  *
  * @since   3.0
  * @param   null
  * @return  null
  */
 public function saveReply()
 {
     // Load ajax library
     $ajax = DiscussHelper::getHelper('Ajax');
     $config = DiscussHelper::getConfig();
     // Get the posted data
     $data = JRequest::get('post');
     // Prepare the output data
     $output = array();
     $output['id'] = $data['post_id'];
     $acl = DiscussHelper::getHelper('ACL');
     $my = JFactory::getUser();
     // Check for empty content
     $this->checkEmpty($data, $ajax);
     // Rebind the post data because it may contain HTML codes
     $data['content'] = JRequest::getVar('content', '', 'post', 'none', JREQUEST_ALLOWRAW);
     $data['content_type'] = DiscussHelper::getEditorType('reply');
     // Load up the post table
     $post = DiscussHelper::getTable('Post');
     $post->load($data['post_id']);
     // Bind the post table with the data
     $post->bind($data);
     // Check if the post data is valid
     if (!$post->id || !$data['post_id']) {
         $ajax->reject('error', JText::_('COM_EASYDISCUSS_SYSTEM_INVALID_ID'));
         return $ajax->send();
     }
     // Only allow users with proper access
     $isModerator = DiscussHelper::getHelper('Moderator')->isModerator($post->category_id);
     // Do not allow unauthorized access
     if (!DiscussHelper::isSiteAdmin() && $post->user_id != $my->id && !$acl->allowed('edit_reply', 0) && !$isModerator) {
         $ajax->reject('error', JText::_('COM_EASYDISCUSS_SYSTEM_INSUFFICIENT_PERMISSIONS'));
         $ajax->send();
     }
     // Get the new content from the post data
     $post->content = $data['content'];
     // Validate captcha
     $this->checkCaptcha($data);
     // @rule: Bind parameters
     if ($config->get('reply_field_references')) {
         $post->bindParams($data);
     }
     // Bind file attachments
     if ($acl->allowed('add_attachment', '0')) {
         $post->bindAttachments();
     }
     // Determines if this is a new post.
     $isNew = false;
     // @trigger: onBeforeSave
     DiscussEventsHelper::importPlugin('content');
     DiscussEventsHelper::onContentBeforeSave('post', $post, $isNew);
     // Try to store the post now
     if (!$post->store()) {
         $ajax->reject('error', JText::_('COM_EASYDISCUSS_ERROR'));
         $ajax->send();
     }
     // Process polls
     $this->processPolls($post);
     // Process custom fields
     $this->saveCustomFieldsValue($post->id);
     // @trigger: onAfterSave
     DiscussEventsHelper::onContentAfterSave('post', $post, $isNew);
     // Filter for badwords
     $post->title = DiscussHelper::wordFilter($post->title);
     $post->content = DiscussHelper::wordFilter($post->content);
     // Determines if the user is allowed to delete this post
     $canDelete = false;
     if (DiscussHelper::isSiteAdmin() || $acl->allowed('delete_reply', '0') || $post->user_id == $my->id) {
         $canDelete = true;
     }
     // URL References
     $post->references = $post->getReferences();
     // Get the voted state
     $voteModel = DiscussHelper::getModel('Votes');
     $post->voted = $voteModel->hasVoted($post->id);
     // Get total votes for this post
     $post->totalVote = $post->sum_totalvote;
     // Load profile info
     $creator = DiscussHelper::getTable('Profile');
     $creator->load($post->user_id);
     // Assign creator
     $post->user = $creator;
     // Format the content.
     $tmp = $post->content;
     $post->content_raw = $post->content;
     $post->content = DiscussHelper::formatContent($post);
     // Once the formatting is done, we need to escape the raw content
     $post->content_raw = DiscussHelper::getHelper('String')->escape($tmp);
     // Store the default values
     //default value
     $post->isVoted = 0;
     $post->total_vote_cnt = 0;
     $post->likesAuthor = '';
     $post->minimize = 0;
     // Trigger reply
     $post->triggerReply();
     // Load up parent's post
     $question = DiscussHelper::getTable('Post');
     $question->load($post->parent_id);
     $recaptcha = '';
     $enableRecaptcha = $config->get('antispam_recaptcha');
     $publicKey = $config->get('antispam_recaptcha_public');
     $skipRecaptcha = $config->get('antispam_skip_recaptcha');
     $model = DiscussHelper::getModel('Posts');
     $postCount = count($model->getPostsBy('user', $my->id));
     if ($enableRecaptcha && !empty($publicKey) && $postCount < $skipRecaptcha) {
         require_once DISCUSS_CLASSES . '/recaptcha.php';
         $recaptcha = getRecaptchaData($publicKey, $config->get('antispam_recaptcha_theme'), $config->get('antispam_recaptcha_lang'), null, $config->get('antispam_recaptcha_ssl'), 'edit-reply-recaptcha' . $post->id);
     }
     // Get the post access object here.
     $category = DiscussHelper::getTable('Category');
     $category->load($post->category_id);
     $access = $post->getAccess($category);
     $post->access = $access;
     // Get comments for the post
     $commentLimit = $config->get('main_comment_pagination') ? $config->get('main_comment_pagination_count') : null;
     $comments = $post->getComments($commentLimit);
     $post->comments = DiscussHelper::formatComments($comments);
     $theme = new DiscussThemes();
     $theme->set('question', $question);
     $theme->set('post', $post);
     $theme->set('category', $category);
     // Get theme file output
     $contents = $theme->fetch('post.reply.item.php');
     $ajax->resolve($contents);
     return $ajax->send();
 }
Ejemplo n.º 5
0
 /**
  * Responsible to process a comment for saving.
  *
  * @since	3.0
  * @access	public
  */
 public function save()
 {
     $id = JRequest::getInt('id', 0);
     $my = JFactory::getUser();
     $acl = DiscussHelper::getHelper('ACL');
     $ajax = DiscussHelper::getHelper('Ajax');
     $config = DiscussHelper::getConfig();
     // Load the post item.
     $post = DiscussHelper::getTable('Post');
     $state = $post->load($id);
     // Test if a valid post id is provided.
     if (!$id || !$state) {
         $ajax->reject(JText::_('COM_EASYDISCUSS_COMMENTS_INVALID_POST_ID'));
         return $ajax->send();
     }
     $category = DiscussHelper::getTable('Category');
     $category->load($post->category_id);
     $access = $post->getAccess($category);
     // Test if the user is allowed to add comment or not.
     if (!$access->canComment()) {
         $ajax->reject(JText::_('COM_EASYDISCUSS_COMMENTS_NOT_ALLOWED'));
         return $ajax->send();
     }
     // Test if the comment message exists.
     $message = JRequest::getVar('comment', '');
     if (empty($message)) {
         $ajax->reject(JText::_('COM_EASYDISCUSS_COMMENT_IS_EMPTY'));
     }
     // Test if the user checked the terms and conditions box.
     if ($config->get('main_comment_tnc')) {
         $acceptedTerms = JRequest::getInt('tnc', 0);
         if (!$acceptedTerms) {
             $ajax->reject(JText::_('COM_EASYDISCUSS_TERMS_PLEASE_ACCEPT'));
             return $ajax->send();
         }
     }
     // Load user profile's object.
     $profile = DiscussHelper::getTable('Profile');
     $profile->load($my->id);
     // Build up comment object.
     $commentData = new stdClass();
     $commentData->user_id = $my->id;
     $commentData->name = $profile->getName();
     $commentData->email = $my->email;
     $commentData->comment = $message;
     $commentData->post_id = $post->id;
     // Run through akismet screening if necessary.
     if ($config->get('antispam_akismet') && $config->get('antispam_akismet_key')) {
         require_once DISCUSS_CLASSES . '/akismet.php';
         $data = array('author' => $my->name, 'email' => $my->email, 'website' => DISCUSS_JURIROOT, 'body' => $commentData->comment, 'alias' => '');
         $akismet = new Akismet(DISCUSS_JURIROOT, $config->get('antispam_akismet_key'), $data);
         if ($akismet->isSpam()) {
             $ajax->reject(JText::_('COM_EASYDISCUSS_AKISMET_SPAM_DETECTED'));
             return $ajax->send();
         }
     }
     $comment = DiscussHelper::getTable('Comment');
     $comment->bind($commentData, true);
     if (!$comment->store()) {
         $ajax->reject($comment->getError());
         return $ajax->send();
     }
     // Get post duration.
     $durationObj = new stdClass();
     $durationObj->daydiff = 0;
     $durationObj->timediff = '00:00:01';
     $comment->duration = DiscussHelper::getDurationString($durationObj);
     // Set the comment creator.
     $comment->creator = $profile;
     // Try to detect if the comment is posted to the main question or a reply.
     $liveNotificationText = '';
     if ($post->parent_id) {
         $question = DiscussHelper::getTable('Post');
         $question->load($post->parent_id);
         $liveNotificationText = 'COM_EASYDISCUSS_COMMENT_REPLY_NOTIFICATION_TITLE';
     } else {
         $question = DiscussHelper::getTable('Post');
         $question->load($id);
         $liveNotificationText = 'COM_EASYDISCUSS_COMMENT_QUESTION_NOTIFICATION_TITLE';
     }
     // Create notification item in EasySocial
     DiscussHelper::getHelper('EasySocial')->notify('new.comment', $post, $question, $comment);
     if ($comment->published && !$question->private) {
         // AUP integrations
         DiscussHelper::getHelper('Aup')->assign(DISCUSS_POINTS_NEW_COMMENT, $comment->user_id, '');
         // jomsocial activity stream
         DiscussHelper::getHelper('jomsocial')->addActivityComment($post, $question);
         DiscussHelper::getHelper('easysocial')->commentDiscussionStream($comment, $post, $question);
     }
     // Add notification to the post owner.
     if ($post->user_id != $my->id && $comment->published && $config->get('main_notifications_comments')) {
         $notification = DiscussHelper::getTable('Notifications');
         $notification->bind(array('title' => JText::sprintf($liveNotificationText, $question->title), 'cid' => $question->id, 'type' => DISCUSS_NOTIFICATIONS_COMMENT, 'target' => $post->user_id, 'author' => $my->id, 'permalink' => 'index.php?option=com_easydiscuss&view=post&id=' . $question->id));
         $notification->store();
     }
     // Try to assign badge and points to the current user.
     // Only assign points and badge when they are commenting a post that are not posted by them
     //	if( $my->id != $post->user_id )
     //	{
     // Add logging for user.
     DiscussHelper::getHelper('History')->log('easydiscuss.new.comment', $my->id, JText::_('COM_EASYDISCUSS_BADGES_HISTORY_NEW_COMMENT'), $post->id);
     // Assign badge for EasySocial
     DiscussHelper::getHelper('EasySocial')->assignBadge('create.comment', $my->id, JText::_('COM_EASYDISCUSS_BADGES_HISTORY_NEW_COMMENT'));
     DiscussHelper::getHelper('Badges')->assign('easydiscuss.new.comment', $my->id);
     DiscussHelper::getHelper('Points')->assign('easydiscuss.new.comment', $my->id, $comment);
     //	}
     // Apply badword filtering for the comment.
     $comment->comment = DiscussHelper::wordFilter($comment->comment);
     $emailData = array();
     $emailData['commentContent'] = $comment->comment;
     $emailData['commentAuthor'] = $profile->getName();
     $emailData['commentAuthorAvatar'] = $profile->getAvatar();
     $emailData['postTitle'] = $question->title;
     $emailData['postLink'] = DiscussRouter::getRoutedURL('index.php?option=com_easydiscuss&view=post&id=' . $question->id, false, true);
     $emails = array();
     // Send email to the post owner only if the commenter is not the post owner.
     if ($post->user_id != 0 && $post->id != $my->id) {
         $user = JFactory::getUser($post->user_id);
         $emails[] = $user->email;
     }
     // Retrieve the list of user emails from the list of comments made on the post.
     $existingComments = $post->getComments();
     if ($existingComments) {
         foreach ($existingComments as $existingComment) {
             // Only add the email when the user id is not the current logged in user who is posting the comment.
             // It should not send email to the post owner as well since the post owner will already get a notification.
             if ($existingComment->user_id != 0 && $existingComment->user_id != $my->id && $existingComment->user_id != $post->user_id) {
                 $user = JFactory::getUser($existingComment->user_id);
                 $emails[] = $user->email;
             }
         }
     }
     // Ensure the emails are all unique.
     $emails = array_unique($emails);
     // Only send email when email is not empty.
     if (!empty($emails)) {
         $notify = DiscussHelper::getNotification();
         $notify->addQueue($emails, JText::sprintf('COM_EASYDISCUSS_EMAIL_TITLE_NEW_COMMENT', JString::substr($question->content, 0, 15)) . '...', '', 'email.post.comment.new.php', $emailData);
     }
     //revert the comment form
     // $ajax->script('discuss.comment.cancel()');
     // Process comment triggers.
     if ($config->get('main_content_trigger_comments')) {
         $comment->content = $comment->comment;
         // process content plugins
         DiscussEventsHelper::importPlugin('content');
         DiscussEventsHelper::onContentPrepare('comment', $comment);
         $comment->event = new stdClass();
         $results = DiscussEventsHelper::onContentBeforeDisplay('comment', $comment);
         $comment->event->beforeDisplayContent = trim(implode("\n", $results));
         $results = DiscussEventsHelper::onContentAfterDisplay('comment', $comment);
         $comment->event->afterDisplayContent = trim(implode("\n", $results));
         $comment->comment = $comment->content;
     }
     // Get the parent post post id
     $postId = $post->parent_id ? $post->parent_id : $post->id;
     // Get the result of the posted comment.
     $theme = new DiscussThemes();
     $theme->set('comment', $comment);
     $theme->set('postId', $postId);
     $output = $theme->fetch('post.reply.comment.item.php');
     $ajax->resolve($output);
     return $ajax->send();
 }
Ejemplo n.º 6
0
 public static function getData($params)
 {
     $db = DiscussHelper::getDBO();
     $count = (int) $params->get('count', 10);
     $filter = (int) $params->get('filter_option', 0);
     $state = (int) $params->get('filter_state', 0);
     $includeSubcat = (bool) $params->get('include_subcategories', 0);
     $catId = intval($params->get('category', 0));
     $tagId = intval($params->get('tags', 0));
     $limitQuery = '';
     $catQuery = '';
     $exclusionQuery = '';
     if (!empty($count)) {
         $limitQuery = 'LIMIT 0,' . $count;
     }
     if ($state == 1) {
         // Unanswered
         $stateQuery = ' AND a.`isresolve`=' . $db->Quote(0);
         $stateQuery .= ' AND a.`answered`=' . $db->Quote(0);
         //Order query
         $orderBy = 'ORDER BY a.`replied` DESC ';
     } else {
         $stateQuery = '';
         $orderBy = 'ORDER BY a.`created` DESC ';
     }
     if ($filter == 0 || $filter == 1) {
         if ($filter == 1 && !empty($catId)) {
             if (!$includeSubcat) {
                 $catQuery = ' AND a.`category_id` = ' . $db->quote($catId) . ' ';
             } else {
                 $catIds = array($catId);
                 self::appendChildCategories($catId, $catIds);
                 JArrayHelper::toInteger($catIds);
                 $catQuery = ' AND a.`category_id` IN (' . implode(',', $catIds) . ') ';
             }
         }
         $excludedCategories = DiscussHelper::getPrivateCategories();
         if (!empty($excludedCategories)) {
             $exclusionQuery .= ' AND a.`category_id` NOT IN (' . implode(',', $excludedCategories) . ')';
         }
         $query = 'SELECT a.*, (SELECT COUNT(1) FROM `#__discuss_posts` WHERE `parent_id` = a.`id` AND `published`="1") AS `num_replies` FROM ' . $db->nameQuote('#__discuss_posts') . ' AS a ' . 'WHERE a.`published`=' . $db->Quote(1) . ' ' . 'AND a.`parent_id`=' . $db->Quote(0) . ' ' . $catQuery . $exclusionQuery . $stateQuery . $groupByQuery . $orderBy . $limitQuery;
     }
     if ($filter == 2) {
         $query = 'SELECT a.*, (SELECT COUNT(1) FROM `#__discuss_posts` WHERE `parent_id` = a.`id` AND `published`="1") AS `num_replies` ' . ' FROM ' . $db->nameQuote('#__discuss_posts') . ' AS a' . ' LEFT JOIN ' . $db->nameQuote('#__discuss_posts_tags') . ' AS c' . ' ON a.' . $db->nameQuote('id') . '= c.' . $db->nameQuote('post_id') . ' WHERE a.' . $db->nameQuote('published') . '=' . $db->Quote(1) . ' AND a.' . $db->nameQuote('parent_id') . '=' . $db->Quote(0) . ' AND b.' . $db->nameQuote('published') . '=' . $db->Quote(1) . ' AND c.' . $db->nameQuote('tag_id') . '=' . $db->Quote($tagId) . $stateQuery . $groupByQuery . $orderBy . $limitQuery;
     }
     if ($filter == 3) {
         // If featured post + unanswered settings in backend showing no post in the madule
         // is because featured post considered as answered
         // this behaviour is respecting to the component's "unanswered tab"
         $query = 'SELECT a.*, (SELECT COUNT(1) FROM `#__discuss_posts` WHERE `parent_id` = a.`id` AND `published`="1") AS `num_replies` ' . ' FROM ' . $db->nameQuote('#__discuss_posts') . ' AS a' . ' WHERE a.' . $db->nameQuote('published') . '=' . $db->Quote(1) . ' AND a.' . $db->nameQuote('parent_id') . '=' . $db->Quote(0) . ' AND a.' . $db->nameQuote('featured') . '=' . $db->Quote(1) . $stateQuery . $groupByQuery . $orderBy . $limitQuery;
     }
     $db->setQuery($query);
     if (!($result = $db->loadObjectList())) {
         return false;
     }
     $posts = array();
     require_once DISCUSS_HELPERS . '/parser.php';
     foreach ($result as $row) {
         $profile = DiscussHelper::getTable('Profile');
         $profile->load($row->user_id);
         $row->profile = $profile;
         $row->content = EasyDiscussParser::bbcode($row->content);
         $row->title = DiscussHelper::wordFilter($row->title);
         $row->content = DiscussHelper::wordFilter($row->content);
         // Process bbcode
         $row->content = EasyDiscussParser::bbcode($row->content);
         $posts[] = $row;
     }
     // Append profile objects to the result
     return $posts;
 }
Ejemplo n.º 7
0
 /**
  * Saves an edited reply if the site is configured to use a WYSIWYG editor
  *
  * @since	3.2
  * @access	public
  * @param	string
  * @return	
  */
 public function saveReply()
 {
     //JRequest::checkToken('request') or jexit( 'Invalid Token' );
     $config = DiscussHelper::getConfig();
     $acl = DiscussHelper::getHelper('ACL');
     $my = JFactory::getUser();
     $app = JFactory::getApplication();
     $post = JRequest::get('POST');
     $output = array();
     $output['id'] = $post['post_id'];
     $postTable = DiscussHelper::getTable('Post');
     $postTable->load($post['post_id']);
     $categoryTable = DiscussHelper::getTable('category');
     $categoryTable->load($postTable->category_id);
     $postAccess = DiscussHelper::getPostAccess($postTable, $categoryTable);
     if (!$postAccess->canEdit()) {
         DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_SYSTEM_INSUFFICIENT_PERMISSIONS'), DISCUSS_QUEUE_ERROR);
         $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask&id=' . $post['post_id'], false));
         return $app->close();
     }
     // do checking here!
     if (empty($post['dc_reply_content'])) {
         DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_ERROR_REPLY_EMPTY'), DISCUSS_QUEUE_ERROR);
         $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask&id=' . $post['post_id'], false));
         return $app->close();
     }
     // Rebind the post data
     $post['dc_reply_content'] = JRequest::getVar('dc_reply_content', '', 'post', 'none', JREQUEST_ALLOWRAW);
     $post['content'] = $post['dc_reply_content'];
     $data['content_type'] = DiscussHelper::getEditorType('reply');
     $postTable->bind($post);
     $recaptcha = $config->get('antispam_recaptcha');
     $public = $config->get('antispam_recaptcha_public');
     $private = $config->get('antispam_recaptcha_private');
     if (!$config->get('antispam_recaptcha_registered_members') && $my->id > 0) {
         $recaptcha = false;
     }
     if ($recaptcha && $public && $private) {
         require_once DISCUSS_CLASSES . '/recaptcha.php';
         $obj = DiscussRecaptcha::recaptcha_check_answer($private, $_SERVER['REMOTE_ADDR'], $post['recaptcha_challenge_field'], $post['recaptcha_response_field']);
         if (!$obj->is_valid) {
             $ajax->reloadCaptcha();
             $ajax->reject('error', JText::_('COM_EASYDISCUSS_POST_INVALID_RECAPTCHA_RESPONSE'));
             $ajax->send();
         }
     } else {
         if ($config->get('antispam_easydiscuss_captcha')) {
             $runCaptcha = DiscussHelper::getHelper('Captcha')->showCaptcha();
             if ($runCaptcha) {
                 $response = JRequest::getVar('captcha-response');
                 $captchaId = JRequest::getInt('captcha-id');
                 $discussCaptcha = new stdClass();
                 $discussCaptcha->captchaResponse = $response;
                 $discussCaptcha->captchaId = $captchaId;
                 $state = DiscussHelper::getHelper('Captcha')->verify($discussCaptcha);
                 if (!$state) {
                     DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_INVALID_CAPTCHA'), DISCUSS_QUEUE_ERROR);
                     $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=post&layout=edit&id=' . $postTable->id, false));
                     return $app->close();
                 }
             }
         }
     }
     // @rule: Bind parameters
     if ($config->get('reply_field_references')) {
         $postTable->bindParams($post);
     }
     // Bind file attachments
     if ($acl->allowed('add_attachment', '0')) {
         $postTable->bindAttachments();
     }
     $isNew = false;
     // @trigger: onBeforeSave
     DiscussEventsHelper::importPlugin('content');
     DiscussEventsHelper::onContentBeforeSave('post', $postTable, $isNew);
     if (!$postTable->store()) {
         $ajax->reject('error', JText::_('COM_EASYDISCUSS_ERROR'));
         $ajax->send();
     }
     // Process poll items
     $includePolls = JRequest::getBool('pollitems', false);
     // Process poll items here.
     if ($includePolls && $config->get('main_polls')) {
         $pollItems = JRequest::getVar('pollitems');
         $pollItemsOri = JRequest::getVar('pollitemsOri');
         // Delete polls if necessary since this post doesn't contain any polls.
         //if( !$isNew && !$includePolls )
         if (count($pollItems) == 1 && empty($pollItems[0]) && !$isNew) {
             $postTable->removePoll();
         }
         // Check if the multiple polls checkbox is it checked?
         $multiplePolls = JRequest::getVar('multiplePolls', '0');
         if ($pollItems) {
             // As long as we need to create the poll answers, we need to create the main question.
             $pollTitle = JRequest::getVar('poll_question', '');
             // Since poll question are entirely optional.
             $pollQuestion = DiscussHelper::getTable('PollQuestion');
             $pollQuestion->loadByPost($postTable->id);
             $pollQuestion->post_id = $postTable->id;
             $pollQuestion->title = $pollTitle;
             $pollQuestion->multiple = $config->get('main_polls_multiple') ? $multiplePolls : false;
             $pollQuestion->store();
             if (!$isNew) {
                 // Try to detect which poll items needs to be removed.
                 $remove = JRequest::getVar('pollsremove');
                 if (!empty($remove)) {
                     $remove = explode(',', $remove);
                     foreach ($remove as $id) {
                         $id = (int) $id;
                         $poll = DiscussHelper::getTable('Poll');
                         $poll->load($id);
                         $poll->delete();
                     }
                 }
             }
             for ($i = 0; $i < count($pollItems); $i++) {
                 $item = $pollItems[$i];
                 $itemOri = isset($pollItemsOri[$i]) ? $pollItemsOri[$i] : '';
                 $value = (string) $item;
                 $valueOri = (string) $itemOri;
                 if (trim($value) == '') {
                     continue;
                 }
                 $poll = DiscussHelper::getTable('Poll');
                 if (empty($valueOri) && !empty($value)) {
                     // this is a new item.
                     $poll->set('value', $value);
                     $poll->set('post_id', $postTable->get('id'));
                     $poll->store();
                 } else {
                     if (!empty($valueOri) && !empty($value)) {
                         // update existing value.
                         if (!$poll->loadByValue($valueOri, $postTable->get('id'))) {
                             $poll->set('value', $value);
                             $poll->store();
                         }
                     }
                 }
             }
         }
     }
     if (!empty($postTable->id)) {
         //Clear off previous records before storing
         $ruleModel = DiscussHelper::getModel('CustomFields');
         $ruleModel->deleteCustomFieldsValue($postTable->id, 'update');
         // Process custom fields.
         $fieldIds = JRequest::getVar('customFields');
         if (!empty($fieldIds)) {
             foreach ($fieldIds as $fieldId) {
                 $fields = JRequest::getVar('customFieldValue_' . $fieldId);
                 if (!empty($fields)) {
                     // Cater for custom fields select list
                     // To detect if there is no value selected for the select list custom fields
                     if (in_array('defaultList', $fields)) {
                         $tempKey = array_search('defaultList', $fields);
                         $fields[$tempKey] = '';
                     }
                 }
                 $postTable->bindCustomFields($fields, $fieldId);
             }
         }
     }
     // @trigger: onAfterSave
     DiscussEventsHelper::onContentAfterSave('post', $postTable, $isNew);
     //get parent post
     $parentId = $postTable->parent_id;
     $parentTable = DiscussHelper::getTable('Post');
     $parentTable->load($parentId);
     // filtering badwords
     $postTable->title = DiscussHelper::wordFilter($postTable->title);
     $postTable->content = DiscussHelper::wordFilter($postTable->content);
     //all access control goes here.
     $canDelete = false;
     if (DiscussHelper::isSiteAdmin() || $acl->allowed('delete_reply', '0') || $postTable->user_id == $user->id) {
         $canDelete = true;
     }
     // @rule: URL References
     $postTable->references = $postTable->getReferences();
     // set for vote status
     $voteModel = DiscussHelper::getModel('Votes');
     $postTable->voted = $voteModel->hasVoted($postTable->id);
     // get total vote for this reply
     $postTable->totalVote = $postTable->sum_totalvote;
     //load porfile info and auto save into table if user is not already exist in discuss's user table.
     $creator = DiscussHelper::getTable('Profile');
     $creator->load($postTable->user_id);
     $postTable->user = $creator;
     //default value
     $postTable->isVoted = 0;
     $postTable->total_vote_cnt = 0;
     $postTable->likesAuthor = '';
     $postTable->minimize = 0;
     if ($config->get('main_content_trigger_replies')) {
         // process content plugins
         DiscussEventsHelper::importPlugin('content');
         DiscussEventsHelper::onContentPrepare('reply', $postTable);
         $postTable->event = new stdClass();
         $results = DiscussEventsHelper::onContentBeforeDisplay('reply', $postTable);
         $postTable->event->beforeDisplayContent = trim(implode("\n", $results));
         $results = DiscussEventsHelper::onContentAfterDisplay('reply', $postTable);
         $postTable->event->afterDisplayContent = trim(implode("\n", $results));
     }
     $theme = new DiscussThemes();
     $question = DiscussHelper::getTable('Post');
     $question->load($postTable->parent_id);
     $recaptcha = '';
     $enableRecaptcha = $config->get('antispam_recaptcha');
     $publicKey = $config->get('antispam_recaptcha_public');
     $skipRecaptcha = $config->get('antispam_skip_recaptcha');
     $model = DiscussHelper::getModel('Posts');
     $postCount = count($model->getPostsBy('user', $my->id));
     if ($enableRecaptcha && !empty($publicKey) && $postCount < $skipRecaptcha) {
         require_once DISCUSS_CLASSES . '/recaptcha.php';
         $recaptcha = getRecaptchaData($publicKey, $config->get('antispam_recaptcha_theme'), $config->get('antispam_recaptcha_lang'), null, $config->get('antispam_recaptcha_ssl'), 'edit-reply-recaptcha' . $postTable->id);
     }
     // Get the post access object here.
     $category = DiscussHelper::getTable('Category');
     $category->load($postTable->category_id);
     $access = $postTable->getAccess($category);
     $postTable->access = $access;
     // Get comments for the post
     $commentLimit = $config->get('main_comment_pagination') ? $config->get('main_comment_pagination_count') : null;
     $comments = $postTable->getComments($commentLimit);
     $postTable->comments = DiscussHelper::formatComments($comments);
     $theme->set('question', $question);
     $theme->set('post', $postTable);
     $theme->set('category', $category);
     $html = $theme->fetch('post.reply.item.php');
     if ($recaptcha && $public && $private) {
         $output['type'] = 'success.captcha';
     }
     if (!$parentTable->islock) {
         $output['type'] = 'locked';
     }
     $message = $isNew ? JText::_('COM_EASYDISCUSS_POST_STORED') : JText::_('COM_EASYDISCUSS_EDIT_SUCCESS');
     $state = 'success';
     // Let's set our custom message here.
     DiscussHelper::setMessageQueue($message, $state);
     $redirect = JRequest::getVar('redirect', '');
     if (!empty($redirect)) {
         $redirect = base64_decode($redirect);
         return $this->setRedirect($redirect);
     }
     $this->setRedirect(DiscussRouter::getPostRoute($post['parent_id'], false));
 }