public function onPostAdd(OW_Event $event)
 {
     $params = $event->getParams();
     $userService = BOL_UserService::getInstance();
     $userId = $params['userId'];
     $question = $this->service->findQuestion($params['questionId']);
     $post = UTIL_String::truncate($params['text'], 100, '...');
     $postId = $params['id'];
     $ownerId = $question->userId;
     $questionUrl = OW::getRouter()->urlForRoute('questions-question', array('qid' => $question->id));
     $questionText = UTIL_String::truncate($question->text, 100, '...');
     $notificationParams = array('pluginKey' => QUESTIONS_Plugin::PLUGIN_KEY, 'action' => self::ACTION_POST, 'entityType' => 'questions-post', 'entityId' => $postId, 'userId' => null, 'time' => time());
     $uniqId = uniqid('question_post');
     $userAvatars = BOL_AvatarService::getInstance()->getDataForUserAvatars(array($userId));
     $userAvatar = $userAvatars[$userId];
     $string = array('key' => QUESTIONS_Plugin::PLUGIN_KEY . '+notifications_post', 'vars' => array('question' => '<a class="' . $uniqId . '" href="' . $questionUrl . '" >' . $questionText . '</a>', 'user' => '<a href="' . $userAvatar['url'] . '">' . $userAvatar['title'] . '</a>', 'post' => '<a class="' . $uniqId . '" href="' . $questionUrl . '" >' . $post . '</a>'));
     $questionSettings = array('userContext' => array((int) $userId), 'questionId' => $question->id, 'relationId' => $question->id);
     $notificationData = array('string' => $string, 'avatar' => $userAvatar, 'questionSettings' => $questionSettings, 'uniqId' => $uniqId, 'url' => $questionUrl);
     $follows = $this->service->findFollows($question->id, null, array($userId));
     foreach ($follows as $f) {
         $notificationParams['userId'] = $f->userId;
         $event = new OW_Event('notifications.add', $notificationParams, $notificationData);
         OW::getEventManager()->trigger($event);
     }
 }
 /**
  * Returns class instance
  *
  * @return QUESTIONS_BOL_Service
  */
 public static function getInstance()
 {
     if (null === self::$classInstance) {
         self::$classInstance = new self();
     }
     return self::$classInstance;
 }
Exemple #3
0
 public function addQuestion()
 {
     if (!OW::getRequest()->isAjax()) {
         throw new Redirect404Exception();
     }
     if (!OW::getUser()->isAuthenticated()) {
         echo json_encode(false);
         exit;
     }
     if (empty($_POST['question'])) {
         echo json_encode(false);
         exit;
     }
     $question = empty($_POST['question']) ? '' : strip_tags($_POST['question']);
     $question = UTIL_HtmlTag::autoLink($question);
     $answers = empty($_POST['answers']) ? array() : array_filter($_POST['answers'], 'trim');
     $allowAddOprions = !empty($_POST['allowAddOprions']);
     $userId = OW::getUser()->getId();
     $questionDto = $this->service->addQuestion($userId, $question, array('allowAddOprions' => $allowAddOprions));
     foreach ($answers as $ans) {
         $this->service->addOption($questionDto->id, $userId, $ans);
     }
     $event = new OW_Event('feed.action', array('entityType' => QUESTIONS_BOL_Service::ENTITY_TYPE, 'entityId' => $questionDto->id, 'pluginKey' => 'questions', 'userId' => $userId, 'visibility' => 15));
     OW::getEventManager()->trigger($event);
     $activityList = QUESTIONS_BOL_FeedService::getInstance()->findMainActivity(time(), array($questionDto->id), array(0, 6));
     $cmp = new QUESTIONS_CMP_FeedItem($questionDto, reset($activityList[$questionDto->id]), $activityList[$questionDto->id]);
     $html = $cmp->render();
     $script = OW::getDocument()->getOnloadScript();
     echo json_encode(array('markup' => array('html' => $html, 'script' => $script, 'position' => 'prepend')));
     exit;
 }
 public function onUserUnregister(OW_Event $event)
 {
     $params = $event->getParams();
     $userId = $params["userId"];
     // Delete Questions
     $questions = QUESTIONS_BOL_Service::getInstance()->findQuestionsByUserId($userId);
     foreach ($questions as $question) {
         QUESTIONS_BOL_Service::getInstance()->deleteQuestion($question->id);
     }
     // Delete Answers
     $answers = QUESTIONS_BOL_Service::getInstance()->findAnswersByUserId($userId);
     foreach ($answers as $answer) {
         QUESTIONS_BOL_Service::getInstance()->removeAnswerById($answer->id);
     }
     // Delete Follows
     $follows = QUESTIONS_BOL_Service::getInstance()->findFollowsByUserId($userId);
     foreach ($follows as $follow) {
         QUESTIONS_BOL_Service::getInstance()->removeFollow($follow->userId, $follow->questionId);
     }
     // Delete Activity
     $activityList = QUESTIONS_BOL_FeedService::getInstance()->findActivityByUserId($userId);
     foreach ($activityList as $activity) {
         /* @var $activity QUESTIONS_BOL_Activity */
         QUESTIONS_BOL_FeedService::getInstance()->deleteActivity($activity->questionId, $activity->activityType, $activity->activityId);
     }
 }
 public function __construct($optionId, $hiddenUsers)
 {
     $service = QUESTIONS_BOL_Service::getInstance();
     $userIds = $service->findAnsweredUserIdList($optionId);
     $userIds = array_diff($userIds, $hiddenUsers);
     parent::__construct($userIds);
     $this->setTemplate(OW::getPluginManager()->getPlugin('base')->getCmpViewDir() . 'floatbox_user_list.html');
 }
 public function __construct()
 {
     parent::__construct();
     if (!QUESTIONS_BOL_Service::getInstance()->isCurrentUserCanAsk()) {
         $this->setVisible(false);
         return;
     }
     $template = OW::getPluginManager()->getPlugin('questions')->getCmpViewDir() . 'question_add.html';
     $this->setTemplate($template);
 }
 public function onBeforeRender()
 {
     if (!$this->doNotLoadStatic) {
         QUESTIONS_Plugin::getInstance()->addStatic();
     }
     if ($this->editable === null) {
         $this->editable = $this->service->isCurrentUserCanInteract($this->question) && $this->service->isCurrentUserCanAnswer($this->question);
     }
     $tmp = $this->service->findOptionListAndAnswerCountList($this->question->id, $this->startStamp, $this->userContext, $this->limit);
     $optionsDtoList = $tmp['optionList'];
     $countList = $tmp['countList'];
     $userContext = null;
     if (is_array($this->userContext)) {
         $userContext = $this->userContext;
         $userContext[] = $this->userId;
         $userContext = array_unique($userContext);
     }
     $totalAnswerCount = $this->totalAnswerCount == null ? $this->service->findTotalAnswersCount($this->question->id) : $this->totalAnswerCount;
     $answerCount = $this->poll ? $totalAnswerCount : $this->service->findMaxAnswersCount($this->question->id);
     $optionList = new QUESTIONS_CMP_OptionList($optionsDtoList, $this->uniqId, $this->userId);
     $optionList->setAnswerCount($answerCount);
     $optionList->setEditable($this->editable);
     $optionList->setIsPoll($this->poll);
     $optionList->setUsersContext($userContext);
     $optionList->setEditMode($this->editMode);
     $options = $optionList->initOption($countList);
     $shareData = array('userId' => $this->userId, 'ownerId' => $this->question->userId, 'editable' => $this->editable, 'editMode' => $this->editMode, 'questionId' => $this->question->id, 'totalAnswers' => $answerCount, 'poll' => $this->poll, 'uniqId' => $this->uniqId, 'userContext' => $userContext, 'displayedCount' => count($options), 'optionTotal' => $this->optionTotal, 'startStamp' => $this->startStamp, 'ignoreOptions' => array(), 'expandedView' => $this->expandedView, 'inPopupMode' => $this->inPopupMode, 'ownerMode' => $this->userId == $this->question->userId, 'url' => $this->questionUrl);
     $shareData['offset'] = $shareData['displayedCount'];
     $shareData['st']['displayedCount'] = $shareData['displayedCount'];
     $shareData['st']['optionTotal'] = $shareData['optionTotal'];
     $jsAccessor = 'questionAnswers';
     $js = UTIL_JsGenerator::newInstance();
     $js->equateVarables($jsAccessor, array('QUESTIONS_AnswerListCollection', $this->uniqId));
     $js->callFunction(array($jsAccessor, 'init'), array($this->uniqId, $options, $shareData, !$this->editable));
     $js->callFunction(array($jsAccessor, 'setResponder'), array(OW::getRouter()->urlFor('QUESTIONS_CTRL_Questions', 'rsp')));
     $this->assign('viewMore', $this->viewMore);
     $this->assign('editMode', $this->editMode);
     if ($this->viewMore) {
         $js->callFunction(array($jsAccessor, 'initViewMore'), array());
         $this->assign('viewMoreUrl', $this->questionUrl);
     }
     $addNewAvaliable = $this->editable && !$this->poll;
     $this->assign('addNew', $addNewAvaliable);
     $this->assign('hideAddNew', !$this->isAddNewAvaliable());
     if ($addNewAvaliable) {
         $js->callFunction(array($jsAccessor, 'initAddNew'), array());
     }
     OW::getDocument()->addOnloadScript($js);
     $this->assign('uniqId', $this->uniqId);
     $this->addComponent('list', $optionList);
     OW::getLanguage()->addKeyForJs('questions', 'option_not_empty_delete_warning');
     OW::getLanguage()->addKeyForJs('questions', 'question_fb_title');
     OW::getLanguage()->addKeyForJs('questions', 'users_fb_title');
 }
 public function __construct($questionId, $context, $hidden)
 {
     $service = QUESTIONS_BOL_Service::getInstance();
     $context = empty($context) ? array() : $context;
     $follows = $service->findFollows($questionId, $context, $hidden);
     $userIds = array();
     foreach ($follows as $follow) {
         $userIds[] = (int) $follow->userId;
     }
     parent::__construct($userIds);
     $this->setTemplate(OW::getPluginManager()->getPlugin('base')->getCmpViewDir() . 'floatbox_user_list.html');
 }
 private function deleteQuestion($query, $data)
 {
     if (!OW::getUser()->isAuthenticated()) {
         return array('warning' => OW::getLanguage()->text('questions', 'not_authed_delete_warning'));
     }
     $questionId = $data['questionId'];
     $question = $this->service->findQuestion($questionId);
     if (!$this->service->isCurrentUserCanEdit($question)) {
         return array();
     }
     $this->service->deleteQuestion($questionId);
     return array('message' => OW::getLanguage()->text('questions', 'question_delete_complete_msg'), 'listing' => array('loadMore' => 1));
 }
 public function initOption($countList, $optionCount = null)
 {
     if (empty($this->optionDtoList)) {
         return array();
     }
     foreach ($this->optionDtoList as $opt) {
         $this->optionIdList[] = $opt->id;
         $cmp = new QUESTIONS_CMP_Answer($opt, $this->uniqId);
         $this->optionList[$opt->id] = $cmp;
         $cmp->setDisbled(!$this->editable);
         $cmp->setIsMultiple(!$this->poll);
     }
     $checkedOptions = array();
     $optionsState = array();
     $totalAnswers = $this->answerCount;
     //$countList = $this->service->findAnswersCount($this->optionIdList);
     $answerDtoList = $this->service->findUserAnswerList($this->userId, $this->optionIdList);
     foreach ($answerDtoList as $item) {
         $checkedOptions[] = $item->optionId;
         $this->getOption($item->optionId)->setVoted();
     }
     $optionCount = empty($optionCount) ? count($this->optionDtoList) : $optionCount;
     foreach ($this->optionDtoList as $optionDto) {
         $optionId = $optionDto->id;
         $checked = in_array($optionId, $checkedOptions);
         $voteCount = $countList[$optionId];
         $users = $this->service->findAnsweredUserIdList($optionId, $this->usersContext, $checked ? 4 : 3);
         $optionsState[] = array('id' => $optionId, 'users' => $users, 'voteCount' => $voteCount, 'checked' => $checked);
         $this->getOption($optionId)->setVoteCount($voteCount);
         $this->getOption($optionId)->setUsers($users);
         $canEdit = $optionDto->userId == $this->userId && ($voteCount == 0 || $voteCount == 1 && $checked);
         $canEdit = $this->editMode || $canEdit;
         $canEdit = $this->poll ? $canEdit && $optionCount > 2 : $canEdit;
         $this->getOption($optionId)->setEditMode($canEdit);
         if ($totalAnswers) {
             $this->getOption($optionId)->setPercents($voteCount * 100 / $totalAnswers);
         }
     }
     return $optionsState;
 }
 public function __construct($questionId, $userContext = null, $count = null, $options = null)
 {
     parent::__construct();
     $language = OW::getLanguage();
     $configs = OW::getConfig()->getValues('questions');
     $count = empty($count) ? QUESTIONS_BOL_Service::MORE_DISPLAY_COUNT : $count;
     $uniqId = uniqid('question_');
     $this->assign('uniqId', $uniqId);
     $service = QUESTIONS_BOL_Service::getInstance();
     $userId = OW::getUser()->getId();
     $question = $service->findQuestion($questionId);
     if (empty($question)) {
         $this->assign('noQuestion', true);
         return;
     }
     $settings = $question->getSettings();
     $isPoll = !$settings['allowAddOprions'];
     $optionTotal = $service->findOptionCount($questionId);
     $answerCount = $service->findTotalAnswersCount($questionId);
     $postCount = BOL_CommentService::getInstance()->findCommentCount('question', $questionId);
     $isAutor = $question->userId == $userId;
     if ($optionTotal - $count < 10) {
         $count = $optionTotal;
     }
     $limit = $count ? array(0, $count) : null;
     $answers = new QUESTIONS_CMP_Answers($question, $optionTotal, $limit);
     $answers->setExpandedView();
     $answers->setSettings($options);
     if (isset($options['inPopup']) && $options['inPopup'] === true) {
         $answers->setInPopupMode();
     }
     if (isset($options['loadStatic']) && $options['loadStatic'] === false) {
         $answers->setDoNotLoadStatic();
     }
     $editable = $service->isCurrentUserCanInteract($question);
     $answers->setEditable($editable && $service->isCurrentUserCanAnswer($question));
     if ($userContext !== null) {
         $answers->setUsersContext($userContext);
     }
     $answers->showAddNew();
     $this->addComponent('answers', $answers);
     $followsCount = $service->findFollowsCount($question->id, $userContext, array($question->userId));
     $statusCmp = new QUESTIONS_CMP_QuestionStatus($answers->getUniqId(), $postCount, $answerCount, $followsCount);
     $plugin = OW::getPluginManager()->getPlugin('questions');
     $statusCmp->setTemplate($plugin->getCmpViewDir() . 'question_static_status.html');
     $this->addComponent('questionStatus', $statusCmp);
     $tplQuestion = array('text' => nl2br($question->text));
     $event = new OW_Event(QUESTIONS_BOL_Service::EVENT_ON_QUESTION_RENDER, array("questionId" => $question->id, "questionDto" => $question, "text" => $question->text, "settings" => $settings, "uniqId" => $uniqId), $tplQuestion);
     OW::getEventManager()->trigger($event);
     $this->assign('question', $event->getData());
     $js = UTIL_JsGenerator::newInstance()->newObject('question', 'QUESTIONS_Question', array($uniqId, $question->id));
     if ($configs['allow_comments']) {
         $commentsParams = new BASE_CommentsParams('questions', QUESTIONS_BOL_Service::ENTITY_TYPE);
         $commentsParams->setEntityId($question->id);
         $commentsParams->setDisplayType(BASE_CommentsParams::DISPLAY_TYPE_TOP_FORM_WITH_PAGING);
         $commentsParams->setCommentCountOnPage(5);
         $commentsParams->setOwnerId($question->userId);
         $commentsParams->setAddComment($editable);
         $commentCmp = new BASE_CMP_Comments($commentsParams);
         //$commentTemplate = OW::getPluginManager()->getPlugin('questions')->getCmpViewDir() . 'comments.html';
         //$commentCmp->setTemplate($commentTemplate);
         $this->addComponent('comments', $commentCmp);
         if (!empty($options['focusToPost'])) {
             $js->addScript('question.focusOnPostInput()');
         }
     }
     $jsSelector = 'QUESTIONS_AnswerListCollection.' . $answers->getUniqId();
     $js->addScript('question.setAnswerList(' . $jsSelector . ');');
     if (!empty($options['relation'])) {
         $js->addScript($jsSelector . '.setRelation("' . $options['relation'] . '");');
     }
     $js->equateVarables(array('QUESTIONS_QuestionColletction', $uniqId), 'question');
     OW::getDocument()->addOnloadScript($js);
     $toolbar = array();
     if ($service->isCurrentUserCanInteract($question)) {
         if ($configs['enable_follow']) {
             $this->assign('follow', array('isFollow' => $service->isFollow($userId, $question->id), 'followId' => $answers->getUniqId() . '-follow', 'unfollowId' => $answers->getUniqId() . '-unfollow', 'followClick' => $jsSelector . '.followQuestion()', 'unfollowClick' => $jsSelector . '.unfollowQuestion()'));
             /*$followLabel = $language->text('questions', 'toolbar_follow_btn');
                             $unfollowLabel = $language->text('questions', 'toolbar_unfollow_btn');
             
                             if ( $service->isFollow($userId, $question->id) )
                             {
                                 $toolbar[] = array(
                                     'label' => '<a id="' . $answers->getUniqId() . '-unfollow" href="javascript://" onclick="' .$jsSelector . '.unfollowQuestion()">' . $unfollowLabel . '</a>
                                                 <a id="' . $answers->getUniqId() . '-follow" href="javascript://" style="display: none;" onclick="' .$jsSelector . '.followQuestion()">' . $followLabel . '</a>'
                                 );
                             }
                             else
                             {
                                 $toolbar[] = array(
                                     'label' => '<a id="' . $answers->getUniqId() . '-unfollow" href="javascript://" style="display: none;" onclick="' .$jsSelector . '.unfollowQuestion()">' . $unfollowLabel . '</a>
                                                 <a id="' . $answers->getUniqId() . '-follow" href="javascript://" onclick="' .$jsSelector . '.followQuestion()">' . $followLabel . '</a>'
                                 );
                             }*/
         }
     }
     if ($isPoll) {
         $list = $service->findUserAnswerListByQuestionId($userId, $question->id);
         if (count($list)) {
             $toolbar[] = array('label' => '<a id="' . $answers->getUniqId() . '-unvote" href="javascript://" onclick="' . $jsSelector . '.unvote()">' . $language->text('questions', 'toolbar_unvote_btn') . '</a>');
         }
     }
     if ($service->isCurrentUserCanEdit($question)) {
         $condEmbed = "confirm('" . $language->text('questions', 'delete_question_confirm') . "')";
         $toolbar[] = array('label' => '<a href="javascript://" onclick="if(' . $condEmbed . ') ' . $jsSelector . '.deleteQuestion();">' . $language->text('questions', 'toolbar_delete_btn') . '</a>');
     }
     $userData = BOL_AvatarService::getInstance()->getDataForUserAvatars(array($question->userId));
     $questionInfo = array('avatar' => $userData[$question->userId], 'profileUrl' => $userData[$question->userId]['url'], 'displayName' => $userData[$question->userId]['title'], 'content' => '', 'toolbar' => $toolbar, 'date' => UTIL_DateTime::formatDate($question->timeStamp));
     $this->assign('questionInfo', $questionInfo);
 }
 public function onAnswerRemove(OW_Event $event)
 {
     $params = $event->getParams();
     $optionId = (int) $params['optionId'];
     $optionDto = QUESTIONS_BOL_Service::getInstance()->findOption($optionId);
     $activityParams = array('entityType' => QUESTIONS_BOL_Service::ENTITY_TYPE, 'entityId' => $optionDto->questionId, 'activityType' => QUESTIONS_BOL_FeedService::ACTIVITY_ANSWER, 'activityId' => $params['id']);
     $event = new OW_Event('feed.delete_activity', $activityParams);
     OW::getEventManager()->trigger($event);
 }
 public function onAnswerRemove(OW_Event $e)
 {
     $params = $e->getParams();
     $option = QUESTIONS_BOL_Service::getInstance()->findOption($params['optionId']);
     if ($option === null) {
         return;
     }
     $this->service->deleteActivity($option->questionId, QUESTIONS_BOL_FeedService::ACTIVITY_ANSWER, $params['id']);
 }
 public function onBeforeRender()
 {
     parent::onBeforeRender();
     $language = OW::getLanguage();
     $configs = OW::getConfig()->getValues('questions');
     $optionTotal = QUESTIONS_BOL_Service::getInstance()->findOptionCount($this->question->id);
     $answerCount = QUESTIONS_BOL_Service::getInstance()->findTotalAnswersCount($this->question->id);
     $postCount = BOL_CommentService::getInstance()->findCommentCount(QUESTIONS_BOL_Service::ENTITY_TYPE, $this->question->id);
     $questionUrl = OW::getRouter()->urlForRoute('questions-question', array('qid' => $this->question->id));
     $count = QUESTIONS_BOL_Service::DISPLAY_COUNT;
     if ($optionTotal - $count < 2) {
         $count = $optionTotal;
     }
     $answers = new QUESTIONS_CMP_Answers($this->question, $optionTotal, array(0, $count));
     $answers->setTotalAnswerCount($answerCount);
     $answers->setUsersContext($this->getContextUserIds());
     $bubbleActivity = $this->getBubbleActivity();
     $jsSelector = 'QUESTIONS_AnswerListCollection.' . $answers->getUniqId();
     $text = $this->getItemString($bubbleActivity, $jsSelector, $questionUrl);
     $avatars = BOL_AvatarService::getInstance()->getDataForUserAvatars(array($bubbleActivity->userId));
     $allowPopups = !isset($configs['allow_popups']) || $configs['allow_popups'];
     $features = array();
     $onClickStr = "window.location.href='{$questionUrl}'";
     if ($configs['allow_comments']) {
         if ($allowPopups) {
             $onClickStr = "return {$jsSelector}.openQuestionDelegate(true);";
         }
         $features[] = array('class' => 'q-' . $answers->getUniqId() . '-status-comments', 'iconClass' => 'ow_miniic_comment', 'label' => $postCount, 'onclick' => $onClickStr, 'string' => null);
     }
     if ($allowPopups) {
         $onClickStr = "return {$jsSelector}.openQuestionDelegate();";
     }
     $features[] = array('class' => 'q-' . $answers->getUniqId() . '-status-votes', 'iconClass' => 'questions_miniicon_check', 'label' => $answerCount, 'onclick' => $onClickStr, 'string' => null);
     if ($configs['enable_follow']) {
         $onClickStr = "OW.error('" . $language->text('questions', 'follow_not_allowed') . "')";
         $isFollowing = false;
         if (QUESTIONS_BOL_Service::getInstance()->isCurrentUserCanInteract($this->question)) {
             $userId = OW::getUser()->getId();
             $isFollowing = QUESTIONS_BOL_Service::getInstance()->isFollow($userId, $this->question->id);
             $onClickStr = $isFollowing ? $jsSelector . '.unfollowQuestion();' : $jsSelector . '.followQuestion();';
         } else {
             if (OW::getUser()->isAuthenticated()) {
                 $isFollowing = QUESTIONS_BOL_Service::getInstance()->isFollow($userId, $this->question->id);
                 if ($isFollowing) {
                     $onClickStr = $jsSelector . '.unfollowQuestion();';
                 }
             }
         }
         $features[] = array('class' => 'q-' . $answers->getUniqId() . '-status-follows', 'iconClass' => 'questions_miniic_follow', 'label' => QUESTIONS_BOL_Service::getInstance()->findFollowsCount($this->question->id), 'onclick' => $onClickStr, 'active' => $isFollowing);
     }
     $settings = $this->question->getSettings();
     $context = empty($settings['context']['url']) || empty($settings['context']['label']) ? null : array('url' => $settings['context']['url'], 'label' => $settings['context']['label']);
     $tplQuestion = array('questionId' => $this->question->id, 'uniqId' => $this->getUniqId(), 'text' => $text, 'timeStamp' => UTIL_DateTime::formatDate($bubbleActivity->timeStamp), 'lastItem' => $this->lastItem, 'answers' => $answers->render(), 'avatar' => $avatars[$bubbleActivity->userId], 'settings' => $settings, 'context' => $context, 'features' => $features, 'permalink' => $questionUrl);
     $event = new OW_Event(QUESTIONS_BOL_Service::EVENT_ON_LIST_ITEM_RENDER, array("questionId" => $this->question->id, "questionDto" => $this->question, "text" => $text, "settings" => $settings, "uniqId" => $this->getUniqId()), $tplQuestion);
     OW::getEventManager()->trigger($event);
     $this->assign('item', $event->getData());
 }