/** * 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; }
/** * 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; }
/** * 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(); }
/** * 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(); }