Blame view

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