Пример #1
0
 /**
  * Retrieves a user's questions
  *
  * @param   string  $kind       The kind of results to retrieve
  * @param   array   $interests  Array of tags
  * @return  array   Database results
  */
 private function _getQuestions($kind = 'open', $interests = array())
 {
     // Get some classes we need
     require_once Component::path('com_answers') . DS . 'models' . DS . 'question.php';
     require_once Component::path('com_answers') . DS . 'helpers' . DS . 'economy.php';
     $limit = intval($this->params->get('limit', 10));
     $tags = null;
     $records = \Components\Answers\Models\Question::all()->including(['responses', function ($response) {
         $response->select('id')->select('question_id');
     }])->whereEquals('state', 0);
     if ($kind == 'mine') {
         $records->whereEquals('created_by', User::get('id'));
     }
     if ($kind == 'interest') {
         $tags = count($interests) <= 0 ? $this->_getInterests() : $interests;
     }
     if ($kind == 'assigned') {
         require_once Component::path('com_tools') . DS . 'tables' . DS . 'author.php';
         $database = \App::get('db');
         $TA = new \Components\Tools\Tables\Author($database);
         $tools = $TA->getToolContributions(User::get('id'));
         if ($tools) {
             foreach ($tools as $tool) {
                 $tags .= 'tool' . $tool->toolname . ',';
             }
             $tags = rtrim($tags, ',');
         }
     }
     if ($tags) {
         $cloud = new \Components\Answers\Models\Tags();
         $tags = $cloud->parse($tags);
         $records->select('#__answers_questions.*')->join('#__tags_object', '#__tags_object.objectid', '#__answers_questions.id')->join('#__tags', '#__tags.id', '#__tags_object.tagid')->whereEquals('#__tags_object.tbl', 'answers')->whereIn('#__tags.tag', $tags);
     }
     $data = $records->limit($limit)->ordered()->rows();
     $results = array();
     foreach ($data as $datum) {
         $datum->set('rcount', $datum->responses->count());
         $results[] = $datum;
     }
     if ($this->banking && $results) {
         $database = \App::get('db');
         $AE = new \Components\Answers\Helpers\Economy($database);
         $awards = array();
         foreach ($results as $result) {
             // Calculate max award
             $result->set('marketvalue', round($AE->calculate_marketvalue($result->get('id'), 'maxaward')));
             $result->set('maxaward', round(2 * ($result->get('marketvalue', 0) / 3)));
             if ($kind != 'mine') {
                 $result->set('maxaward', $result->get('maxaward') + $result->get('reward'));
             }
             $awards[] = $result->get('maxaward', 0);
         }
         // re-sort by max reponses
         array_multisort($awards, SORT_DESC, $results);
     }
     return $results;
 }
Пример #2
0
 /**
  * Retrieves a user's questions
  *
  * @param   string  $kind       The kind of results to retrieve
  * @param   array   $interests  Array of tags
  * @return  array   Database results
  */
 private function _getQuestions($kind = 'open', $interests = array())
 {
     $database = \App::get('db');
     // Get some classes we need
     require_once Component::path('com_answers') . DS . 'models' . DS . 'question.php';
     require_once Component::path('com_answers') . DS . 'tables' . DS . 'response.php';
     require_once Component::path('com_answers') . DS . 'tables' . DS . 'log.php';
     require_once Component::path('com_answers') . DS . 'tables' . DS . 'questionslog.php';
     require_once Component::path('com_answers') . DS . 'helpers' . DS . 'economy.php';
     $aq = new \Components\Answers\Tables\Question($database);
     if ($this->banking) {
         $AE = new \Components\Answers\Helpers\Economy($database);
         $BT = new \Hubzero\Bank\Transaction($database);
     }
     $params =& $this->params;
     $moduleclass = $params->get('moduleclass');
     $limit = intval($params->get('limit', 10));
     $limit = $limit ? $limit : 10;
     $filters = array('limit' => $limit, 'start' => 0, 'tag' => '', 'filterby' => 'open', 'sortby' => 'date');
     switch ($kind) {
         case 'mine':
             $filters['mine'] = 1;
             $filters['sortby'] = 'responses';
             break;
         case 'assigned':
             $filters['mine'] = 0;
             require_once Component::path('com_tools') . DS . 'tables' . DS . 'author.php';
             $TA = new \Components\Tools\Tables\Author($database);
             $tools = $TA->getToolContributions(User::get('id'));
             if ($tools) {
                 foreach ($tools as $tool) {
                     $filters['tag'] .= 'tool' . $tool->toolname . ',';
                 }
             }
             if (!$filters['tag']) {
                 $filters['filterby'] = 'none';
             }
             break;
         case 'interest':
             $filters['mine'] = 0;
             $interests = count($interests) <= 0 ? $this->_getInterests() : $interests;
             $filters['filterby'] = !$interests ? 'none' : 'open';
             $filters['tag'] = $interests;
             break;
     }
     $results = $aq->getResults($filters);
     if ($this->banking && $results) {
         $awards = array();
         foreach ($results as $result) {
             // Calculate max award
             $result->marketvalue = round($AE->calculate_marketvalue($result->id, 'maxaward'));
             $result->maxaward = round(2 * ($result->marketvalue / 3));
             if ($kind != 'mine') {
                 $result->maxaward = $result->maxaward + $result->reward;
             }
             $awards[] = $result->maxaward ? $result->maxaward : 0;
         }
         // re-sort by max reponses
         array_multisort($awards, SORT_DESC, $results);
     }
     foreach ($results as $k => $result) {
         $results[$k] = new \Components\Answers\Models\Question($result);
     }
     return $results;
 }
Пример #3
0
 /**
  * Search entries
  *
  * @return  void
  */
 public function searchTask()
 {
     // Incoming
     $filters = array('limit' => Request::getInt('limit', Config::get('list_limit')), 'start' => Request::getInt('limitstart', 0), 'tag' => Request::getVar('tags', ''), 'search' => Request::getVar('q', ''), 'filterby' => Request::getWord('filterby', ''), 'sortby' => Request::getWord('sortby', 'date'), 'sort_Dir' => strtolower(Request::getWord('sortdir', 'desc')), 'area' => Request::getVar('area', ''));
     // Validate inputs
     $filters['tag'] = $filters['tag'] ? $filters['tag'] : Request::getVar('tag', '');
     if ($filters['filterby'] && !in_array($filters['filterby'], array('open', 'closed'))) {
         $filters['filterby'] = '';
     }
     if (!in_array($filters['sortby'], array('date', 'votes', 'rewards'))) {
         $filters['sortby'] = 'date';
     }
     if (!in_array($filters['sort_Dir'], array('desc', 'asc'))) {
         $filters['sort_Dir'] = 'desc';
     }
     if ($filters['area'] && !in_array($filters['area'], array('mine', 'assigned', 'interest'))) {
         $filters['area'] = '';
     }
     // Get questions of interest
     // @TODO: Remove reference to members. Add getTags() to user?
     if ($filters['area'] == 'interest') {
         require_once PATH_CORE . DS . 'components' . DS . 'com_members' . DS . 'models' . DS . 'tags.php';
         // Get tags of interest
         $mt = new \Components\Members\Models\Tags(User::get('id'));
         $filters['tag'] = $mt->render('string');
     }
     // Get assigned questions
     // @TODO: Remove reference to tools. Turn into an event call?
     if ($filters['area'] == 'assigned') {
         require_once PATH_CORE . DS . 'components' . DS . 'com_tools' . DS . 'tables' . DS . 'author.php';
         // What tools did this user contribute?
         $db = App::get('db');
         $TA = new \Components\Tools\Tables\Author($db);
         $tools = $TA->getToolContributions(User::get('id'));
         $mytooltags = array();
         if ($tools) {
             foreach ($tools as $tool) {
                 $mytooltags[] = 'tool' . $tool->toolname;
             }
         }
         $filters['tag'] = implode(',', $mytooltags);
     }
     $records = Question::all()->including(['responses', function ($response) {
         $response->select('id')->select('question_id')->where('state', '!=', Question::STATE_DELETED);
     }]);
     if ($filters['tag'] || $filters['area'] == 'interest' || $filters['area'] == 'assigned') {
         $cloud = new Tags();
         $tags = $cloud->parse($filters['tag']);
         $records->select('#__answers_questions.*')->join('#__tags_object', '#__tags_object.objectid', '#__answers_questions.id')->join('#__tags', '#__tags.id', '#__tags_object.tagid')->whereEquals('#__tags_object.tbl', 'answers')->whereIn('#__tags.tag', $tags);
     }
     if ($filters['search']) {
         $filters['search'] = strtolower((string) $filters['search']);
         $records->whereLike('subject', $filters['search'], 1)->orWhereLike('question', $filters['search'], 1)->resetDepth();
     }
     if ($filters['filterby'] == 'open') {
         $records->whereEquals('state', 0);
     }
     if ($filters['filterby'] == 'closed') {
         $records->whereEquals('state', 1);
     }
     if (!$filters['filterby'] || $filters['filterby'] == 'both') {
         $records->where('state', '<', Question::STATE_DELETED);
     }
     if ($filters['area'] == 'mine') {
         $records->whereEquals('created_by', User::get('id'));
     }
     switch ($filters['sortby']) {
         case 'rewards':
             $order = 'reward';
             break;
         case 'votes':
             $order = 'helpful';
             break;
         case 'date':
         default:
             $order = 'created';
             break;
     }
     $results = $records->order($order, $filters['sort_Dir'])->paginated()->rows();
     // Output HTML
     $this->view->setError($this->getErrors())->set('results', $results)->set('filters', $filters)->set('config', $this->config)->setLayout('search')->display();
 }
Пример #4
0
 /**
  * Search entries
  *
  * @return     void
  */
 public function searchTask()
 {
     $this->view->config = $this->config;
     $this->view->task = $this->_task;
     // Incoming
     $this->view->filters = array('limit' => Request::getInt('limit', Config::get('list_limit')), 'start' => Request::getInt('limitstart', 0), 'tag' => Request::getVar('tags', ''), 'q' => Request::getVar('q', ''), 'filterby' => Request::getWord('filterby', ''), 'sortby' => Request::getWord('sortby', 'date'), 'sort_Dir' => Request::getWord('sortdir', 'DESC'), 'area' => Request::getVar('area', ''));
     // Validate inputs
     $this->view->filters['tag'] = $this->view->filters['tag'] ? $this->view->filters['tag'] : Request::getVar('tag', '');
     if ($this->view->filters['filterby'] && !in_array($this->view->filters['filterby'], array('open', 'closed'))) {
         $this->view->filters['filterby'] = '';
     }
     if (!in_array($this->view->filters['sortby'], array('date', 'votes', 'rewards'))) {
         $this->view->filters['sortby'] = 'date';
     }
     if ($this->view->filters['area'] && !in_array($this->view->filters['area'], array('mine', 'assigned', 'interest'))) {
         $this->view->filters['area'] = '';
     }
     // Get questions of interest
     if ($this->view->filters['area'] == 'interest') {
         require_once PATH_CORE . DS . 'components' . DS . 'com_members' . DS . 'models' . DS . 'tags.php';
         // Get tags of interest
         $mt = new \Components\Members\Models\Tags(User::get('id'));
         $mytags = $mt->render('string');
         $this->view->filters['tag'] = $this->view->filters['tag'] ? $this->view->filters['tag'] : $mytags;
         $this->view->filters['mine'] = 0;
     }
     // Get assigned questions
     if ($this->view->filters['area'] == 'assigned') {
         require_once PATH_CORE . DS . 'components' . DS . 'com_tools' . DS . 'tables' . DS . 'author.php';
         // What tools did this user contribute?
         $TA = new \Components\Tools\Tables\Author($this->database);
         $tools = $TA->getToolContributions(User::get('id'));
         $mytooltags = array();
         if ($tools) {
             foreach ($tools as $tool) {
                 $mytooltags[] = 'tool' . $tool->toolname;
             }
         }
         $this->view->filters['tag'] = $this->view->filters['tag'] ? $this->view->filters['tag'] : implode(',', $mytooltags);
         $this->view->filters['mine'] = 0;
     }
     if ($this->view->filters['area'] == 'mine') {
         $this->view->filters['mine'] = 1;
     }
     // Instantiate a Questions object
     $aq = new Tables\Question($this->database);
     if (($this->view->filters['area'] == 'interest' || $this->view->filters['area'] == 'assigned') && !$this->view->filters['tag']) {
         // Get a record count
         $this->view->total = 0;
         // Get records
         $this->view->results = array();
     } else {
         // Get a record count
         $this->view->total = $aq->getCount($this->view->filters);
         // Get records
         $this->view->results = $aq->getResults($this->view->filters);
     }
     // Did we get any results?
     if (count($this->view->results) > 0) {
         // Do some processing on the results
         foreach ($this->view->results as $i => $result) {
             $this->view->results[$i] = new Question($result);
         }
     }
     // Set the page title
     $this->_buildTitle();
     // Set the pathway
     $this->_buildPathway();
     // Output HTML
     foreach ($this->getErrors() as $error) {
         $this->view->setError($error);
     }
     $this->view->setLayout('search')->display();
 }