'id', 'skipOnError' => true, ], ]; } /** * @inheritdoc */ public function behaviors() { return [ [ 'class' => TimestampBehavior::className(), ], [ 'class' => BlameableBehavior::className(), 'createdByAttribute' => 'customer_id', 'updatedByAttribute' => false, ], [ 'class' => AttributeBehavior::className(), 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => 'ip', ], 'value' => function () { return \Yii::$app->request->userIP; }, ], [ '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; } }, ], [ 'class' => ParentBehavior::className(), ], ]; } /** * @inheritdoc */ public function attributeLabels() { return [ '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'), ]; } /** * Set Entity of Comment model * * @param string $entity */ public function setEntity(string $entity) { $this->entity = $entity; } /** * Get Entity of Comment model * * @return string */ public function getEntity(): string { return $this->entity; } /** * 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 */ public static function getTree(string $entity, int $entityId): ActiveDataProvider { $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'); } return new ActiveDataProvider( [ 'query' => $query, 'pagination' => [ 'pageSize' => 20, ], 'sort' => [ 'defaultOrder' => [ 'created_at' => SORT_DESC, ], ], ] ); } /** * Delete comment * * @return bool */ public function deleteComment(): bool { if (!\Yii::$app->user->isGuest && \Yii::$app->user->id == $this->customer_id) { if ($this->delete()) { return true; } } return false; } /** * Set EntityId of Comment model * * @param int $entityId */ public function setEntityId(int $entityId) { $this->entityId = $entityId; } /** * Get EntityId of Comment model * * @return int */ public function getEntityId(): int { return $this->entityId; } /** * Get children relation for current comment * * @return \yii\db\ActiveQuery */ public function getChildren() { return $this->hasMany(self::className(), [ 'parent_id' => 'id' ]) ->andFilterWhere([ 'status' => self::STATUS_ACTIVE ]) ->inverseOf('parent'); } /** * Get parent relation for current comment * * @return \yii\db\ActiveQuery */ public function getParent() { return $this->hasOne(self::className(), [ 'id' => 'parent_id' ]) ->inverseOf('children'); } /** * Get customer relation for current comment * * @return \yii\db\ActiveQuery */ public function getCustomer() { return $this->hasOne(self::getCustomerClass(), [ 'id' => 'customer_id' ]); } /** * Get rating relation for current model * * @return \yii\db\ActiveQuery */ public function getRating() { return $this->hasOne(RatingModel::className(), [ 'model_id' => 'id' ]) ->andWhere( [ 'or', [ 'artbox_comment_rating.model' => null ], [ 'artbox_comment_rating.model' => self::className() ], ] ); } /** * Get entity model for current comment or false if not ActiveRecord * * @return ActiveRecord|false */ public function getEntityModel() { if (method_exists($this->entity, 'findOne')) { $model = call_user_func_array( [ $this->entity, 'findOne', ], [ $this->entity_id ] ); 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; } else { return 'artbox\order\models\Customer'; } } }