yii2mod /
yii2-comments
| 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
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
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
Loading history...
|
|||||
| 206 | } |
||||
| 207 | |||||
| 208 | return $dataProvider; |
||||
| 209 | } |
||||
| 210 | } |
||||
| 211 |