Comment::getEncryptedEntity()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 7
rs 10
1
<?php
2
3
namespace yii2mod\comments\widgets;
4
5
use Yii;
6
use yii\base\InvalidConfigException;
7
use yii\base\Widget;
8
use yii\data\ArrayDataProvider;
9
use yii\helpers\Json;
10
use yii2mod\comments\CommentAsset;
11
use yii2mod\comments\models\CommentModel;
12
use yii2mod\comments\traits\ModuleTrait;
13
14
/**
15
 * Class Comment
16
 *
17
 * @package yii2mod\comments\widgets
18
 */
19
class Comment extends Widget
20
{
21
    use ModuleTrait;
22
23
    /**
24
     * @var \yii\db\ActiveRecord|null Widget model
25
     */
26
    public $model;
27
28
    /**
29
     * @var string relatedTo custom text, for example: cms url: about-us, john comment about us page, etc.
30
     * By default - class:primaryKey of the current model
31
     */
32
    public $relatedTo;
33
34
    /**
35
     * @var string the view file that will render the comment tree and form for posting comments
36
     */
37
    public $commentView = '@vendor/yii2mod/yii2-comments/widgets/views/index';
38
39
    /**
40
     * @var string comment form id
41
     */
42
    public $formId = 'comment-form';
43
44
    /**
45
     * @var string pjax container id
46
     */
47
    public $pjaxContainerId;
48
49
    /**
50
     * @var null|int maximum comments level, level starts from 1, null - unlimited level;
51
     */
52
    public $maxLevel = 10;
53
54
    /**
55
     * @var string entity id attribute
56
     */
57
    public $entityIdAttribute = 'id';
58
59
    /**
60
     * @var array DataProvider config
61
     */
62
    public $dataProviderConfig = [
63
        'pagination' => [
64
            'pageSize' => false,
65
        ],
66
    ];
67
68
    /**
69
     * @var array ListView config
70
     */
71
    public $listViewConfig = [
72
        'emptyText' => '',
73
    ];
74
75
    /**
76
     * @var array comment widget client options
77
     */
78
    public $clientOptions = [];
79
80
    /**
81
     * @var string hash(crc32) from class name of the widget model
82
     */
83
    protected $entity;
84
85
    /**
86
     * @var int primary key value of the widget model
87
     */
88
    protected $entityId;
89
90
    /**
91
     * @var string encrypted entity
92
     */
93
    protected $encryptedEntity;
94
95
    /**
96
     * @var string comment wrapper tag id
97
     */
98
    protected $commentWrapperId;
99
100
    /**
101
     * Initializes the widget params.
102
     */
103
    public function init()
104
    {
105
        parent::init();
106
107
        if (empty($this->model)) {
108
            throw new InvalidConfigException(Yii::t('yii2mod.comments', 'The "model" property must be set.'));
109
        }
110
111
        if (empty($this->pjaxContainerId)) {
112
            $this->pjaxContainerId = 'comment-pjax-container-' . $this->getId();
113
        }
114
115
        if (empty($this->model->{$this->entityIdAttribute})) {
116
            throw new InvalidConfigException(Yii::t('yii2mod.comments', 'The "entityIdAttribute" value for widget model cannot be empty.'));
117
        }
118
119
        $this->entity = hash('crc32', get_class($this->model));
120
        $this->entityId = $this->model->{$this->entityIdAttribute};
121
122
        if (empty($this->relatedTo)) {
123
            $this->relatedTo = get_class($this->model) . ':' . $this->entityId;
124
        }
125
126
        $this->encryptedEntity = $this->getEncryptedEntity();
127
        $this->commentWrapperId = $this->entity . $this->entityId;
128
129
        $this->registerAssets();
130
    }
131
132
    /**
133
     * Executes the widget.
134
     *
135
     * @return string the result of widget execution to be outputted
136
     */
137
    public function run()
138
    {
139
        $commentClass = $this->getModule()->commentModelClass;
140
        $commentModel = Yii::createObject([
141
            'class' => $commentClass,
142
            'entity' => $this->entity,
143
            'entityId' => $this->entityId,
144
        ]);
145
        $commentDataProvider = $this->getCommentDataProvider($commentClass);
0 ignored issues
show
Bug introduced by
$commentClass of type string is incompatible with the type yii2mod\comments\models\CommentModel expected by parameter $commentClass of yii2mod\comments\widgets...etCommentDataProvider(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

145
        $commentDataProvider = $this->getCommentDataProvider(/** @scrutinizer ignore-type */ $commentClass);
Loading history...
146
147
        return $this->render($this->commentView, [
148
            'commentDataProvider' => $commentDataProvider,
149
            'commentModel' => $commentModel,
150
            'maxLevel' => $this->maxLevel,
151
            'encryptedEntity' => $this->encryptedEntity,
152
            'pjaxContainerId' => $this->pjaxContainerId,
153
            'formId' => $this->formId,
154
            'listViewConfig' => $this->listViewConfig,
155
            'commentWrapperId' => $this->commentWrapperId,
156
        ]);
157
    }
158
159
    /**
160
     * Get encrypted entity
161
     *
162
     * @return string
163
     */
164
    protected function getEncryptedEntity()
165
    {
166
        return utf8_encode(Yii::$app->getSecurity()->encryptByKey(Json::encode([
167
            'entity' => $this->entity,
168
            'entityId' => $this->entityId,
169
            'relatedTo' => $this->relatedTo,
170
        ]), $this->getModule()->id));
171
    }
172
173
    /**
174
     * Register assets.
175
     */
176
    protected function registerAssets()
177
    {
178
        $view = $this->getView();
179
        CommentAsset::register($view);
180
        $view->registerJs("jQuery('#{$this->commentWrapperId}').comment({$this->getClientOptions()});");
181
    }
182
183
    /**
184
     * @return string
185
     */
186
    protected function getClientOptions()
187
    {
188
        $this->clientOptions['pjaxContainerId'] = '#' . $this->pjaxContainerId;
189
        $this->clientOptions['formSelector'] = '#' . $this->formId;
190
191
        return Json::encode($this->clientOptions);
192
    }
193
194
    /**
195
     * Get comment ArrayDataProvider
196
     *
197
     * @param CommentModel $commentClass
198
     *
199
     * @return ArrayDataProvider
200
     */
201
    protected function getCommentDataProvider($commentClass)
202
    {
203
        $dataProvider = new ArrayDataProvider($this->dataProviderConfig);
204
        if (!isset($this->dataProviderConfig['allModels'])) {
205
            $dataProvider->allModels = $commentClass::getTree($this->entity, $this->entityId, $this->maxLevel);
0 ignored issues
show
Bug introduced by
It seems like $this->maxLevel can also be of type integer; however, parameter $maxLevel of yii2mod\comments\models\CommentModel::getTree() does only seem to accept null, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

205
            $dataProvider->allModels = $commentClass::getTree($this->entity, $this->entityId, /** @scrutinizer ignore-type */ $this->maxLevel);
Loading history...
206
        }
207
208
        return $dataProvider;
209
    }
210
}
211