Blame view

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