/** * Get module contents * * @return void */ public function run() { $this->cssId = $this->params->get('cssId'); $this->cssClass = $this->params->get('cssClass'); $this->tag = Request::getVar('tag', '', 'get'); $this->style = Request::getVar('style', '', 'get'); require_once Component::path('com_answers') . DS . 'models' . DS . 'question.php'; $records = Question::all(); switch ($this->params->get('state', 'open')) { case 'open': $records->whereEquals('state', 0); break; case 'closed': $records->whereEquals('state', 1); break; case 'both': default: $records->where('state', '<', 2); break; } if ($this->tag) { $cloud = new Tags(); $tags = $cloud->parse($this->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); } $this->rows = $records->limit(intval($this->params->get('limit', 5)))->ordered()->rows(); require $this->getLayoutPath(); }
/** * 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(); }
/** * Build a query from filters * * @param array $filters Filters to build query from * @return string SQL */ public function buildQuery($filters = array()) { if (!isset($filters['tag'])) { $filters['tag'] = ''; } // build body of query $query = ""; if ($filters['tag']) { $query .= "FROM {$this->_tbl} AS C"; if (isset($filters['count'])) { $query .= " JOIN #__tags_object AS RTA ON RTA.objectid=C.id AND RTA.tbl='answers' "; } else { $query .= ", #__tags_object AS RTA "; } $query .= "INNER JOIN #__tags AS TA ON TA.id=RTA.tagid "; } else { $query .= "FROM {$this->_tbl} AS C "; } $query .= ", #__users AS U "; switch ($filters['filterby']) { case 'mine': $query .= "WHERE C.state!=2 "; $filters['mine'] = 1; break; case 'all': $query .= "WHERE C.state!=2 "; break; case 'closed': $query .= "WHERE C.state=1 "; break; case 'open': $query .= "WHERE C.state=0 "; break; case 'none': $query .= "WHERE 1=2 "; break; default: $query .= "WHERE C.state!=2 "; break; } $query .= "AND U.id=C.created_by "; if (isset($filters['q']) && $filters['q'] != '') { $words = explode(' ', $filters['q']); foreach ($words as $word) { $word = $this->_db->quote('%' . strtolower($word) . '%'); $query .= "AND ((LOWER(C.subject) LIKE {$word})\n\t\t\t\t\tOR (LOWER(C.question) LIKE {$word})\n\t\t\t\t\tOR (SELECT COUNT(*) FROM #__answers_responses AS a WHERE a.state!=2 AND a.question_id=C.id AND (LOWER(a.answer) LIKE {$word})) > 0)"; } } if (isset($filters['mine']) && $filters['mine'] != 0) { $query .= " AND C.created_by=" . $this->_db->quote(User::get('id')) . " "; } if (isset($filters['mine']) && $filters['mine'] == 0) { $query .= " AND C.created_by!=" . $this->_db->quote(User::get('id')) . " "; } if (isset($filters['created_before']) && $filters['created_before'] != '') { $query .= " AND C.created <= " . $this->_db->quote($filters['created_before']) . " "; } if ($filters['tag']) { include_once dirname(__DIR__) . DS . 'models' . DS . 'tags.php'; $cloud = new Tags(); $tags = $cloud->parse($filters['tag']); $query .= "AND (\n\t\t\t\t\t\t\tRTA.objectid=C.id\n\t\t\t\t\t\t\tAND RTA.tbl='answers'\n\t\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\t\tTA.tag IN ('" . implode("','", $tags) . "') OR TA.raw_tag IN ('" . implode("','", $tags) . "')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)"; if (!isset($filters['count'])) { $query .= " GROUP BY C.id "; } } if (!isset($filters['count']) || !$filters['count']) { $sortdir = isset($filters['sort_Dir']) ? $filters['sort_Dir'] : 'DESC'; $sortdir = $sortdir == 'DESC' ? 'DESC' : 'ASC'; switch ($filters['sortby']) { case 'rewards': $query .= " ORDER BY points {$sortdir}, C.created {$sortdir}"; break; case 'votes': $query .= " ORDER BY C.helpful {$sortdir}, C.created {$sortdir}"; break; case 'date': $query .= " ORDER BY C.created {$sortdir}"; break; case 'random': $query .= " ORDER BY RAND()"; break; case 'responses': $query .= " ORDER BY rcount DESC, C.reward DESC, points DESC, C.state ASC, C.created DESC"; break; case 'status': $query .= " ORDER BY C.reward DESC, points DESC, C.state ASC, C.created DESC"; break; case 'withinplugin': $query .= " ORDER BY C.reward DESC, points DESC, C.state ASC, C.created DESC"; break; default: if (isset($filters['sort'])) { $filters['sort_Dir'] = isset($filters['sort_Dir']) ? $filters['sort_Dir'] : 'DESC'; $query .= " ORDER BY " . $filters['sort'] . " " . $filters['sort_Dir']; } else { $query .= " "; } break; } } return $query; }