Example #1
0
 public function display($tpl = null)
 {
     // Initialise variables
     $doc = JFactory::getDocument();
     $doc->addScript(JURI::root() . 'administrator/components/com_easydiscuss/assets/js/admin.js');
     // Load front end language file.
     JFactory::getLanguage()->load('com_easydiscuss', JPATH_ROOT);
     $postId = JRequest::getInt('id', 0);
     $parentId = JRequest::getString('pid', '');
     $source = JRequest::getVar('source', 'posts');
     $post = JTable::getInstance('Posts', 'Discuss');
     $post->load($postId);
     $post->content_raw = $post->content;
     // Get post's tags
     $postModel = $this->getModel('Posts');
     $post->tags = $postModel->getPostTags($post->id);
     $post->content = EasyDiscussParser::html2bbcode($post->content);
     // Select top 20 tags.
     $tagmodel = $this->getModel('Tags');
     $populartags = $tagmodel->getTagCloud('20', 'post_count', 'DESC');
     $repliesCnt = $postModel->getPostRepliesCount($post->id);
     $nestedCategories = DiscussHelper::populateCategories('', '', 'select', 'category_id', $post->category_id, true, true);
     $config = DiscussHelper::getConfig();
     // Get's the creator's name
     $creatorName = $post->poster_name;
     if ($post->user_id) {
         $author = DiscussHelper::getTable('Profile');
         $author->load($post->user_id);
         $creatorName = $author->getName();
     }
     require_once DISCUSS_CLASSES . '/composer.php';
     $composer = new DiscussComposer("creating", $post);
     $this->assignRef('creatorName', $creatorName);
     $this->assignRef('config', $config);
     $this->assignRef('post', $post);
     $this->assignRef('populartags', $populartags);
     $this->assignRef('repliesCnt', $repliesCnt);
     $this->assignRef('source', $source);
     $this->assignRef('parentId', $parentId);
     $this->assignRef('nestedCategories', $nestedCategories);
     $this->assignRef('composer', $composer);
     $this->assign('joomlaversion', DiscussHelper::getJoomlaVersion());
     //load require javascript string
     DiscussHelper::loadString(JRequest::getVar('view'));
     parent::display($tpl);
 }
Example #2
0
 public function addOpenGraph(DiscussPost $post)
 {
     // Use facebook developer tools to check the result
     // https://developers.facebook.com/tools/debug/og
     $doc = JFactory::getDocument();
     $config = DiscussHelper::getConfig();
     // Search for an image in the content
     $image = self::searchImage($post->content);
     if ($image) {
         $doc->addCustomTag('<meta property="og:image" content="' . $image . '" />');
     }
     if ($config->get('integration_facebook_like')) {
         $appId = $config->get('integration_facebook_like_appid');
         if ($appId) {
             $doc->addCustomTag('<meta property="fb:app_id" content="' . $appId . '" />');
         }
         $adminId = $config->get('integration_facebook_like_admin');
         if ($adminId) {
             $doc->addCustomTag('<meta property="fb:admins" content="' . $adminId . '" />');
         }
     }
     // Add post title info here.
     $doc->addCustomTag('<meta property="og:title" content="' . $post->title . '" />');
     // Add post content.
     $maxContent = 350;
     // Remove bbcode tags from the content.
     $content = EasyDiscussParser::removeCodes($post->content);
     $content = strip_tags($post->content);
     if (JString::strlen($content) > $maxContent) {
         $content = JString::substr($content, 0, $maxContent) . '...';
     }
     // Add content to description
     $doc->addCustomTag('<meta property="og:description" content="' . $content . '" />');
     // Add the type of the og tag.
     $doc->addCustomTag('<meta property="og:type" content="article" />');
     // Add the URL for this page.
     $url = DiscussRouter::getRoutedURL(DiscussRouter::getPostRoute($post->id, false, true));
     $doc->addCustomTag('<meta property="og:url" content="' . $url . '" />');
     $doc->setTitle($post->title);
     $doc->setDescription($content);
     return true;
 }
Example #3
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;
 }
Example #4
0
 private function getJomsocialMessage($discussion)
 {
     $config = DiscussHelper::getConfig();
     if ($config->get('layout_editor') == 'bbcode') {
         // Convert content to bbcode
         require_once DISCUSS_HELPERS . '/parser.php';
         return EasyDiscussParser::html2bbcode($discussion->message);
     }
     return $discussion->message;
 }
Example #5
0
 public function getSignature($raw = false)
 {
     if (!array_key_exists('signature', $this->_data)) {
         if ($raw) {
             $this->_data['signature'] = trim($this->signature);
         } else {
             $this->_data['signature'] = nl2br(EasyDiscussParser::bbcode($this->signature));
         }
     }
     return $this->_data['signature'];
 }
Example #6
0
 public function addActivityReply($post)
 {
     $core = JPATH_ROOT . '/components/com_community/libraries/core.php';
     $config = DiscussHelper::getConfig();
     if (!JFile::exists($core)) {
         return false;
     }
     require_once $core;
     // @rule: Insert points for user.
     if ($config->get('integration_jomsocial_points')) {
         CFactory::load('libraries', 'userpoints');
         CUserPoints::assignPoint('com_easydiscuss.reply.discussion', $post->user_id);
     }
     $lang = JFactory::getLanguage();
     $lang->load('com_easydiscuss', JPATH_ROOT);
     // We do not want to add activities if new blog activity is disabled.
     if (!$config->get('integration_jomsocial_activity_reply_question')) {
         return false;
     }
     $link = DiscussRouter::getRoutedURL('index.php?option=com_easydiscuss&view=post&id=' . $post->parent_id, false, true);
     $replyLink = $link . '#' . JText::_('COM_EASYDISCUSS_REPLY_PERMALINK') . '-' . $post->id;
     $parent = DiscussHelper::getTable('Post');
     $parent->load($post->parent_id);
     $title = $this->getActivityTitle($parent->title);
     $content = '';
     if ($config->get('integration_jomsocial_activity_reply_question_content')) {
         $content = $post->content;
         $pattern = '#<img[^>]*>#i';
         preg_match_all($pattern, $content, $matches);
         $imgTag = '';
         if ($matches && count($matches[0]) > 0) {
             foreach ($matches[0] as $match) {
                 // exclude bbcodes from markitup
                 if (stristr($match, '/markitup/') === false) {
                     $imgTag = $match;
                     break;
                 }
             }
         }
         //Parse the bbcode first if using bbcode editor
         if ($config->get('layout_editor') == 'bbcode') {
             $content = EasyDiscussParser::bbcode($content);
         }
         $content = html_entity_decode(strip_tags($content));
         $content = JString::substr($content, 0, $config->get('integration_jomsocial_activity_content_length')) . '...';
         if ($imgTag) {
             $imgTag = JString::str_ireplace('img ', 'img style="margin: 0 5px 5px 0;float:left;height:auto;width: 120px !important;"', $imgTag);
             $content = $imgTag . $content . '<div style="clear:both;"></div>';
         }
         $content .= '<div style="text-align: right;"><a href="' . $link . '">' . JText::_('COM_EASYDISCUSS_JOMSOCIAL_ACTIVITY_REPLY_QUESTION_PARTICIPATE') . '</a></div>';
     }
     //get category privacy.
     $category_id = $post->category_id;
     if (!$post->category_id && $post->parent_id) {
         $postTable = DiscussHelper::getTable('Posts');
         $postTable->load($post->parent_id);
         $category_id = $postTable->category_id;
     }
     $category = DiscussHelper::getTable('Category');
     $category->load($category_id);
     $obj = new stdClass();
     $obj->access = $this->getActivityAccess();
     $obj->title = JText::sprintf('COM_EASYDISCUSS_JOMSOCIAL_ACTIVITY_REPLY_QUESTION', $replyLink, $link, $title);
     $obj->content = $content;
     $obj->cmd = 'easydiscuss.question.reply';
     $obj->actor = $post->user_id;
     $obj->target = 0;
     $obj->like_id = $post->id;
     $obj->like_type = 'com_easydiscuss';
     $obj->comment_id = $post->id;
     $obj->comment_type = 'com_easydiscuss';
     $obj->app = 'easydiscuss';
     $obj->cid = $post->id;
     // add JomSocial activities
     CFactory::load('libraries', 'activities');
     CActivityStream::add($obj);
 }
Example #7
0
 private function setPageHeaders($post)
 {
     // Set page title.
     DiscussHelper::setPageTitle($post->getTitle());
     $doc = JFactory::getDocument();
     $doc->setMetadata('keywords', $post->title);
     $doc->setMetadata('description', preg_replace('/\\s+/', ' ', substr(strip_tags(EasyDiscussParser::bbcode($post->content)), 0, 160)));
     // Set canonical link to avoid URL duplication.
     $doc->addHeadLink(DISCUSS_JURIROOT . DiscussRouter::getPostRoute($post->id), 'canonical', 'rel');
 }
Example #8
0
 /**
  * Process new reply submission called via an iframe.
  *
  * @since   2.0
  * @access  public
  */
 public function ajaxSubmitReply()
 {
     // Process when a new reply is made from bbcode / wysiwyg editor
     $my = JFactory::getUser();
     $config = DiscussHelper::getConfig();
     $ajax = new Disjax();
     $acl = DiscussHelper::getHelper('ACL');
     $post = JRequest::get('POST');
     // @task: User needs to be logged in, in order to submit a new reply.
     if (!$acl->allowed('add_reply', '0') && $my->id == 0) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_PLEASE_KINDLY_LOGIN_INORDER_TO_REPLY');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     if (!$acl->allowed('add_reply', '0')) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_ENTRY_NO_PERMISSION_TO_REPLY');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     if (!isset($post['parent_id'])) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_SYSTEM_INVALID_ID');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     $question = DiscussHelper::getTable('Post');
     $state = $question->load($post['parent_id']);
     if (!$state) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_SYSTEM_INVALID_ID');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     // Ensure that the user really has access to the discussion
     if ($question->private && $my->id != $question->user_id && !DiscussHelper::isSiteAdmin() && !DiscussHelper::isModerator($post->category_id, $my->id)) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_SYSTEM_INSUFFICIENT_PERMISSIONS');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     $questionCategory = DiscussHelper::getTable('Category');
     $questionCategory->load($question->category_id);
     $questionAccess = $question->getAccess($questionCategory);
     if (!$questionAccess->canReply()) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_ENTRY_NO_PERMISSION_TO_REPLY');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     if (empty($post['dc_reply_content'])) {
         // Append result
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_ERROR_REPLY_EMPTY');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     if (empty($my->id)) {
         if (empty($post['user_type'])) {
             // Append result
             $output = array();
             $output['message'] = JText::_('COM_EASYDISCUSS_INVALID_USER_TYPE');
             $output['type'] = 'error';
             echo $this->_outputJson($output);
             return false;
         }
         if (!DiscussUserHelper::validateUserType($post['user_type'])) {
             $output = array();
             $output['message'] = JText::sprintf('COM_EASYDISCUSS_THIS_USERTYPE_HAD_BEEN_DISABLED', $post['user_type']);
             $output['type'] = 'error';
             echo $this->_outputJson($output);
             return false;
         }
         if (empty($post['poster_name']) || empty($post['poster_email'])) {
             $output = array();
             $output['message'] = JText::sprintf('COM_EASYDISCUSS_GUEST_SIGN_IN_DESC');
             $output['type'] = 'error';
             echo $this->_outputJson($output);
             return false;
         }
     } else {
         $post['user_type'] = 'member';
         $post['poster_name'] = '';
         $post['poster_email'] = '';
     }
     // get id if available
     $id = 0;
     // set alias
     $post['alias'] = DiscussHelper::getAlias($post['title'], 'post');
     // set post owner
     $post['user_id'] = $my->id;
     $content = JRequest::getVar('dc_reply_content', '', 'post', 'none', JREQUEST_ALLOWRAW);
     $content = DiscussHelper::getHelper('String ')->unhtmlentities($content);
     // Rebind the post data
     $post['dc_reply_content'] = $content;
     $post['content_type'] = DiscussHelper::getEditorType('reply');
     // Set the ip address
     $post['ip'] = JRequest::getVar('REMOTE_ADDR', '', 'SERVER');
     // bind the table
     $table = DiscussHelper::getTable('Post');
     $table->bind($post, true);
     // Set the category id for the reply since we might need to use this for acl checks.
     $table->category_id = $question->category_id;
     if ($config->get('main_moderatepost', 0) && !DiscussHelper::isModerateThreshold($my->id) && !DiscussHelper::isSiteAdmin($post->user_id)) {
         $table->published = DISCUSS_ID_PENDING;
     } else {
         $table->published = DISCUSS_ID_PUBLISHED;
     }
     require_once DISCUSS_CLASSES . '/recaptcha.php';
     if (DiscussRecaptcha::isRequired()) {
         $obj = DiscussRecaptcha::recaptcha_check_answer($config->get('antispam_recaptcha_private'), $_SERVER['REMOTE_ADDR'], $post['recaptcha_challenge_field'], $post['recaptcha_response_field']);
         if (!$obj->is_valid) {
             $output = array();
             $output['message'] = JText::_('COM_EASYDISCUSS_POST_INVALID_RECAPTCHA_RESPONSE');
             $output['type'] = 'error.captcha';
             echo $this->_outputJson($output);
             return false;
         }
     } 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) {
                     $output = array();
                     $output['message'] = JText::sprintf('COM_EASYDISCUSS_INVALID_CAPTCHA');
                     $output['type'] = 'error';
                     echo $this->_outputJson($output);
                     return false;
                 }
             }
         }
     }
     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' => $post['dc_reply_content'], 'alias' => '');
         $akismet = new Akismet(DISCUSS_JURIROOT, $config->get('antispam_akismet_key'), $data);
         if (!$akismet->errorsExist()) {
             if ($akismet->isSpam()) {
                 $output = array();
                 $output['message'] = JText::_('COM_EASYDISCUSS_AKISMET_SPAM_DETECTED');
                 $output['type'] = 'error';
                 echo $this->_outputJson($output);
                 return false;
             }
         }
     }
     // hold last inserted ID in DB
     $lastId = null;
     // @rule: Bind parameters
     $table->bindParams($post);
     $isNew = true;
     // @trigger: onBeforeSave
     DiscussEventsHelper::importPlugin('content');
     DiscussEventsHelper::onContentBeforeSave('reply', $table, $isNew);
     if (!$table->store()) {
         $output = array();
         $output['message'] = JText::_('COM_EASYDISCUSS_ERROR_SUBMIT_REPLY');
         $output['type'] = 'error';
         echo $this->_outputJson($output);
         return false;
     }
     // Process poll items.
     if ($config->get('main_polls_replies')) {
         $polls = JRequest::getVar('pollitems');
         if (!is_array($polls)) {
             $polls = array($polls);
         }
         // If the post is being edited and
         // there is only 1 poll item which is also empty,
         // we need to delete existing polls tied to this post.
         //if( count( $polls ) == 1 && empty( $polls[0] ) && !$isNew )
         if (!$isNew) {
             $post->removePoll();
         }
         if (count($polls) > 0) {
             $hasPolls = false;
             foreach ($polls as $poll) {
                 // As long as there is 1 valid poll, we need to store them.
                 if (!empty($poll)) {
                     $hasPolls = true;
                     break;
                 }
             }
             if ($hasPolls) {
                 $pollItems = JRequest::getVar('pollitems');
                 // 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($table->id);
                     $pollQuestion->post_id = $table->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();
                             }
                         }
                     }
                     foreach ($pollItems as $item) {
                         $value = (string) $item;
                         if (trim($value) == '') {
                             continue;
                         }
                         $poll = DiscussHelper::getTable('Poll');
                         if (!$poll->loadByValue($value, $table->id, $multiplePolls)) {
                             $poll->set('value', $value);
                             $poll->set('post_id', $table->get('id'));
                             $poll->store();
                         }
                     }
                 }
             }
         }
     }
     // Process custom fields
     $this->saveCustomFieldsValue($table->id);
     // @trigger: onAfterSave
     DiscussEventsHelper::onContentAfterSave('reply', $table, $isNew);
     // @rule: Add notifications for the thread starter
     if ($table->published && $config->get('main_notifications_reply')) {
         // Get all users that are subscribed to this post
         $model = $this->getModel('Posts');
         $participants = $model->getParticipants($table->parent_id);
         // Add the thread starter into the list of participants.
         $participants[] = $question->get('user_id');
         // Notify all subscribers
         foreach ($participants as $participant) {
             if ($participant != $my->id) {
                 $notification = DiscussHelper::getTable('Notifications');
                 $notification->bind(array('title' => JText::sprintf('COM_EASYDISCUSS_REPLY_DISCUSSION_NOTIFICATION_TITLE', $question->get('title')), 'cid' => $question->get('id'), 'type' => DISCUSS_NOTIFICATIONS_REPLY, 'target' => $participant, 'author' => $table->get('user_id'), 'permalink' => 'index.php?option=com_easydiscuss&view=post&id=' . $question->get('id')));
                 $notification->store();
             }
         }
         // @rule: Detect if any names are being mentioned in the post
         $names = DiscussHelper::getHelper('String')->detectNames($table->content);
         if ($names) {
             foreach ($names as $name) {
                 $name = JString::str_ireplace('@', '', $name);
                 $id = DiscussHelper::getUserId($name);
                 if (!$id || $id == $table->get('user_id')) {
                     continue;
                 }
                 $notification = DiscussHelper::getTable('Notifications');
                 $notification->bind(array('title' => JText::sprintf('COM_EASYDISCUSS_MENTIONED_REPLY_NOTIFICATION_TITLE', $question->get('title')), 'cid' => $question->get('id'), 'type' => DISCUSS_NOTIFICATIONS_MENTIONED, 'target' => $id, 'author' => $table->get('user_id'), 'permalink' => 'index.php?option=com_easydiscuss&view=post&id=' . $question->get('id')));
                 $notification->store();
             }
         }
     }
     if ($table->published && !$question->private) {
         // Create notification item in EasySocial
         DiscussHelper::getHelper('EasySocial')->notify('new.reply', $table, $question);
         // @rule: Badges
         DiscussHelper::getHelper('History')->log('easydiscuss.new.reply', $table->user_id, JText::sprintf('COM_EASYDISCUSS_BADGES_HISTORY_NEW_REPLY', $question->title), $table->id);
         DiscussHelper::getHelper('Badges')->assign('easydiscuss.new.reply', $table->user_id);
         DiscussHelper::getHelper('Points')->assign('easydiscuss.new.reply', $table->user_id, $table);
         // Assign badge for EasySocial
         DiscussHelper::getHelper('EasySocial')->assignBadge('reply.question', $table->user_id, JText::sprintf('COM_EASYDISCUSS_BADGES_HISTORY_NEW_REPLY', $question->title));
         // @rule: AUP integrations
         DiscussHelper::getHelper('Aup')->assign(DISCUSS_POINTS_NEW_REPLY, $table->user_id, $question->title);
         // @rule: ranking
         DiscussHelper::getHelper('ranks')->assignRank($table->user_id, $config->get('main_ranking_calc_type'));
     }
     // Bind file attachments
     if ($acl->allowed('add_attachment', '0')) {
         if (!$table->bindAttachments() && $table->getError()) {
             $output = array();
             $output['message'] = $table->getError();
             $output['type'] = 'error';
             echo $this->_outputJson($output);
             return false;
         }
     }
     $replier = new stdClass();
     if ($my->id > 0) {
         $replier->id = $my->id;
         $replier->name = $my->name;
     } else {
         $replier->id = 0;
         $replier->name = JText::_('COM_EASYDISCUSS_GUEST');
         // TODO: user the poster_name
     }
     //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($replier->id);
     $table->user = $creator;
     $voteModel = $this->getModel('votes');
     // clean up bad code
     $table->content_raw = $table->content;
     //$table->content       = DiscussHelper::parseContent( $table->content );
     // @rule: URL References
     $table->references = $table->getReferences();
     // Since this is a new reply, it's impossible that it has been voted before.
     $table->voted = false;
     // get total vote for this reply
     $table->totalVote = $table->sum_totalvote;
     $result['status'] = 'success';
     $result['title'] = JText::_('COM_EASYDISCUSS_SUCCESS_SUBMIT_REPLY');
     $result['id'] = $table->id;
     $result['message'] = JText::_('COM_EASYDISCUSS_REPLY_SAVED');
     $table->title = DiscussHelper::wordFilter($table->title);
     $table->content = DiscussHelper::wordFilter($table->content);
     // Legacy fix when switching from WYSIWYG editor to bbcode.
     $table->content = EasyDiscussParser::html2bbcode($table->content);
     $table->content = DiscussHelper::formatContent($table, true);
     //all access control goes here.
     $canDelete = false;
     $isMainLocked = false;
     if (DiscussHelper::isSiteAdmin() || $acl->allowed('delete_reply', '0') || $table->user_id == $my->id) {
         $canDelete = true;
     }
     $parent = DiscussHelper::getTable('Post');
     $parent->load($table->parent_id);
     $isMainLocked = $parent->islock;
     //default value
     $table->isVoted = 0;
     $table->total_vote_cnt = 0;
     $table->likesAuthor = '';
     $table->minimize = 0;
     if ($config->get('main_content_trigger_replies')) {
         $tempContent = $table->content;
         $table->content = str_replace('@', '&#64;', $tempContent);
         // process content plugins
         DiscussEventsHelper::importPlugin('content');
         DiscussEventsHelper::onContentPrepare('reply', $table);
         $table->event = new stdClass();
         $results = DiscussEventsHelper::onContentBeforeDisplay('reply', $table);
         $table->event->beforeDisplayContent = trim(implode("\n", $results));
         $results = DiscussEventsHelper::onContentAfterDisplay('reply', $table);
         $table->event->afterDisplayContent = trim(implode("\n", $results));
     }
     $tpl = new DiscussThemes();
     $category = DiscussHelper::getTable('Category');
     $category->load($question->category_id);
     $table->access = $table->getAccess($category);
     // Since the reply dont have any comments yet.
     $table->comments = array();
     $tpl->set('category', $category);
     $tpl->set('post', $table);
     $tpl->set('question', $parent);
     $tpl->set('isMine', DiscussHelper::isMine($parent->user_id));
     $tpl->set('isAdmin', DiscussHelper::isSiteAdmin());
     $tpl->set('isMainLocked', $isMainLocked);
     $recaptcha = '';
     $enableRecaptcha = $config->get('antispam_recaptcha', 0);
     $publicKey = $config->get('antispam_recaptcha_public');
     $html = $table->published == DISCUSS_ID_PENDING ? $tpl->fetch('post.reply.item.moderation.php') : $tpl->fetch('post.reply.item.php');
     //send notification to all comment's subscribers that want to receive notification immediately
     $notify = DiscussHelper::getNotification();
     $excludeEmails = array();
     $attachments = $table->getAttachments();
     $emailData['attachments'] = $attachments;
     $emailData['postTitle'] = $parent->title;
     $emailData['comment'] = DiscussHelper::parseContent($table->content);
     $emailData['commentAuthor'] = $my->id ? $creator->getName() : $table->poster_name;
     $emailData['postLink'] = DiscussRouter::getRoutedURL('index.php?option=com_easydiscuss&view=post&id=' . $parent->id, false, true);
     $emailContent = $table->content;
     $isEditing = $isNew == true ? false : true;
     $emailContent = DiscussHelper::bbcodeHtmlSwitcher($table, 'reply', $isEditing);
     $emailContent = $question->trimEmail($emailContent);
     $emailData['replyContent'] = $emailContent;
     $emailData['replyAuthor'] = $my->id ? $creator->getName() : $table->poster_name;
     $emailData['replyAuthorAvatar'] = $creator->getAvatar();
     $emailData['post_id'] = $parent->id;
     $emailData['cat_id'] = $parent->category_id;
     $subscriberEmails = array();
     if (($config->get('main_sitesubscription') || $config->get('main_postsubscription')) && $config->get('notify_subscriber') && $table->published == DISCUSS_ID_PUBLISHED) {
         $emailData['emailTemplate'] = 'email.subscription.reply.new.php';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $posterEmail = $post['poster_email'] ? $post['poster_email'] : $my->email;
         // Get the emails of user who subscribe to this post only
         // This does not send to subscribers whom subscribe to site and category
         $subcribersEmails = DiscussHelper::getHelper('Mailer')->notifyThreadSubscribers($emailData, array($posterEmail, $my->email));
         $excludeEmails[] = $posterEmail;
         $excludeEmails = array_merge($excludeEmails, $subcribersEmails);
         $excludeEmails = array_unique($excludeEmails);
     }
     //notify post owner.
     $postOwnerId = $parent->user_id;
     $postOwner = JFactory::getUser($postOwnerId);
     $ownerEmail = $postOwner->email;
     if ($parent->user_type != 'member') {
         $ownerEmail = $parent->poster_email;
     }
     // Notify Owner
     // if reply under moderation, send owner a notification.
     if ($config->get('notify_owner') && $table->published == DISCUSS_ID_PUBLISHED && $postOwnerId != $replier->id && !in_array($ownerEmail, $excludeEmails) && !empty($ownerEmail)) {
         $emailData['owner_email'] = $ownerEmail;
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['emailTemplate'] = 'email.post.reply.new.php';
         DiscussHelper::getHelper('Mailer')->notifyThreadOwner($emailData);
         // Notify Participants
         $excludeEmails[] = $ownerEmail;
         $excludeEmails = array_unique($excludeEmails);
     }
     if ($config->get('notify_participants') && $table->published == DISCUSS_ID_PUBLISHED) {
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['emailTemplate'] = 'email.post.reply.new.php';
         DiscussHelper::getHelper('Mailer')->notifyThreadParticipants($emailData, $excludeEmails);
     }
     if ($table->published == DISCUSS_ID_PENDING) {
         // Notify admins.
         // Generate hashkeys to map this current request
         $hashkey = DiscussHelper::getTable('Hashkeys');
         $hashkey->uid = $table->id;
         $hashkey->type = DISCUSS_REPLY_TYPE;
         $hashkey->store();
         require_once DISCUSS_HELPERS . '/router.php';
         $approveURL = DiscussHelper::getExternalLink('index.php?option=com_easydiscuss&controller=posts&task=approvePost&key=' . $hashkey->key);
         $rejectURL = DiscussHelper::getExternalLink('index.php?option=com_easydiscuss&controller=posts&task=rejectPost&key=' . $hashkey->key);
         $emailData['moderation'] = '<div style="display:inline-block;width:100%;padding:20px;border-top:1px solid #ccc;padding:20px 0 10px;margin-top:20px;line-height:19px;color:#555;font-family:\'Lucida Grande\',Tahoma,Arial;font-size:12px;text-align:left">';
         $emailData['moderation'] .= '<a href="' . $approveURL . '" style="display:inline-block;padding:5px 15px;background:#fc0;border:1px solid #caa200;border-bottom-color:#977900;color:#534200;text-shadow:0 1px 0 #ffe684;font-weight:bold;box-shadow:inset 0 1px 0 #ffe064;-moz-box-shadow:inset 0 1px 0 #ffe064;-webkit-box-shadow:inset 0 1px 0 #ffe064;border-radius:2px;moz-border-radius:2px;-webkit-border-radius:2px;text-decoration:none!important">' . JText::_('COM_EASYDISCUSS_EMAIL_APPROVE_REPLY') . '</a>';
         $emailData['moderation'] .= ' ' . JText::_('COM_EASYDISCUSS_OR') . ' <a href="' . $rejectURL . '" style="color:#477fda">' . JText::_('COM_EASYDISCUSS_REJECT') . '</a>';
         $emailData['moderation'] .= '</div>';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_MODERATE', $parent->title);
         $emailData['emailTemplate'] = 'email.post.reply.moderation.php';
         DiscussHelper::getHelper('Mailer')->notifyAdministrators($emailData, array(), $config->get('notify_admin'), $config->get('notify_moderator'));
     } elseif ($table->published == DISCUSS_ID_PUBLISHED && !$question->private) {
         $emailData['emailTemplate'] = 'email.post.reply.new.php';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['post_id'] = $parent->id;
         DiscussHelper::getHelper('Mailer')->notifyAdministrators($emailData, $excludeEmails, $config->get('notify_admin_onreply'), $config->get('notify_moderator_onreply'));
     }
     // @rule: Jomsocial activity integrations
     if ($table->published == DISCUSS_ID_PUBLISHED && !$question->private) {
         DiscussHelper::getHelper('jomsocial')->addActivityReply($table);
         DiscussHelper::getHelper('easysocial')->replyDiscussionStream($table);
     }
     $autoSubscribed = false;
     if ($config->get('main_autopostsubscription') && $config->get('main_postsubscription') && $table->user_type != 'twitter') {
         //automatically subscribe this user into this post.
         $subscription_info = array();
         $subscription_info['type'] = 'post';
         $subscription_info['userid'] = !empty($table->user_id) ? $table->user_id : '0';
         $subscription_info['email'] = !empty($table->user_id) ? $my->email : $table->poster_email;
         $subscription_info['cid'] = $parent->id;
         $subscription_info['member'] = !empty($table->user_id) ? '1' : '0';
         $subscription_info['name'] = !empty($table->user_id) ? $my->name : $table->poster_name;
         $subscription_info['interval'] = 'instant';
         $model = $this->getModel('Subscribe');
         $sid = '';
         if ($subscription_info['userid'] == 0) {
             $sid = $model->isPostSubscribedEmail($subscription_info);
             if (empty($sid)) {
                 if ($model->addSubscription($subscription_info)) {
                     $autoSubscribed = true;
                 }
             }
         } else {
             $sid = $model->isPostSubscribedUser($subscription_info);
             if (empty($sid['id'])) {
                 //add new subscription.
                 if ($model->addSubscription($subscription_info)) {
                     $autoSubscribed = true;
                 }
             }
         }
     }
     // Append result
     $output = array();
     $output['message'] = $autoSubscribed ? JText::_('COM_EASYDISCUSS_SUCCESS_REPLY_POSTED_AND_SUBSCRIBED') : JText::_('COM_EASYDISCUSS_SUCCESS_REPLY_POSTED');
     $output['type'] = 'success';
     $output['html'] = $html;
     // Perhaps the viewer is unable to view the replies.
     if (!$questionCategory->canViewReplies()) {
         $output['message'] = JText::_('COM_EASYDISCUSS_REPLY_SUCCESS_BUT_UNABLE_TO_VIEW_REPLIES');
     }
     if ($enableRecaptcha && !empty($publicKey) && $recaptcha) {
         $output['type'] = 'success.captcha';
     }
     echo $this->_outputJson($output);
 }
Example #9
0
 public function replyNotifyUsers($reply, $user, $senderName)
 {
     //send notification to all comment's subscribers that want to receive notification immediately
     $notify = DiscussHelper::getNotification();
     $emailData = array();
     $config = DiscussHelper::getConfig();
     $parent = DiscussHelper::getTable('Post');
     $parent->load($reply->parent_id);
     if ($reply->get('user_type') == DISCUSS_POSTER_GUEST) {
         $emailData['postAuthor'] = $senderName;
         $emailData['commentAuthor'] = $senderName;
         $emailData['replyAuthorAvatar'] = '';
     } else {
         $profile = DiscussHelper::getTable('Profile');
         $profile->load($user->id);
         $emailData['replyAuthor'] = $profile->getName();
         $emailData['commentAuthor'] = $profile->getName();
         $emailData['replyAuthorAvatar'] = $profile->getAvatar();
     }
     $emailContent = $reply->content;
     if ($reply->content_type != 'html') {
         // the content is bbcode. we need to parse it.
         $emailContent = EasyDiscussParser::bbcode($emailContent);
         $emailContent = EasyDiscussParser::removeBrTag($emailContent);
     }
     // If reply is html type we need to strip off html codes.
     if ($reply->content_type == 'html') {
         $emailContent = strip_tags($emailContent);
     }
     $emailContent = $parent->trimEmail($emailContent);
     $emailData['postTitle'] = $parent->title;
     $emailData['comment'] = $reply->content;
     $emailData['postLink'] = DiscussRouter::getRoutedURL('index.php?option=com_easydiscuss&view=post&id=' . $parent->id, false, true);
     $emailData['replyContent'] = $reply->content;
     $attachments = $reply->getAttachments();
     $emailData['attachments'] = $attachments;
     $excludeEmails = array();
     $subscriberEmails = array();
     if (($config->get('main_sitesubscription') || $config->get('main_postsubscription')) && $config->get('notify_subscriber') && $reply->published == DISCUSS_ID_PUBLISHED) {
         $emailData['emailTemplate'] = 'email.subscription.reply.new.php';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['post_id'] = $parent->id;
         $emailData['cat_id'] = $parent->category_id;
         //$subcribersEmails = DiscussHelper::getHelper( 'Mailer' )->notifyThreadSubscribers( $emailData );
         //$excludeEmails		= array_merge( $excludeEmails, $subcribersEmails);
         // Notify all subscriber about new replies
         DiscussHelper::getHelper('Mailer')->notifySubscribers($emailData, $excludeEmails);
     }
     //notify post owner.
     $postOwnerId = $parent->user_id;
     $postOwner = JFactory::getUser($postOwnerId);
     $ownerEmail = $postOwner->email;
     if ($parent->user_type != 'member') {
         $ownerEmail = $parent->poster_email;
     }
     if ($config->get('notify_owner') && $reply->published == DISCUSS_ID_PUBLISHED && $postOwnerId != $user->id && !in_array($ownerEmail, $subscriberEmails) && !empty($ownerEmail)) {
         $emailData['owner_email'] = $ownerEmail;
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['emailTemplate'] = 'email.post.reply.new.php';
         DiscussHelper::getHelper('Mailer')->notifyThreadOwner($emailData);
         $excludeEmails[] = $ownerEmail;
     }
     // Notify Participants
     if ($config->get('notify_participants') && $table->published == DISCUSS_ID_PUBLISHED) {
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['emailTemplate'] = 'email.post.reply.new.php';
         DiscussHelper::getHelper('Mailer')->notifyThreadParticipants($emailData, $excludeEmails);
     }
     //if reply under moderation, send owner a notification.
     if ($reply->published == DISCUSS_ID_PENDING) {
         // Generate hashkeys to map this current request
         $hashkey = DiscussHelper::getTable('Hashkeys');
         $hashkey->uid = $reply->id;
         $hashkey->type = DISCUSS_REPLY_TYPE;
         $hashkey->store();
         $approveURL = DiscussHelper::getExternalLink('index.php?option=com_easydiscuss&controller=posts&task=approvePost&key=' . $hashkey->key);
         $rejectURL = DiscussHelper::getExternalLink('index.php?option=com_easydiscuss&controller=posts&task=rejectPost&key=' . $hashkey->key);
         $emailData['moderation'] = '<div style="display:inline-block;width:100%;padding:20px;border-top:1px solid #ccc;padding:20px 0 10px;margin-top:20px;line-height:19px;color:#555;font-family:\'Lucida Grande\',Tahoma,Arial;font-size:12px;text-align:left">';
         $emailData['moderation'] .= '<a href="' . $approveURL . '" style="display:inline-block;padding:5px 15px;background:#fc0;border:1px solid #caa200;border-bottom-color:#977900;color:#534200;text-shadow:0 1px 0 #ffe684;font-weight:bold;box-shadow:inset 0 1px 0 #ffe064;-moz-box-shadow:inset 0 1px 0 #ffe064;-webkit-box-shadow:inset 0 1px 0 #ffe064;border-radius:2px;moz-border-radius:2px;-webkit-border-radius:2px;text-decoration:none!important">' . JText::_('COM_EASYDISCUSS_EMAIL_APPROVE_REPLY') . '</a>';
         $emailData['moderation'] .= ' ' . JText::_('COM_EASYDISCUSS_OR') . ' <a href="' . $rejectURL . '" style="color:#477fda">' . JText::_('COM_EASYDISCUSS_REJECT') . '</a>';
         $emailData['moderation'] .= '</div>';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_MODERATE', $parent->title);
         $emailData['emailTemplate'] = 'email.post.reply.moderation.php';
         DiscussHelper::getHelper('Mailer')->notifyAdministrators($emailData, array(), $config->get('notify_admin'), $config->get('notify_moderator'));
     } elseif ($table->published == DISCUSS_ID_PUBLISHED) {
         $emailData['emailTemplate'] = 'email.post.reply.new.php';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_REPLY_ADDED', $parent->id, $parent->title);
         $emailData['post_id'] = $parent->id;
         DiscussHelper::getHelper('Mailer')->notifyAdministrators($emailData, array(), $config->get('notify_admin_onreply'), $config->get('notify_moderator_onreply'));
     }
 }
Example #10
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;
 }
Example #11
0
 /**
  * Shares a new content on Facebook
  **/
 public function share($post)
 {
     $config = DiscussHelper::getConfig();
     $content = $post->content;
     $content = EasyDiscussParser::bbcode($content);
     JFactory::getLanguage()->load('com_easydiscuss', JPATH_ROOT);
     $editor = DiscussHelper::getEditorType('question');
     if ($editor == 'html') {
         // @rule: Match images from content
         $pattern = '/<\\s*img [^\\>]*src\\s*=\\s*[\\""\']?([^\\""\'\\s>]*)/i';
     } else {
         $pattern = '/\\[img\\](.*?)\\[\\/img\\]/ims';
     }
     preg_match($pattern, $content, $matches);
     $image = '';
     if ($matches) {
         $image = isset($matches[1]) ? $matches[1] : '';
         if (JString::stristr($matches[1], 'https://') === false && JString::stristr($matches[1], 'http://') === false && !empty($image)) {
             $image = DISCUSS_JURIROOT . '/' . ltrim($image, '/');
         }
     }
     $text = strip_tags($content);
     // @TODO: Configurable content length.
     $maxLength = 200;
     $text = JString::strlen($text) > $maxLength ? JString::substr($text, 0, $maxLength) . '...' : $text;
     $url = DiscussRouter::getRoutedURL('index.php?option=com_easydiscuss&view=post&id=' . $post->id, false, true);
     $this->_access_token = preg_replace('/&expires=.*/i', '', $this->_access_token);
     $jConfig = DiscussHelper::getJConfig();
     $params = array('link' => $url, 'name' => $post->title, 'actions' => '{"name": "' . JText::_('COM_EASYDISCUSS_AUTOPOST_FB_VIEWON_BUTTON') . '", "link" : "' . $url . '"}', 'description' => $text, 'message' => JString::substr(strip_tags($text), 0, 30) . '...', 'access_token' => $this->_access_token);
     if (!empty($image)) {
         // Since Facebook does not allow https images we need to replace them here.
         $params['picture'] = str_ireplace('https://', 'http://', $image);
     } else {
         $params['picture'] = DISCUSS_JURIROOT . '/media/com_easydiscuss/images/default_facebook.png';
         $params['source'] = rtrim(JURI::root(), '/') . '/media/com_easydiscuss/images/default_facebook.png';
     }
     // @rule: See if we need to post this to a Facebook page instead.
     $pageId = $config->get('main_autopost_facebook_page_id');
     if (!empty($pageId)) {
         $pages = JString::trim($pageId);
         $pages = explode(',', $pages);
         $total = count($pages);
         // @rule: Test if there are any pages at all the user can access
         $accounts = parent::api('/me/accounts', array('access_token' => $this->_access_token));
         if (is_array($accounts) && isset($accounts['data'])) {
             for ($i = 0; $i < $total; $i++) {
                 foreach ($accounts['data'] as $page) {
                     if ($page['id'] == $pages[$i]) {
                         $params['access_token'] = $page['access_token'];
                         $query = parent::api('/' . $page['id'] . '/feed', 'post', $params);
                     }
                 }
             }
         }
     } else {
         // @rule: If this is just a normal posting, just post it on their page.
         $query = parent::api('/me/feed', 'post', $params);
     }
     $success = isset($query['id']) ? true : false;
     return $success;
 }
Example #12
0
 /**
  * Handles POST request for new discussions
  *
  * @since	3.0
  * @access	public
  */
 public function submit()
 {
     JRequest::checkToken('request') or jexit('Invalid Token');
     $config = DiscussHelper::getConfig();
     $my = JFactory::getUser();
     $app = JFactory::getApplication();
     $acl = DiscussHelper::getHelper('ACL');
     // If guest posting is disallowed in the settings, they shouldn't be able to create a discussion at all.
     if (!$my->id && !$acl->allowed('add_question', '0')) {
         DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_POST_PLEASE_LOGIN'), DISCUSS_QUEUE_ERROR);
         $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss', false));
         return $app->close();
     }
     // If user is disallowed in the acl, they shouldn't be able to create a discussion at all.
     if ($my->id && !$acl->allowed('add_question', '0')) {
         DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_SYSTEM_INSUFFICIENT_PERMISSIONS'), DISCUSS_QUEUE_ERROR);
         $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss', false));
         return $app->close();
     }
     // Get values from the posted form.
     $data = JRequest::get('post');
     if (isset($data['mod_post_topic_category_id'])) {
         $data['category_id'] = $data['mod_post_topic_category_id'];
         unset($data['mod_post_topic_category_id']);
     }
     // Run validation on the posted data.
     if (!$this->_fieldValidate($data)) {
         $files = JRequest::getVar('filedata', array(), 'FILES');
         $data['attachments'] = $files;
         DiscussHelper::storeSession($data, 'NEW_POST_TOKEN');
         $app->redirect(DiscussRouter::getAskRoute(null, false));
     }
     // get id if available
     $id = JRequest::getInt('id', 0);
     // bind the table
     $post = DiscussHelper::getTable('Post');
     $post->load($id);
     // set is new value
     $isNew = !$post->id ? true : false;
     // If the post is edited and it doesn't have private the user might be switching from private -> non private
     if (!$isNew && !isset($data['private'])) {
         $post->private = false;
     }
     // Perform captcha validation
     $state = EDC::validateCaptcha($data);
     if (!$state) {
         // Store the data into the session
         EDC::storeSession($data, 'NEW_POST_TOKEN');
         // Set error message
         EDC::setMessageQueue(JText::_('COM_EASYDISCUSS_INVALID_CAPTCHA'), DISCUSS_QUEUE_ERROR);
         if ($isNew) {
             $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask', false));
         } else {
             $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask&id=' . $post->id, false));
         }
     }
     $previousTags = array();
     if (!$isNew) {
         //check if admin or is owner before allowing edit.
         $isMine = DiscussHelper::isMine($post->user_id);
         $isAdmin = DiscussHelper::isSiteAdmin();
         $isEditor = $acl->allowed('edit_question');
         if (!$my->id && !$isMine && !$isAdmin && !$isEditor) {
             DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_NO_PERMISSION_TO_PERFORM_THE_REQUESTED_ACTION'), DISCUSS_QUEUE_ERROR);
             $this->setRedirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=post&id=' . $id, false));
             return;
         }
         // If this is an edited post, we need to remove existing tags and add them back again.
         $postsTagsModel = $this->getModel('PostsTags');
         $tmppreviousTags = $postsTagsModel->getPostTags($id);
         if (!empty($tmppreviousTags)) {
             foreach ($tmppreviousTags as $previoustag) {
                 $previousTags[] = $previoustag->id;
             }
         }
         if ($acl->allowed('add_tag', '0')) {
             $postsTagsModel->deletePostTag($id);
         }
     }
     // Get raw content from request as we may need to respect the html codes.
     $content = JRequest::getVar('dc_reply_content', '', 'post', 'none', JREQUEST_ALLOWRAW);
     if (empty($content)) {
         // if there is no content from component, get from module quick question
         $content = JRequest::getVar('quick_question_reply_content', '', 'post', 'none', JREQUEST_ALLOWRAW);
     }
     // some joomla editor htmlentity the content before it send to server. so we need
     // to do the god job to fix the content.
     $content = DiscussHelper::getHelper('String ')->unhtmlentities($content);
     // Ensure that the posted content is respecting the correct values.
     $data['dc_reply_content'] = $content;
     // Cleanup alias.
     $alias = DiscussHelper::wordFilter($data['title']);
     $data['alias'] = DiscussHelper::getAlias($alias, 'post', $post->id);
     // Detect the poster type.
     $data['user_type'] = empty($my->id) ? 'guest' : 'member';
     // Akismet configurations.
     if ($config->get('antispam_akismet') && $config->get('antispam_akismet_key')) {
         require_once DISCUSS_CLASSES . '/akismet.php';
         $params = array($data['title'], $data['dc_reply_content']);
         foreach ($params as $param) {
             $akismet = new Akismet(DISCUSS_JURIROOT, $config->get('antispam_akismet_key'), array('author' => $my->name, 'email' => $my->email, 'website' => DISCUSS_JURIROOT, 'body' => urlencode($param), 'alias' => ''));
             // Detect if there's any errors in Akismet.
             if (!$akismet->errorsExist() && $akismet->isSpam()) {
                 DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_AKISMET_SPAM_DETECTED'), DISCUSS_QUEUE_ERROR);
                 $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask', false));
                 return $app->close();
             }
         }
     }
     // Get previous status before binding.
     $prevPostStatus = $post->published;
     // If post is being edited, do not change the owner of the item.
     if (!$post->id) {
         $data['user_id'] = !$post->user_id ? $my->id : $post->user_id;
     }
     // Check permission to modify assignee
     $category = DiscussHelper::getTable('Category');
     $access = $post->getAccess($category);
     if ($access->canAssign()) {
         $assignment = DiscussHelper::getTable('PostAssignment');
         $assignment->load($post->id);
         // Add new record if assignee was changed
         if (array_key_exists('assignee_id', $data) && $assignment->assignee_id != $data['assignee_id']) {
             $newAssignment = DiscussHelper::getTable('PostAssignment');
             $newAssignment->post_id = $post->id;
             $newAssignment->assignee_id = (int) $data['assignee_id'];
             $newAssignment->assigner_id = (int) JFactory::getUser()->id;
             if (!$newAssignment->store()) {
                 $ajax->fail('Storing failed');
                 return $ajax->send();
             }
         }
     }
     $data['content_type'] = DiscussHelper::getEditorType('question');
     // Bind posted data against the table.
     $post->bind($data, true);
     // Set all post to be published by default.
     $post->published = DISCUSS_ID_PUBLISHED;
     // Detect if post should be moderated.
     if ($config->get('main_moderatepost') && !DiscussHelper::isSiteAdmin($post->user_id) && !DiscussHelper::isModerateThreshold($post->user_id)) {
         $post->published = DISCUSS_ID_PENDING;
     }
     // Bind posted parameters such as custom tab contents.
     $post->bindParams($data);
     // Check for maximum length of content if category has specific settings.
     $category = DiscussHelper::getTable('Category');
     $category->load($post->category_id);
     // If there's a maximum content length specified per category base, then we need to check against the content.
     if ($category->getParam('maxlength')) {
         $length = JString::strlen($post->content);
         if ($length > $category->getParam('maxlength_size', 1000)) {
             DiscussHelper::storeSession($data, 'NEW_POST_TOKEN');
             DiscussHelper::setMessageQueue(JText::sprintf('COM_EASYDISCUSS_MAXIMUM_LENGTH_EXCEEDED', $category->getParam('maxlength_size', 1000)), DISCUSS_QUEUE_ERROR);
             $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask', false));
             return $app->close();
         }
     }
     // If user tries to submit in a container, throw an error.
     if ($category->container) {
         DiscussHelper::storeSession($data, 'NEW_POST_TOKEN');
         DiscussHelper::setMessageQueue(JText::_('COM_EASYDISCUSS_NOT_ALLOWED_TO_POST_INTO_CONTAINER'), DISCUSS_QUEUE_ERROR);
         $app->redirect(DiscussRouter::_('index.php?option=com_easydiscuss&view=ask', false));
         return $app->close();
     }
     // @trigger: onBeforeSave
     DiscussEventsHelper::importPlugin('content');
     DiscussEventsHelper::onContentBeforeSave('post', $post, $isNew);
     // If password is disabled, do not allow users to set password.
     if (!$config->get('main_password_protection')) {
         $post->password = '';
     }
     // Detect user's ip address.
     $ip = JRequest::getVar('REMOTE_ADDR', '', 'SERVER');
     $post->ip = $ip;
     // Try to store the post object.
     if (!$post->store()) {
         DiscussHelper::setMessageQueue($post->getError(), DISCUSS_QUEUE_ERROR);
         $app->redirect(DiscussRouter::getAskRoute($category->id, false));
         return $app->close();
     }
     // API: References.
     $reference = JRequest::getWord('reference', '');
     $referenceId = JRequest::getInt('reference_id', 0);
     if (!empty($reference) && !empty($referenceId)) {
         $referenceTable = DiscussHelper::getTable('PostsReference');
         $referenceTable->extension = $reference;
         $referenceTable->post_id = $post->id;
         $referenceTable->reference_id = $referenceId;
         $referenceTable->store();
     }
     //Clear off previous records before storing
     $ruleModel = DiscussHelper::getModel('CustomFields');
     $ruleModel->deleteCustomFieldsValue($post->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] = '';
                 }
             }
             $post->bindCustomFields($fields, $fieldId);
         }
     }
     // @trigger: onAfterSave
     DiscussEventsHelper::onContentAfterSave('post', $post, $isNew);
     // The category_id for the replies should change too
     $post->moveChilds($post->id, $post->category_id);
     // Process poll items.
     if ($config->get('main_polls')) {
         $polls = JRequest::getVar('pollitems');
         if (!is_array($polls)) {
             $polls = array($polls);
         }
         // If the post is being edited and
         // there is only 1 poll item which is also empty,
         // we need to delete existing polls tied to this post.
         if (count($polls) == 1 && empty($polls[0]) && !$isNew) {
             $post->removePoll();
         }
         if (count($polls) > 0) {
             $hasPolls = false;
             foreach ($polls as $poll) {
                 // As long as there is 1 valid poll, we need to store them.
                 if (!empty($poll)) {
                     $hasPolls = true;
                     break;
                 }
             }
             if ($hasPolls) {
                 // Check if the multiple polls checkbox is it checked?
                 $multiplePolls = JRequest::getVar('multiplePolls', '0');
                 // Get the poll question here.
                 $pollQuestion = JRequest::getVar('poll_question', '');
                 // Try to detect which poll items needs to be removed.
                 $removePolls = JRequest::getVar('pollsremove');
                 // Get the poll items.
                 $pollItems = JRequest::getVar('pollitems');
                 $pollItemsOri = JRequest::getVar('pollitemsOri');
                 // Store the polls now.
                 $post->bindPolls($isNew, $pollItems, $removePolls, $multiplePolls, $pollQuestion, $pollItemsOri);
             }
         }
     }
     // Bind file attachments
     if ($acl->allowed('add_attachment') && $config->get('attachment_questions')) {
         $post->bindAttachments();
     }
     // Detect if the current post should be moderated or not.
     $isModerate = $post->published == DISCUSS_ID_PENDING ? true : false;
     // Process auto posting for posts that are really published and is in a public category.
     if ($post->published == DISCUSS_ID_PUBLISHED && $category->canPublicAccess()) {
         $post->autopost();
     }
     // Detect known names in the post.
     $names = DiscussHelper::getHelper('String')->detectNames($post->content);
     if ($names) {
         foreach ($names as $name) {
             $name = JString::str_ireplace('@', '', $name);
             $id = DiscussHelper::getUserId($name);
             if (!$id || $id == $post->get('user_id')) {
                 continue;
             }
             $notification = DiscussHelper::getTable('Notifications');
             $notification->bind(array('title' => JText::sprintf('COM_EASYDISCUSS_MENTIONED_QUESTION_NOTIFICATION_TITLE', $post->get('title')), 'cid' => $post->get('id'), 'type' => DISCUSS_NOTIFICATIONS_MENTIONED, 'target' => $id, 'author' => $post->get('user_id'), 'permalink' => 'index.php?option=com_easydiscuss&view=post&id=' . $post->get('id')));
             $notification->store();
         }
     }
     if (($isNew || $prevPostStatus == DISCUSS_ID_PENDING) && $post->published == DISCUSS_ID_PUBLISHED) {
         $post->ping();
     }
     $notify = DiscussHelper::getNotification();
     // badwords filtering for email data.
     $post->title = DiscussHelper::wordFilter($post->title);
     $post->content = DiscussHelper::wordFilter($post->content);
     if ($acl->allowed('add_tag', '0')) {
         //@task: Save tags
         $postTagModel = $this->getModel('PostsTags');
         $tags = JRequest::getVar('tags', '', 'POST');
         if (!empty($tags)) {
             $tagModel = $this->getModel('Tags');
             foreach ($tags as $tag) {
                 if (!empty($tag)) {
                     $tagTable = DiscussHelper::getTable('Tags');
                     //@task: Only add tags if it doesn't exist.
                     if (!$tagTable->exists($tag)) {
                         $tagTable->set('title', JString::trim($tag));
                         $tagTable->set('alias', DiscussHelper::getAlias($tag, 'tag'));
                         $tagTable->set('created', DiscussHelper::getDate()->toMySQL());
                         $tagTable->set('published', 1);
                         $tagTable->set('user_id', $my->id);
                         $tagTable->store();
                     } else {
                         $tagTable->load($tag, true);
                     }
                     $postTagInfo = array();
                     //@task: Store in the post tag
                     $postTagTable = DiscussHelper::getTable('PostsTags');
                     $postTagInfo['post_id'] = $post->id;
                     $postTagInfo['tag_id'] = $tagTable->id;
                     $postTagTable->bind($postTagInfo);
                     $postTagTable->store();
                 }
             }
         }
     }
     // prepare email content and information.
     $profile = DiscussHelper::getTable('Profile');
     $profile->load($my->id);
     // For use within the emails.
     $emailData = array();
     $emailData['postTitle'] = $post->title;
     $emailData['postAuthor'] = $profile->id ? $profile->getName() : $post->poster_name;
     $emailData['postAuthorAvatar'] = $profile->getAvatar();
     $emailData['postLink'] = DiscussRouter::getRoutedURL('index.php?option=com_easydiscuss&view=post&id=' . $post->id, false, true);
     $emailContent = $post->content;
     if ($post->content_type != 'html') {
         // the content is bbcode. we need to parse it.
         $emailContent = EasyDiscussParser::bbcode($emailContent);
         $emailContent = EasyDiscussParser::removeBrTag($emailContent);
     }
     // If post is html type we need to strip off html codes.
     if ($post->content_type == 'html') {
         $emailContent = strip_tags($post->content);
     }
     $emailContent = $post->trimEmail($emailContent);
     $attachments = $post->getAttachments();
     $emailData['attachments'] = $attachments;
     $emailData['postContent'] = $emailContent;
     $emailData['post_id'] = $post->id;
     $emailData['cat_id'] = $post->category_id;
     $emailData['emailTemplate'] = 'email.subscription.site.new.php';
     $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_QUESTION_ASKED', $post->id, $post->title);
     if ($isModerate) {
         // Generate hashkeys to map this current request
         $hashkey = DiscussHelper::getTable('HashKeys');
         $hashkey->uid = $post->id;
         $hashkey->type = DISCUSS_QUESTION_TYPE;
         $hashkey->store();
         require_once DISCUSS_HELPERS . '/router.php';
         $approveURL = DiscussHelper::getExternalLink('index.php?option=com_easydiscuss&controller=posts&task=approvePost&key=' . $hashkey->key);
         $rejectURL = DiscussHelper::getExternalLink('index.php?option=com_easydiscuss&controller=posts&task=rejectPost&key=' . $hashkey->key);
         $emailData['moderation'] = '<div style="display:inline-block;width:100%;padding:20px;border-top:1px solid #ccc;padding:20px 0 10px;margin-top:20px;line-height:19px;color:#555;font-family:\'Lucida Grande\',Tahoma,Arial;font-size:12px;text-align:left">';
         $emailData['moderation'] .= '<a href="' . $approveURL . '" style="display:inline-block;padding:5px 15px;background:#fc0;border:1px solid #caa200;border-bottom-color:#977900;color:#534200;text-shadow:0 1px 0 #ffe684;font-weight:bold;box-shadow:inset 0 1px 0 #ffe064;-moz-box-shadow:inset 0 1px 0 #ffe064;-webkit-box-shadow:inset 0 1px 0 #ffe064;border-radius:2px;moz-border-radius:2px;-webkit-border-radius:2px;text-decoration:none!important">' . JText::_('COM_EASYDISCUSS_EMAIL_APPROVE_POST') . '</a>';
         $emailData['moderation'] .= ' ' . JText::_('COM_EASYDISCUSS_OR') . ' <a href="' . $rejectURL . '" style="color:#477fda">' . JText::_('COM_EASYDISCUSS_REJECT') . '</a>';
         $emailData['moderation'] .= '</div>';
         $emailData['emailTemplate'] = 'email.subscription.site.moderate.php';
         $emailData['emailSubject'] = JText::sprintf('COM_EASYDISCUSS_NEW_QUESTION_MODERATE', $post->id, $post->title);
     } else {
         // If this is a private post, do not notify anyone
         if (!$post->private && $category->canPublicAccess()) {
             // Notify site subscribers
             if ($config->get('main_sitesubscription') && ($isNew || $prevPostStatus == DISCUSS_ID_PENDING) && $post->published == DISCUSS_ID_PUBLISHED && !$config->get('notify_all')) {
                 DiscussHelper::getHelper('Mailer')->notifySubscribers($emailData, array($my->email));
             }
             // Notify category subscribers
             if ($config->get('main_ed_categorysubscription') && ($isNew || $prevPostStatus == DISCUSS_ID_PENDING) && $post->published == DISCUSS_ID_PUBLISHED && !$config->get('notify_all')) {
                 DiscussHelper::getHelper('Mailer')->notifySubscribers($emailData, array($my->email));
             }
             // Notify EVERYBODY
             if ($config->get('notify_all') && !$isModerate) {
                 DiscussHelper::getHelper('Mailer')->notifyAllMembers($emailData, array($my->email));
             }
         }
     }
     // Notify admins and category moderators
     if ($isNew || $prevPostStatus == DISCUSS_ID_PENDING) {
         DiscussHelper::getHelper('Mailer')->notifyAdministrators($emailData, array($my->email), $config->get('notify_admin'), $config->get('notify_moderator'));
     }
     // @rule: Jomsocial activity integrations & points & ranking
     if (($isNew || $prevPostStatus == DISCUSS_ID_PENDING) && $post->published == DISCUSS_ID_PUBLISHED && !$post->private) {
         DiscussHelper::getHelper('jomsocial')->addActivityQuestion($post);
         DiscussHelper::getHelper('easysocial')->createDiscussionStream($post);
         // Add notification to subscribers
         DiscussHelper::getHelper('easysocial')->notify('new.discussion', $post);
         // Add logging for user.
         DiscussHelper::getHelper('History')->log('easydiscuss.new.discussion', $my->id, JText::sprintf('COM_EASYDISCUSS_BADGES_HISTORY_NEW_POST', $post->title), $post->id);
         DiscussHelper::getHelper('Badges')->assign('easydiscuss.new.discussion', $my->id);
         DiscussHelper::getHelper('Points')->assign('easydiscuss.new.discussion', $my->id);
         // Assign badge for EasySocial
         DiscussHelper::getHelper('EasySocial')->assignBadge('create.question', $my->id, JText::sprintf('COM_EASYDISCUSS_BADGES_HISTORY_NEW_POST', $post->title));
         // assign new ranks.
         DiscussHelper::getHelper('ranks')->assignRank($my->id, $config->get('main_ranking_calc_type'));
         // aup
         DiscussHelper::getHelper('Aup')->assign(DISCUSS_POINTS_NEW_DISCUSSION, $my->id, $post->title);
     }
     $message = $isNew ? JText::_('COM_EASYDISCUSS_POST_STORED') : JText::_('COM_EASYDISCUSS_EDIT_SUCCESS');
     $state = 'success';
     // Let's set our custom message here.
     if (!$post->isPending()) {
         DiscussHelper::setMessageQueue($message, $state);
     }
     $redirect = JRequest::getVar('redirect', '');
     if (!empty($redirect)) {
         $redirect = base64_decode($redirect);
         return $this->setRedirect($redirect);
     }
     $redirectionOption = $config->get('main_post_redirection');
     switch ($redirectionOption) {
         case 'default':
             $redirect = DiscussRouter::getPostRoute($post->id, false);
             break;
         case 'home':
             $redirect = DiscussRouter::_('index.php?option=com_easydiscuss&view=index', false);
             break;
         case 'mainCategory':
             $redirect = DiscussRouter::_('index.php?option=com_easydiscuss&view=categories', false);
             break;
         case 'currentCategory':
             $redirect = DiscussRouter::getCategoryRoute($post->category_id, false);
             break;
         default:
             $redirect = DiscussRouter::getPostRoute($post->id, false);
             break;
     }
     $this->setRedirect($redirect);
 }