CommentProjectAnswer.php 5.67 KB
<?php
    namespace common\modules\comment\models;

    use common\models\Project;
    use common\models\User;
    use yii\db\ActiveQuery;
    use yii\helpers\Url;

    /**
     * Class Comment
     * @property bool    $guestComment
     * @property integer $comment_id
     * @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
     * @property Rating  $rating
     * @property User    $user
     * @property User    $author
     * @package common\modules\comment\models
     */
    class CommentProjectAnswer extends Comment
    {

        public function rules()
        {
            return [
                [
                    [
                        'text',
                        'user_name',
                        'user_email',
                    ],
                    'required',
                ],
                [
                    [
                        'rating',
                    ],
                    'safe',
                ],
                [
                    [ 'user_email' ],
                    'email',
                ],
                [
                    [ 'user_name' ],
                    'string',
                ],
                [
                    [
                        'comment_id',
                        'comment_pid',
                    ],
                    'integer',
                ],
                [
                    [ 'status' ],
                    'default',
                    'value' => 1,
                ],
                [
                    [ 'comment_pid' ],
                    'exist',
                    'targetAttribute' => 'comment_id',
                    'filter'          => [
                        'model'    => $this->model,
                        'model_id' => $this->model_id,
                    ],
                ],
            ];
        }

        /**
         * @param string  $model
         * @param integer $model_id
         *
         * @return ActiveQuery
         */
        public static function getComments($model, $model_id)
        {
            $query = self::find()
                         ->where([
                             'comment.model'       => $model,
                             'comment.model_id'    => $model_id,
                             'comment.status'      => 1,
                             'comment.comment_pid' => NULL,
                         ])
                         ->with('parent');
            $project = Project::findOne($model_id);
            $user = \Yii::$app->user;
            if(empty( $user ) || $project->user_id != $user->id) {
                $query->innerJoin([ 'child' => 'comment' ], 'comment.comment_id = child.comment_pid')
                      ->andWhere([
                          'not',
                          [ 'child.comment_id' => NULL ],
                      ]);
            }
            return $query;
        }

        public function beforeDelete()
        {
            if(parent::beforeDelete()) {

                return false;
            } else {
                return false;
            }
        }

        public function checkCreate()
        {
            if($this->getGuestComment()) {
                return true;
            } else {
                return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [
                    'model'         => $this->model,
                    'model_id'      => $this->model_id,
                    'comment_model' => $this,
                ]);
            }
        }

        public function checkUpdate()
        {
            if($this->scenario == self::SCENARIO_GUEST) {
                return false;
            } else {
                if(!empty($this->comment_pid) && $this->user_id == \Yii::$app->user->id) {
                    return true;
                }
            }
            return false;
        }

        public function checkDelete()
        {
            if($this->scenario == self::SCENARIO_GUEST) {
                return false;
            } else {
                return ( \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [
                        'model'    => $this->model,
                        'model_id' => $this->model_id,
                        'comment'  => $this,
                    ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [
                        'model'    => $this->model,
                        'model_id' => $this->model_id,
                        'comment'  => $this,
                    ]) );
            }
        }

        public function checkReply()
        {
            if($this->scenario != self::SCENARIO_GUEST) {
                if(!$this->isNewRecord && empty( $this->comment_pid )) {
                    $project = Project::findOne($this->model_id);
                    if($project->user_id == \Yii::$app->user->id && empty($this->child)) {
                        return true;
                    }
                } elseif($this->isNewRecord && !empty($this->comment_pid)) {
                    $parent = self::findOne($this->comment_pid);
                    if(!empty($parent) && $parent->checkReply()) {
                        return true;
                    }
                }
            }
            return false;
        }

        public function getChild()
        {
            return $this->hasOne($this->className(), [ 'comment_pid' => 'comment_id' ]);
        }

    }