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; }
public function getContent() { if (!isset($this->_data['content'])) { $this->_data['content'] = DiscussHelper::wordFilter($this->content); } return $this->_data['content']; }
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'); }
/** * 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(); }
/** * 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(); }
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; }
/** * 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)); }