Exemplo n.º 1
0
 /**
  * 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();
 }
Exemplo n.º 2
0
 /**
  * Add a single tag to the entry
  *
  * @return  boolean
  */
 public function addTag($tag = null, $user_id = 0, $admin = 0)
 {
     $cloud = new Tags($this->get('id'));
     return $cloud->add($tag, $user_id, $admin);
 }
Exemplo n.º 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();
 }
Exemplo n.º 4
0
 /**
  * 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;
 }