b82db04a
Yarik
test
|
1
2
3
|
<?php
namespace common\modules\comment\models;
|
83b0052c
Yarik
test
|
4
|
use common\models\User;
|
4ed1f788
Yarik
test
|
5
|
use yii\db\ActiveQuery;
|
0c0cdc9d
Yarik
test
|
6
|
use yii\helpers\Url;
|
4ed1f788
Yarik
test
|
7
|
|
b82db04a
Yarik
test
|
8
9
|
/**
* Class Comment
|
2d107e9e
Yarik
test
|
10
11
|
* @property bool $guestComment
* @property integer $comment_id
|
2fd40ee7
Yarik
test
|
12
13
14
15
16
17
18
19
20
21
22
|
* @property string $text
* @property int $user_id
* @property string $user_name
* @property string $user_email
* @property int $comment_pid
* @property int $status
* @property string $date_add
* @property string $date_update
* @property string $date_delete
* @property string $model
* @property int $model_id
|
83b0052c
Yarik
test
|
23
24
|
* @property Rating $rating
* @property User $user
|
b82db04a
Yarik
test
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
* @package common\modules\comment\models
*/
class Comment extends \yii\db\ActiveRecord
implements \common\modules\comment\interfaces\CommentInterface
{
const STATUS_HIDDEN = 0;
const STATUS_DELETED = 2;
const STATUS_ACTIVE = 1;
const STATUS_PERSONAL = 3;
const SCENARIO_USER = 'user';
const SCENARIO_GUEST = 'guest';
|
2d107e9e
Yarik
test
|
39
40
41
42
43
|
/**
* @var bool
*/
public $guestComment = true;
|
0c0cdc9d
Yarik
test
|
44
45
|
public $buttons = [ ];
|
b82db04a
Yarik
test
|
46
47
48
49
|
public function rules()
{
return [
[
|
2d107e9e
Yarik
test
|
50
51
52
53
54
|
[
'text',
'user_name',
'user_email',
],
|
b82db04a
Yarik
test
|
55
56
57
|
'required',
],
[
|
2d107e9e
Yarik
test
|
58
59
60
61
62
63
64
|
[
'rating',
],
'safe',
],
[
[ 'user_email' ],
|
b82db04a
Yarik
test
|
65
66
67
|
'email',
],
[
|
2d107e9e
Yarik
test
|
68
|
[ 'user_name' ],
|
b82db04a
Yarik
test
|
69
70
|
'string',
],
|
2d107e9e
Yarik
test
|
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
[
[
'comment_id',
'comment_pid',
],
'integer',
],
[
[ 'status' ],
'default',
'value' => 1,
],
[
[ 'comment_pid' ],
'exist',
'targetAttribute' => 'comment_id',
'filter' => [
|
2fd40ee7
Yarik
test
|
88
89
|
'model' => $this->model,
'model_id' => $this->model_id,
|
2d107e9e
Yarik
test
|
90
91
|
],
],
|
b82db04a
Yarik
test
|
92
93
94
95
96
97
|
];
}
public function scenarios()
{
return [
|
2d107e9e
Yarik
test
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
self::SCENARIO_GUEST => [
'user_name',
'user_email',
'text',
'comment_pid',
],
self::SCENARIO_USER => [
'text',
'comment_pid',
],
];
}
/**
* @inheritdoc
*/
public function behaviors()
{
return [
[
'class' => \yii\behaviors\TimestampBehavior::className(),
'createdAtAttribute' => 'date_add',
'updatedAtAttribute' => 'date_update',
'value' => new \yii\db\Expression('NOW()'),
],
|
b82db04a
Yarik
test
|
123
124
125
|
];
}
|
83b0052c
Yarik
test
|
126
127
128
129
130
131
132
133
134
135
136
137
138
|
public function afterSave($insert, $changedAttributes)
{
if($this->model == User::className()) {
if($user = User::findOne($this->model_id)) {
/**
* @var User $user
*/
$user->updateRating();
}
}
parent::afterSave($insert, $changedAttributes);
}
|
fdc1c9de
Yarik
test
|
139
140
141
|
/**
* @inheritdoc
*/
|
b82db04a
Yarik
test
|
142
143
144
145
146
147
148
149
150
151
152
|
public static function tableName()
{
return '{{%comment}}';
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
|
2d107e9e
Yarik
test
|
153
154
|
'text' => \Yii::t('app', 'Комментарий'),
'user_name' => \Yii::t('app', 'Имя'),
|
b82db04a
Yarik
test
|
155
156
157
158
|
'user_email' => \Yii::t('app', 'Email'),
];
}
|
2d107e9e
Yarik
test
|
159
160
161
162
163
164
|
public function getGuestComment()
{
return $this->guestComment;
}
public function setGuestComment($value)
|
b82db04a
Yarik
test
|
165
|
{
|
2d107e9e
Yarik
test
|
166
|
$this->guestComment = $value;
|
b82db04a
Yarik
test
|
167
168
|
}
|
4ed1f788
Yarik
test
|
169
|
/**
|
2fd40ee7
Yarik
test
|
170
171
|
* @param string $model
* @param integer $model_id
|
4ed1f788
Yarik
test
|
172
173
174
|
*
* @return ActiveQuery
*/
|
2fd40ee7
Yarik
test
|
175
|
public function getComments($model, $model_id)
|
b82db04a
Yarik
test
|
176
|
{
|
2d107e9e
Yarik
test
|
177
178
|
return $this->find()
->where([
|
2fd40ee7
Yarik
test
|
179
180
181
|
'comment.model' => $model,
'comment.model_id' => $model_id,
'comment.status' => 1,
|
0c0cdc9d
Yarik
test
|
182
183
|
])
->with('rating');
|
b82db04a
Yarik
test
|
184
185
|
}
|
2d107e9e
Yarik
test
|
186
|
public function postComment()
|
b82db04a
Yarik
test
|
187
|
{
|
2d107e9e
Yarik
test
|
188
189
190
191
192
193
194
|
if($this->checkCreate()) {
if($this->insert()) {
$this->clearSafe();
return true;
} else {
return false;
}
|
b82db04a
Yarik
test
|
195
|
} else {
|
2d107e9e
Yarik
test
|
196
|
$this->addError('comment_id', 'You can`t post comment here');
|
b82db04a
Yarik
test
|
197
198
199
200
|
return false;
}
}
|
2d107e9e
Yarik
test
|
201
|
public function updateComment()
|
b82db04a
Yarik
test
|
202
|
{
|
2d107e9e
Yarik
test
|
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
|
if($this->checkUpdate()) {
if(empty( $this->comment_id )) {
$this->addError('comment_id', 'Comment ID not found');
return false;
} else {
if($this->update()) {
$this->clearSafe();
return true;
} else {
return false;
}
}
} else {
$this->addError('comment_id', 'You can`t update this post');
return false;
}
|
b82db04a
Yarik
test
|
219
220
|
}
|
2d107e9e
Yarik
test
|
221
|
public function deleteComment()
|
b82db04a
Yarik
test
|
222
|
{
|
2d107e9e
Yarik
test
|
223
224
225
226
227
|
if($this->checkDelete()) {
if(empty( $this->comment_id )) {
$this->addError('comment_id', 'Comment ID not found');
return false;
} else {
|
0c0cdc9d
Yarik
test
|
228
229
230
231
232
233
234
|
if($this->user_id == \Yii::$app->user->id) {
if($this->delete()) {
return true;
} else {
$this->addError('comment_id', 'Can\'t delete post.');
return false;
}
|
2d107e9e
Yarik
test
|
235
|
} else {
|
0c0cdc9d
Yarik
test
|
236
237
238
239
240
241
242
243
244
245
|
if($this->status == self::STATUS_DELETED) {
return false;
}
$this->status = self::STATUS_DELETED;
if($this->update()) {
$this->clearSafe();
return true;
} else {
return false;
}
|
2d107e9e
Yarik
test
|
246
247
248
249
250
251
|
}
}
} else {
$this->addError('comment_id', 'You can`t delete this post');
return false;
}
|
b82db04a
Yarik
test
|
252
253
|
}
|
2d107e9e
Yarik
test
|
254
|
public function checkCreate()
|
b82db04a
Yarik
test
|
255
|
{
|
2d107e9e
Yarik
test
|
256
|
if($this->getGuestComment()) {
|
b82db04a
Yarik
test
|
257
258
|
return true;
} else {
|
2fd40ee7
Yarik
test
|
259
260
261
262
|
return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [
'model' => $this->model,
'model_id' => $this->model_id,
]);
|
b82db04a
Yarik
test
|
263
264
265
|
}
}
|
2d107e9e
Yarik
test
|
266
267
268
269
270
|
public function checkUpdate()
{
if($this->scenario == self::SCENARIO_GUEST) {
return false;
} else {
|
2fd40ee7
Yarik
test
|
271
272
273
274
275
276
277
|
return \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE, [
'model' => $this->model,
'model_id' => $this->model_id,
]) || \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE_OWN, [
'model' => $this->model,
'model_id' => $this->model_id,
]);
|
2d107e9e
Yarik
test
|
278
279
280
281
282
283
284
285
|
}
}
public function checkDelete()
{
if($this->scenario == self::SCENARIO_GUEST) {
return false;
} else {
|
0c0cdc9d
Yarik
test
|
286
|
return (\Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [
|
2fd40ee7
Yarik
test
|
287
288
|
'model' => $this->model,
'model_id' => $this->model_id,
|
0c0cdc9d
Yarik
test
|
289
|
'comment' => $this,
|
2fd40ee7
Yarik
test
|
290
291
292
|
]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [
'model' => $this->model,
'model_id' => $this->model_id,
|
0c0cdc9d
Yarik
test
|
293
294
|
'comment' => $this,
]));
|
2d107e9e
Yarik
test
|
295
296
297
298
299
|
}
}
protected function clearSafe($setNew = true)
{
|
b82db04a
Yarik
test
|
300
301
302
303
304
305
306
307
|
$safe = $this->safeAttributes();
$count = count($safe);
$values = array_fill(0, $count, NULL);
$result = array_combine($safe, $values);
$this->setAttributes($result);
$this->setIsNewRecord($setNew);
}
|
2d107e9e
Yarik
test
|
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
|
public function getParent()
{
return $this->hasOne(self::className(), [ 'comment_id' => 'comment_pid' ]);
}
public function getAuthor()
{
// if($this->user_id != NULL) {
return $this->hasOne(\common\models\User::className(), [ 'id' => 'user_id' ]);
// } else {
// return ['firstname' => $this->user_name, 'email' => $this->user_email];
// }
}
public function checkRating()
{
|
2fd40ee7
Yarik
test
|
324
325
326
327
328
329
|
$rating = $this->hasOne(\common\modules\comment\models\Rating::className(), [
'model_id' => 'comment_id',
])
->andWhere([
'model' => $this->className(),
])
|
2d107e9e
Yarik
test
|
330
|
->one();
|
0c0cdc9d
Yarik
test
|
331
|
if(!$rating instanceof \common\modules\comment\models\Rating && !empty( $this->primaryKey )) {
|
2d107e9e
Yarik
test
|
332
|
$rating = new \common\modules\comment\models\Rating([
|
2fd40ee7
Yarik
test
|
333
334
335
|
'model' => $this->className(),
'model_id' => $this->comment_id,
'user_id' => $this->user_id,
|
2d107e9e
Yarik
test
|
336
337
338
339
340
341
342
343
|
]);
$rating->save();
}
}
public function getRating()
{
$this->checkRating();
|
2fd40ee7
Yarik
test
|
344
345
346
347
|
return $this->hasOne(\common\modules\comment\models\Rating::className(), [
'model_id' => 'comment_id',
])
->andWhere([ 'model' => $this->className() ]);
|
2d107e9e
Yarik
test
|
348
349
350
351
|
}
public function hasRating($return = true)
{
|
2fd40ee7
Yarik
test
|
352
353
354
355
|
$rating = $this->hasOne(\common\modules\comment\models\Rating::className(), [
'model_id' => 'comment_id',
])
->andWhere([ 'model' => $this->className() ])
|
2d107e9e
Yarik
test
|
356
357
358
359
360
361
362
363
364
365
366
367
|
->andWhere([
'not',
[ 'value' => NULL ],
])
->one();
if($return) {
return $rating;
} else {
return $rating ? true : false;
}
}
|
83b0052c
Yarik
test
|
368
369
370
371
372
|
public function getUser()
{
return $this->hasOne(User::className(), [ 'id' => 'user_id' ]);
}
|
0c0cdc9d
Yarik
test
|
373
374
375
376
377
378
379
380
381
382
|
public function buildButtons()
{
if($this->checkDelete()) {
$this->buttons[ 'delete' ] = Url::to([
'artbox-comment/delete',
'comment_id' => $this->comment_id,
]);
}
}
|
2d107e9e
Yarik
test
|
383
|
}
|