Blame view

models/CommentModel.php 13.5 KB
a2cde075   Yarik   first commit
1
  <?php
a2cde075   Yarik   first commit
2
      
faff2c48   Yarik   Artbox comment cr...
3
4
5
6
      namespace artbox\webcomment\models;
      
      use artbox\webcomment\behaviors\ParentBehavior;
      use artbox\webcomment\models\interfaces\CommentInterface;
fd5e93c2   Yarik   Artbox comment pr...
7
      use artbox\webcomment\Module;
a2cde075   Yarik   first commit
8
9
10
11
12
      use yii\behaviors\AttributeBehavior;
      use yii\behaviors\BlameableBehavior;
      use yii\behaviors\TimestampBehavior;
      use yii\data\ActiveDataProvider;
      use yii\db\ActiveRecord;
a2cde075   Yarik   first commit
13
14
15
16
      
      /**
       * Class CommentModel
       *
faff2c48   Yarik   Artbox comment cr...
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
       * @property int                                      $id
       * @property string                                   $text
       * @property int                                      $customer_id
       * @property string                                   $username
       * @property string                                   $email
       * @property int                                      $created_at
       * @property int                                      $updated_at
       * @property int                                      $deleted_at
       * @property int                                      $status
       * @property int                                      $parent_id
       * @property int                                      $related_id
       * @property string                                   $ip
       * @property string                                   $info
       * @property string                                   $entity
       * @property int                                      $entity_id
       * @property ActiveRecord                             $entityModel
       * @property string                                   $link
       * @property \artbox\webcomment\models\CommentModel[] $children
       * @property \artbox\order\models\Customer            $customer
b409d909   Yarik   Rating caching
36
       * @property \artbox\webcomment\models\RatingModel    $rating
a2cde075   Yarik   first commit
37
38
39
40
41
42
43
44
45
46
       */
      class CommentModel extends ActiveRecord implements CommentInterface
      {
          
          const STATUS_ACTIVE = 1;
          const STATUS_HIDDEN = 0;
          const STATUS_DELETED = 2;
          
          const SCENARIO_USER = 'user';
          const SCENARIO_GUEST = 'guest';
faff2c48   Yarik   Artbox comment cr...
47
48
          const SCENARIO_ADMIN = 'admin';
          const SCENARIO_ADMIN_ANSWER = 'admin';
a2cde075   Yarik   first commit
49
50
51
52
          
          public $encryptedEntity;
          
          public $entityId;
b409d909   Yarik   Rating caching
53
          
faff2c48   Yarik   Artbox comment cr...
54
55
56
          /**
           * @inheritdoc
           */
a2cde075   Yarik   first commit
57
58
59
60
61
62
63
          public function scenarios()
          {
              $scenarios = parent::scenarios();
              $scenarios[ self::SCENARIO_USER ] = [
                  'text',
                  'entity',
                  'entity_id',
faff2c48   Yarik   Artbox comment cr...
64
                  'parent_id',
a2cde075   Yarik   first commit
65
66
67
68
69
70
71
72
73
74
                  'status',
              ];
              $scenarios[ self::SCENARIO_GUEST ] = [
                  'text',
                  'entity',
                  'entity_id',
                  'username',
                  'email',
                  'status',
              ];
faff2c48   Yarik   Artbox comment cr...
75
76
77
78
79
80
81
82
83
84
85
86
              $scenarios[ self::SCENARIO_ADMIN ] = [
                  'text',
                  'status',
              ];
              $scenarios[ self::SCENARIO_ADMIN_ANSWER ] = [
                  'text',
                  'parent_id',
                  'customer_id',
                  'entity',
                  'entity_id',
                  'status',
              ];
a2cde075   Yarik   first commit
87
88
              return $scenarios;
          }
b409d909   Yarik   Rating caching
89
          
faff2c48   Yarik   Artbox comment cr...
90
91
92
          /**
           * @inheritdoc
           */
a2cde075   Yarik   first commit
93
94
95
96
          public static function tableName()
          {
              return '{{%artbox_comment}}';
          }
b409d909   Yarik   Rating caching
97
          
faff2c48   Yarik   Artbox comment cr...
98
99
100
          /**
           * @inheritdoc
           */
a2cde075   Yarik   first commit
101
102
103
104
105
106
107
108
          public function rules()
          {
              return [
                  [
                      [
                          'text',
                          'entity',
                          'entity_id',
a2cde075   Yarik   first commit
109
110
111
112
                          'username',
                          'email',
                      ],
                      'required',
a2cde075   Yarik   first commit
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
                  ],
                  [
                      [
                          'text',
                          'entity',
                          'username',
                      ],
                      'string',
                  ],
                  [
                      [
                          'email',
                      ],
                      'email',
                  ],
                  [
                      [
                          'entity_id',
faff2c48   Yarik   Artbox comment cr...
131
                          'parent_id',
a2cde075   Yarik   first commit
132
133
134
135
                      ],
                      'integer',
                  ],
                  [
faff2c48   Yarik   Artbox comment cr...
136
                      [ 'parent_id' ],
a2cde075   Yarik   first commit
137
                      'exist',
faff2c48   Yarik   Artbox comment cr...
138
                      'targetAttribute' => 'id',
a2cde075   Yarik   first commit
139
140
141
142
                      'skipOnError'     => true,
                  ],
              ];
          }
b409d909   Yarik   Rating caching
143
          
faff2c48   Yarik   Artbox comment cr...
144
145
146
          /**
           * @inheritdoc
           */
a2cde075   Yarik   first commit
147
148
149
150
151
152
153
154
          public function behaviors()
          {
              return [
                  [
                      'class' => TimestampBehavior::className(),
                  ],
                  [
                      'class'              => BlameableBehavior::className(),
faff2c48   Yarik   Artbox comment cr...
155
                      'createdByAttribute' => 'customer_id',
a2cde075   Yarik   first commit
156
157
158
159
160
161
162
                      'updatedByAttribute' => false,
                  ],
                  [
                      'class'      => AttributeBehavior::className(),
                      'attributes' => [
                          ActiveRecord::EVENT_BEFORE_INSERT => 'ip',
                      ],
faff2c48   Yarik   Artbox comment cr...
163
                      'value'      => function () {
a2cde075   Yarik   first commit
164
165
166
167
                          return \Yii::$app->request->userIP;
                      },
                  ],
                  [
fd5e93c2   Yarik   Artbox comment pr...
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
                      'class'      => AttributeBehavior::className(),
                      'attributes' => [
                          ActiveRecord::EVENT_BEFORE_INSERT => 'status',
                      ],
                      'value'      => function () {
                          /**
                           * @var Module $module
                           */
                          $module = \Yii::$app->getModule('artbox-comment');
                          if (!$module) {
                              Module::registerMe();
                          }
                          if ($module->enablePremoderate) {
                              return self::STATUS_HIDDEN;
                          } else {
                              return self::STATUS_ACTIVE;
                          }
                      },
                  ],
                  [
a2cde075   Yarik   first commit
188
189
                      'class' => ParentBehavior::className(),
                  ],
a2cde075   Yarik   first commit
190
191
              ];
          }
b409d909   Yarik   Rating caching
192
          
faff2c48   Yarik   Artbox comment cr...
193
194
195
          /**
           * @inheritdoc
           */
a2cde075   Yarik   first commit
196
197
198
          public function attributeLabels()
          {
              return [
faff2c48   Yarik   Artbox comment cr...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
                  'id'          => \Yii::t('artbox-comment', 'ID'),
                  'text'        => \Yii::t('artbox-comment', 'Text'),
                  'customer_id' => \Yii::t('artbox-comment', 'User'),
                  'username'    => \Yii::t('artbox-comment', 'Username'),
                  'email'       => 'Email',
                  'created_at'  => \Yii::t('artbox-comment', 'Date add'),
                  'updated_at'  => \Yii::t('artbox-comment', 'Date update'),
                  'deleted_at'  => \Yii::t('artbox-comment', 'Date delete'),
                  'status'      => \Yii::t('artbox-comment', 'Status'),
                  'parent_id'   => \Yii::t('artbox-comment', 'Comment parent'),
                  'related_id'  => \Yii::t('artbox-comment', 'Comment related'),
                  'ip'          => 'IP',
                  'entity'      => \Yii::t('artbox-comment', 'Entity'),
                  'info'        => \Yii::t('artbox-comment', 'Info'),
                  'entity_id'   => \Yii::t('artbox-comment', 'Entity ID'),
a2cde075   Yarik   first commit
214
215
              ];
          }
b409d909   Yarik   Rating caching
216
          
faff2c48   Yarik   Artbox comment cr...
217
218
219
220
221
          /**
           * Set Entity of Comment model
           *
           * @param string $entity
           */
a2cde075   Yarik   first commit
222
223
224
225
          public function setEntity(string $entity)
          {
              $this->entity = $entity;
          }
b409d909   Yarik   Rating caching
226
          
faff2c48   Yarik   Artbox comment cr...
227
228
229
230
231
          /**
           * Get Entity of Comment model
           *
           * @return string
           */
a2cde075   Yarik   first commit
232
233
234
235
          public function getEntity(): string
          {
              return $this->entity;
          }
b409d909   Yarik   Rating caching
236
          
faff2c48   Yarik   Artbox comment cr...
237
238
239
240
241
242
243
244
          /**
           * Get ActiveDataProvider of comments for particular Entity according to its EntityId
           *
           * @param string $entity   Entity name
           * @param int    $entityId Entity Id
           *
           * @return \yii\data\ActiveDataProvider
           */
a2cde075   Yarik   first commit
245
246
          public static function getTree(string $entity, int $entityId): ActiveDataProvider
          {
faff2c48   Yarik   Artbox comment cr...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
              $query = self::find()
                           ->with(
                               [
                                   'children' => function ($query) {
                                       /**
                                        * @var \yii\db\ActiveQuery $query
                                        */
                                       if (class_exists(self::getCustomerClass())) {
                                           $query->with('customer');
                                       }
                                   },
                               ]
                           )
                           ->where(
                               [
                                   'entity'    => $entity,
                                   'entity_id' => $entityId,
                                   'status'    => self::STATUS_ACTIVE,
                                   'parent_id' => null,
                               ]
                           );
              if (class_exists(self::getCustomerClass())) {
                  $query->with('customer');
              }
a2cde075   Yarik   first commit
271
272
              return new ActiveDataProvider(
                  [
faff2c48   Yarik   Artbox comment cr...
273
                      'query'      => $query,
a2cde075   Yarik   first commit
274
275
276
277
278
279
280
281
282
283
284
                      'pagination' => [
                          'pageSize' => 20,
                      ],
                      'sort'       => [
                          'defaultOrder' => [
                              'created_at' => SORT_DESC,
                          ],
                      ],
                  ]
              );
          }
b409d909   Yarik   Rating caching
285
          
faff2c48   Yarik   Artbox comment cr...
286
287
288
289
290
          /**
           * Delete comment
           *
           * @return bool
           */
a2cde075   Yarik   first commit
291
292
          public function deleteComment(): bool
          {
faff2c48   Yarik   Artbox comment cr...
293
              if (!\Yii::$app->user->isGuest && \Yii::$app->user->id == $this->customer_id) {
a2cde075   Yarik   first commit
294
295
296
297
298
299
                  if ($this->delete()) {
                      return true;
                  }
              }
              return false;
          }
b409d909   Yarik   Rating caching
300
          
faff2c48   Yarik   Artbox comment cr...
301
302
303
304
305
          /**
           * Set EntityId of Comment model
           *
           * @param int $entityId
           */
a2cde075   Yarik   first commit
306
307
308
309
          public function setEntityId(int $entityId)
          {
              $this->entityId = $entityId;
          }
b409d909   Yarik   Rating caching
310
          
faff2c48   Yarik   Artbox comment cr...
311
312
313
314
315
          /**
           * Get EntityId of Comment model
           *
           * @return int
           */
a2cde075   Yarik   first commit
316
317
318
319
          public function getEntityId(): int
          {
              return $this->entityId;
          }
b409d909   Yarik   Rating caching
320
          
faff2c48   Yarik   Artbox comment cr...
321
322
323
324
325
          /**
           * Get children relation for current comment
           *
           * @return \yii\db\ActiveQuery
           */
a2cde075   Yarik   first commit
326
327
          public function getChildren()
          {
faff2c48   Yarik   Artbox comment cr...
328
              return $this->hasMany(self::className(), [ 'parent_id' => 'id' ])
a2cde075   Yarik   first commit
329
330
331
                          ->andFilterWhere([ 'status' => self::STATUS_ACTIVE ])
                          ->inverseOf('parent');
          }
b409d909   Yarik   Rating caching
332
          
faff2c48   Yarik   Artbox comment cr...
333
334
335
336
337
          /**
           * Get parent relation for current comment
           *
           * @return \yii\db\ActiveQuery
           */
a2cde075   Yarik   first commit
338
339
          public function getParent()
          {
faff2c48   Yarik   Artbox comment cr...
340
              return $this->hasOne(self::className(), [ 'id' => 'parent_id' ])
a2cde075   Yarik   first commit
341
342
                          ->inverseOf('children');
          }
b409d909   Yarik   Rating caching
343
          
faff2c48   Yarik   Artbox comment cr...
344
345
346
347
348
349
          /**
           * Get customer relation for current comment
           *
           * @return \yii\db\ActiveQuery
           */
          public function getCustomer()
a2cde075   Yarik   first commit
350
          {
faff2c48   Yarik   Artbox comment cr...
351
              return $this->hasOne(self::getCustomerClass(), [ 'id' => 'customer_id' ]);
a2cde075   Yarik   first commit
352
          }
b409d909   Yarik   Rating caching
353
          
faff2c48   Yarik   Artbox comment cr...
354
355
356
357
358
          /**
           * Get rating relation for current model
           *
           * @return \yii\db\ActiveQuery
           */
a2cde075   Yarik   first commit
359
360
          public function getRating()
          {
faff2c48   Yarik   Artbox comment cr...
361
              return $this->hasOne(RatingModel::className(), [ 'model_id' => 'id' ])
a2cde075   Yarik   first commit
362
363
364
                          ->andWhere(
                              [
                                  'or',
faff2c48   Yarik   Artbox comment cr...
365
                                  [ 'artbox_comment_rating.model' => null ],
a2cde075   Yarik   first commit
366
367
368
369
                                  [ 'artbox_comment_rating.model' => self::className() ],
                              ]
                          );
          }
b409d909   Yarik   Rating caching
370
          
faff2c48   Yarik   Artbox comment cr...
371
372
373
374
375
          /**
           * Get entity model for current comment or false if not ActiveRecord
           *
           * @return ActiveRecord|false
           */
ce440bf9   Alexey Boroda   -Comments upgrade...
376
377
          public function getEntityModel()
          {
faff2c48   Yarik   Artbox comment cr...
378
379
              if (method_exists($this->entity, 'findOne')) {
                  $model = call_user_func_array(
ce440bf9   Alexey Boroda   -Comments upgrade...
380
                      [
faff2c48   Yarik   Artbox comment cr...
381
382
383
384
                          $this->entity,
                          'findOne',
                      ],
                      [ $this->entity_id ]
ce440bf9   Alexey Boroda   -Comments upgrade...
385
                  );
faff2c48   Yarik   Artbox comment cr...
386
387
388
389
390
                  return $model;
              } else {
                  return false;
              }
          }
b409d909   Yarik   Rating caching
391
          
faff2c48   Yarik   Artbox comment cr...
392
393
394
395
396
397
398
399
400
401
402
403
404
          /**
           * Get Customer model name
           *
           * @return string
           */
          protected static function getCustomerClass()
          {
              /**
               * @var \artbox\webcomment\Module $module
               */
              $module = \Yii::$app->getModule('artbox-comment');
              if ($module) {
                  return $module->userIdentityClass;
ce440bf9   Alexey Boroda   -Comments upgrade...
405
              } else {
faff2c48   Yarik   Artbox comment cr...
406
                  return 'artbox\order\models\Customer';
ce440bf9   Alexey Boroda   -Comments upgrade...
407
408
              }
          }
a34d7471   Anastasia   bug fix
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
          /**
           * @return bool|\yii\db\ActiveQuery
           */
          public function getEntityQuery()
          {
              if (method_exists($this->entity, 'find')) {
                  $query = call_user_func_array(
                      [
                          $this->entity,
                          'find',
                      ],
                      []
                  );
                  return $query->where([ 'id' => $this->entity_id ]);
              } else {
                  return false;
              }
          }
0bacad2e   Yarik   Namespaces
427
428
      }