/** * Advanced search. * @return ActiveDataProvider */ public function searchAdvanced() { if ($this->type == 'topics') { $query = Thread::find(); if (Yii::$app->user->isGuest) { $query->joinWith(['category' => function ($q) { $q->andWhere([Category::tableName() . '.visible' => 1]); }, 'forum' => function ($q) { $q->andWhere([Forum::tableName() . '.visible' => 1]); }]); } if (!empty($this->query)) { $words = explode(' ', preg_replace('/\\s+/', ' ', $this->query)); foreach ($words as $word) { if ($this->match == 'all') { $query->andWhere(['like', 'name', $word]); } else { $query->orWhere(['like', 'name', $word]); } } } if (!empty($this->author)) { $query->andWhere(['like', 'username', $this->author])->joinWith(['author']); } if (!empty($this->date_from) && empty($this->date_to)) { $query->andWhere(['>=', Thread::tableName() . '.created_at', $this->date_from]); } elseif (!empty($this->date_to) && empty($this->date_from)) { $this->date_to += 23 * 3600 + 59 * 60 + 59; // 23:59:59 $query->andWhere(['<=', Thread::tableName() . '.created_at', $this->date_to]); } elseif (!empty($this->date_to) && !empty($this->date_from)) { if ($this->date_from > $this->date_to) { $tmp = $this->date_to; $this->date_to = $this->date_from; $this->date_from = $tmp; } $this->date_to += 23 * 3600 + 59 * 60 + 59; // 23:59:59 $query->andWhere(['<=', Thread::tableName() . '.created_at', $this->date_to]); $query->andWhere(['>=', Thread::tableName() . '.created_at', $this->date_from]); } if (!empty($this->forums)) { if (is_array($this->forums)) { $forums = []; foreach ($this->forums as $f) { if (is_numeric($f)) { $forums[] = (int) $f; } } if (!empty($forums)) { $query->andWhere(['forum_id' => $forums]); } } } $sort = ['defaultOrder' => [Thread::tableName() . '.id' => SORT_DESC], 'attributes' => [Thread::tableName() . '.id' => ['asc' => [Thread::tableName() . '.id' => SORT_ASC], 'desc' => [Thread::tableName() . '.id' => SORT_DESC], 'default' => SORT_DESC]]]; } else { $query = Vocabulary::find()->select('post_id, thread_id'); if (Yii::$app->user->isGuest) { $query->joinWith(['posts' => function ($q) { $q->joinWith(['forum' => function ($qu) { $qu->andWhere([Forum::tableName() . '.visible' => 1])->joinWith(['category' => function ($que) { $que->andWhere([Category::tableName() . '.visible' => 1]); }]); }]); }]); } else { $query->joinWith(['posts']); } if (!empty($this->query)) { $words = explode(' ', preg_replace('/\\s+/', ' ', $this->query)); $countWords = 0; foreach ($words as $word) { $query->orWhere(['like', 'word', $word]); $countWords++; } $query->groupBy('post_id'); if ($this->match == 'all' && $countWords > 1) { $query->select(['post_id', 'thread_id', 'COUNT(post_id) AS c'])->having(['>', 'c', $countWords - 1]); } } if (!empty($this->author)) { $query->andWhere(['like', 'username', $this->author])->joinWith(['posts' => function ($q) { $q->joinWith(['user']); }]); } if (!empty($this->date_from) && empty($this->date_to)) { $query->andWhere(['>=', Post::tableName() . '.updated_at', $this->date_from]); } elseif (!empty($this->date_to) && empty($this->date_from)) { $this->date_to += 23 * 3600 + 59 * 60 + 59; // 23:59:59 $query->andWhere(['<=', Post::tableName() . '.updated_at', $this->date_to]); } elseif (!empty($this->date_to) && !empty($this->date_from)) { if ($this->date_from > $this->date_to) { $tmp = $this->date_to; $this->date_to = $this->date_from; $this->date_from = $tmp; } $this->date_to += 23 * 3600 + 59 * 60 + 59; // 23:59:59 $query->andWhere(['<=', Post::tableName() . '.updated_at', $this->date_to]); $query->andWhere(['>=', Post::tableName() . '.updated_at', $this->date_from]); } if (!empty($this->forums)) { if (is_array($this->forums)) { $forums = []; foreach ($this->forums as $f) { if (is_numeric($f)) { $forums[] = (int) $f; } } if (!empty($forums)) { $query->andWhere(['forum_id' => $forums]); } } } $sort = ['defaultOrder' => ['post_id' => SORT_DESC], 'attributes' => ['post_id' => ['asc' => ['post_id' => SORT_ASC], 'desc' => ['post_id' => SORT_DESC], 'default' => SORT_DESC]]]; } $dataProvider = new ActiveDataProvider(['query' => $query, 'sort' => $sort]); return $dataProvider; }
/** * Updates tag words. * @throws Exception */ protected function _updateWords() { try { $vocabulary = []; $allWords = $this->_prepareWords(); $this->_addNewWords($allWords); $query = (new Query())->from(Vocabulary::tableName())->where(['word' => $allWords]); foreach ($query->each() as $vocabularyNew) { $vocabulary[$vocabularyNew['id']] = [$vocabularyNew['id'], $this->id]; } if (!empty($vocabulary)) { Yii::$app->db->createCommand()->batchInsert('{{%podium_vocabulary_junction}}', ['word_id', 'post_id'], array_values($vocabulary))->execute(); } $query = (new Query())->from('{{%podium_vocabulary_junction}}')->where(['post_id' => $this->id]); foreach ($query->each() as $junk) { if (!array_key_exists($junk['word_id'], $vocabulary)) { Yii::$app->db->createCommand()->delete('{{%podium_vocabulary_junction}}', ['id' => $junk['id']])->execute(); } } } catch (Exception $e) { Log::error($e->getMessage(), null, __METHOD__); throw $e; } }
/** * Searching through the forum. * @return string */ public function actionSearch() { $dataProvider = null; $searchModel = new Vocabulary(); if ($searchModel->load(Yii::$app->request->get(), '')) { $dataProvider = $searchModel->search(); } else { $model = new SearchForm(); $model->match = 'all'; $model->type = 'posts'; $model->display = 'topics'; $categories = Category::find()->orderBy(['name' => SORT_ASC])->all(); $forums = Forum::find()->orderBy(['name' => SORT_ASC])->all(); $list = []; foreach ($categories as $cat) { $catlist = []; foreach ($forums as $for) { if ($for->category_id == $cat->id) { $catlist[$for->id] = '|-- ' . Html::encode($for->name); } } $list[Html::encode($cat->name)] = $catlist; } if ($model->load(Yii::$app->request->post()) && $model->validate()) { if (empty($model->query) && empty($model->author)) { $this->error(Yii::t('podium/flash', "You have to enter words or author's name first.")); } else { $stop = false; if (!empty($model->query)) { $words = explode(' ', preg_replace('/\\s+/', ' ', $model->query)); $checkedWords = []; foreach ($words as $word) { if (mb_strlen($word, 'UTF-8') > 2) { $checkedWords[] = $word; } } $model->query = implode(' ', $checkedWords); if (mb_strlen($model->query, 'UTF-8') < 3) { $this->error(Yii::t('podium/flash', 'You have to enter word at least 3 characters long.')); $stop = true; } } if (!$stop) { $dataProvider = $model->searchAdvanced(); } } } return $this->render('search', ['model' => $model, 'list' => $list, 'dataProvider' => $dataProvider, 'query' => $model->query, 'author' => $model->author]); } return $this->render('search', ['dataProvider' => $dataProvider, 'query' => $searchModel->query]); }