/** * Creates data provider instance with search query applied * * @param array $params * * @return ActiveDataProvider */ public function search($params) { $query = Vote::find(); $voteTable = Vote::tableName(); // set up query with relation to `user.username` $user = Yii::$app->getModule("user")->model("User"); $userTable = $user::tableName(); $query->joinWith(['user' => function ($query) use($userTable) { $query->from(['user' => $userTable]); }]); $dataProvider = new ActiveDataProvider(['query' => $query]); // enable sorting for the related columns $addSortAttributes = ["user.username"]; foreach ($addSortAttributes as $addSortAttribute) { $dataProvider->sort->attributes[$addSortAttribute] = ['asc' => [$addSortAttribute => SORT_ASC], 'desc' => [$addSortAttribute => SORT_DESC]]; } if (!($this->load($params) && $this->validate())) { return $dataProvider; } $query->andFilterWhere(["{$voteTable}.id" => $this->id, 'vote' => $this->vote, 'voteable_id' => $this->voteable_id, 'user_id' => $this->user_id, 'ip_address' => $this->ip_address]); $createdTime = strtotime($this->created_at); $startDay = date("Y-m-d 00:00:00", $createdTime); $endDay = date("Y-m-d 00:00:00", $createdTime + 60 * 60 * 24); if ($this->created_at) { $query->andFilterWhere(['between', 'created_at', $startDay, $endDay]); } $query->andFilterWhere(['like', 'voteable_type', $this->voteable_type])->andFilterWhere(['like', 'user.username', $this->getAttribute('user.username')]); return $dataProvider; }
/** * Add a new vote * @param integer $id * @param string $type * @param integer $vote * @return mixed */ public function actionVote($id, $type, $vote = 1) { if (!Yii::$app->user->isGuest) { $voteModel = Vote::find()->where(['voteable_type' => $type, 'voteable_id' => $id, 'user_id' => Yii::$app->user->id])->one(); if (!isset($voteModel->id)) { $voteModel = new Vote(); $voteModel->voteable_type = $type; $voteModel->voteable_id = $id; $voteModel->user_id = Yii::$app->user->id; } elseif ($voteModel->vote == $vote) { $out = ['success' => false, 'error' => 'User has already voted']; echo Json::encode($out); return; } $voteModel->vote = $vote; if ($voteModel->save()) { $rating = Vote::getRating($id, $type); $out = ['success' => true, 'rating' => $rating]; } else { $out = ['success' => false, 'error' => $voteModel->getErrors()]; } } else { $out = ['success' => false, 'error' => 'User is guest']; } echo Json::encode($out); }
public function actionIndex() { \Yii::$app->response->format = Response::FORMAT_JSON; $userId = \Yii::$app->user->id; $id = \Yii::$app->request->get('id'); $type = \Yii::$app->request->get('type', 'article'); $action = \Yii::$app->request->get('action', 'up'); if ($type == 'article') { $model = Article::find()->where(['id' => $id])->select('id,up,down')->one(); } else { $model = Comment::find()->where(['id' => $id])->select('id,up,down')->one(); } $vote = Vote::find()->where(['type_id' => $id, 'type' => $type, 'action' => $action, 'user_id' => $userId])->one(); if (empty($vote)) { $model->{$action} += 1; $model->save(false); $vote = new Vote(); $params = ['type' => $type, 'action' => $action, 'type_id' => $id, 'user_id' => $userId]; $vote->attributes = $params; $vote->save(); } return ['up' => $model->up, 'down' => $model->down]; }