Commit d85e218176a79beb9136462fdca28106f4cbad7b

Authored by Виталий
2 parents 0f123b59 b5becf98

Merge remote-tracking branch 'origin/master'

.gitignore
  1 +/frontend/web/js/Validation.ts
  2 +/frontend/web/js/typescript.ts
1 3 /node_modules
2 4 # yii console command
3 5 /yii
... ...
common/modules/comment/interfaces/CommentInterface.php
... ... @@ -4,7 +4,7 @@
4 4 interface CommentInterface {
5 5 public function load($data, $formName = null);
6 6 public function formName();
7   - public function getComments($model, $model_id);
  7 + public static function getComments($model, $model_id);
8 8 public function postComment();
9 9 public function deleteComment();
10 10 public function updateComment();
... ...
common/modules/comment/models/Comment.php
... ... @@ -173,9 +173,9 @@
173 173 *
174 174 * @return ActiveQuery
175 175 */
176   - public function getComments($model, $model_id)
  176 + public static function getComments($model, $model_id)
177 177 {
178   - return $this->find()
  178 + return self::find()
179 179 ->where([
180 180 'comment.model' => $model,
181 181 'comment.model_id' => $model_id,
... ... @@ -258,8 +258,9 @@
258 258 return true;
259 259 } else {
260 260 return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [
261   - 'model' => $this->model,
262   - 'model_id' => $this->model_id,
  261 + 'model' => $this->model,
  262 + 'model_id' => $this->model_id,
  263 + 'comment_model' => $this,
263 264 ]);
264 265 }
265 266 }
... ... @@ -333,11 +334,11 @@
333 334  
334 335 public function getAuthor($guestMark = '')
335 336 {
336   - if(!empty($this->user)) {
  337 + if(!empty( $this->user )) {
337 338 return $this->user->name;
338 339 } else {
339 340 $name = $this->user_name;
340   - if(!empty($guestMark)) {
  341 + if(!empty( $guestMark )) {
341 342 $name .= $guestMark;
342 343 }
343 344 return $name;
... ... @@ -395,8 +396,13 @@
395 396 return $this->hasOne(User::className(), [ 'id' => 'user_id' ]);
396 397 }
397 398  
398   - public function buildButtons($buttons = ['delete', 'update', 'reply'])
399   - {
  399 + public function buildButtons(
  400 + $buttons = [
  401 + 'delete',
  402 + 'update',
  403 + 'reply',
  404 + ]
  405 + ) {
400 406 if(in_array('delete', $buttons)) {
401 407 if($this->checkDelete()) {
402 408 $this->buttons[ 'delete' ] = Url::to([
... ...
common/modules/comment/models/CommentProject.php
... ... @@ -222,7 +222,7 @@
222 222 *
223 223 * @return ActiveQuery
224 224 */
225   - public function getComments($model, $model_id)
  225 + public static function getComments($model, $model_id)
226 226 {
227 227 /**
228 228 * @var User $user
... ... @@ -231,7 +231,7 @@
231 231 if(!empty($user)) {
232 232 $project = Project::findOne($model_id);
233 233 if(!empty($project) && $user->id == $project->user_id) {
234   - return $this->find()
  234 + return self::find()
235 235 ->where([
236 236 'comment_project.model' => $model,
237 237 'comment_project.model_id' => $model_id,
... ... @@ -240,7 +240,7 @@
240 240 ->with('currency', 'user', 'user.userInfo', 'user.companyInfo', 'user.comments');
241 241 }
242 242 }
243   - $query = $this->find()
  243 + $query = self::find()
244 244 ->where([
245 245 'comment_project.model' => $model,
246 246 'comment_project.model_id' => $model_id,
... ...
common/modules/comment/models/CommentProjectAnswer.php 0 → 100644
  1 +<?php
  2 + namespace common\modules\comment\models;
  3 +
  4 + use common\models\Project;
  5 + use common\models\User;
  6 + use yii\db\ActiveQuery;
  7 + use yii\helpers\Url;
  8 +
  9 + /**
  10 + * Class Comment
  11 + * @property bool $guestComment
  12 + * @property integer $comment_id
  13 + * @property string $text
  14 + * @property int $user_id
  15 + * @property string $user_name
  16 + * @property string $user_email
  17 + * @property int $comment_pid
  18 + * @property int $status
  19 + * @property string $date_add
  20 + * @property string $date_update
  21 + * @property string $date_delete
  22 + * @property string $model
  23 + * @property int $model_id
  24 + * @property Rating $rating
  25 + * @property User $user
  26 + * @property User $author
  27 + * @package common\modules\comment\models
  28 + */
  29 + class CommentProjectAnswer extends Comment
  30 + {
  31 +
  32 + public function rules()
  33 + {
  34 + return [
  35 + [
  36 + [
  37 + 'text',
  38 + 'user_name',
  39 + 'user_email',
  40 + ],
  41 + 'required',
  42 + ],
  43 + [
  44 + [
  45 + 'rating',
  46 + ],
  47 + 'safe',
  48 + ],
  49 + [
  50 + [ 'user_email' ],
  51 + 'email',
  52 + ],
  53 + [
  54 + [ 'user_name' ],
  55 + 'string',
  56 + ],
  57 + [
  58 + [
  59 + 'comment_id',
  60 + 'comment_pid',
  61 + ],
  62 + 'integer',
  63 + ],
  64 + [
  65 + [ 'status' ],
  66 + 'default',
  67 + 'value' => 1,
  68 + ],
  69 + [
  70 + [ 'comment_pid' ],
  71 + 'exist',
  72 + 'targetAttribute' => 'comment_id',
  73 + 'filter' => [
  74 + 'model' => $this->model,
  75 + 'model_id' => $this->model_id,
  76 + ],
  77 + ],
  78 + ];
  79 + }
  80 +
  81 + /**
  82 + * @param string $model
  83 + * @param integer $model_id
  84 + *
  85 + * @return ActiveQuery
  86 + */
  87 + public static function getComments($model, $model_id)
  88 + {
  89 + $query = self::find()
  90 + ->where([
  91 + 'comment.model' => $model,
  92 + 'comment.model_id' => $model_id,
  93 + 'comment.status' => 1,
  94 + 'comment.comment_pid' => NULL,
  95 + ])
  96 + ->with('parent');
  97 + $project = Project::findOne($model_id);
  98 + $user = \Yii::$app->user;
  99 + if(empty( $user ) || $project->user_id != $user->id) {
  100 + $query->innerJoin([ 'child' => 'comment' ], 'comment.comment_id = child.comment_pid')
  101 + ->andWhere([
  102 + 'not',
  103 + [ 'child.comment_id' => NULL ],
  104 + ]);
  105 + }
  106 + return $query;
  107 + }
  108 +
  109 + public function checkCreate()
  110 + {
  111 + if($this->getGuestComment()) {
  112 + return true;
  113 + } else {
  114 + return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [
  115 + 'model' => $this->model,
  116 + 'model_id' => $this->model_id,
  117 + 'comment_model' => $this,
  118 + ]);
  119 + }
  120 + }
  121 +
  122 + public function checkUpdate()
  123 + {
  124 + if($this->scenario == self::SCENARIO_GUEST) {
  125 + return false;
  126 + } else {
  127 + return \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE, [
  128 + 'model' => $this->model,
  129 + 'model_id' => $this->model_id,
  130 + 'comment' => $this,
  131 + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE_OWN, [
  132 + 'model' => $this->model,
  133 + 'model_id' => $this->model_id,
  134 + 'comment' => $this,
  135 + ]);
  136 + }
  137 + }
  138 +
  139 + public function checkDelete()
  140 + {
  141 + if($this->scenario == self::SCENARIO_GUEST) {
  142 + return false;
  143 + } else {
  144 + return ( \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [
  145 + 'model' => $this->model,
  146 + 'model_id' => $this->model_id,
  147 + 'comment' => $this,
  148 + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [
  149 + 'model' => $this->model,
  150 + 'model_id' => $this->model_id,
  151 + 'comment' => $this,
  152 + ]) );
  153 + }
  154 + }
  155 +
  156 + public function checkReply()
  157 + {
  158 + if($this->scenario != self::SCENARIO_GUEST) {
  159 + if(!$this->isNewRecord && empty( $this->comment_pid )) {
  160 + $project = Project::findOne($this->model_id);
  161 + if($project->user_id == \Yii::$app->user->id) {
  162 + return true;
  163 + }
  164 + }
  165 + }
  166 + return false;
  167 + }
  168 +
  169 + public function getChild()
  170 + {
  171 + return $this->hasOne($this->className(), [ 'comment_pid' => 'comment_id' ]);
  172 + }
  173 +
  174 + }
... ...
common/modules/comment/rbac/ArtboxCommentCreateRule.php
... ... @@ -2,6 +2,7 @@
2 2  
3 3 namespace common\modules\comment\rbac;
4 4  
  5 + use common\modules\comment\models\CommentProject;
5 6 use yii\rbac\Rule;
6 7  
7 8 class ArtboxCommentCreateRule extends Rule
... ... @@ -11,7 +12,7 @@
11 12  
12 13 public function execute($user, $item, $params)
13 14 {
14   - if($params[ 'model' ] == \common\models\Project::className()) {
  15 + if($params[ 'model' ] == \common\models\Project::className() && !empty($params['comment_model']) && $params['comment_model'] == CommentProject::className()) {
15 16 return $this->checkProject($user, $item, $params);
16 17 }
17 18 return true;
... ...
common/modules/comment/widgets/CommentWidget.php
... ... @@ -57,6 +57,8 @@
57 57 */
58 58 public $class_options = [ ];
59 59  
  60 + public $provider_options = [ ];
  61 +
60 62 /**
61 63 * @var bool Wheather to display comment list
62 64 */
... ... @@ -76,6 +78,7 @@
76 78 * @var bool Whether to allow one user post multiple comments
77 79 */
78 80 public $allow_multiple = true;
  81 +
79 82 public $allow_reply = true;
80 83  
81 84 /**
... ... @@ -197,10 +200,10 @@
197 200 if($this->display_comment_form && $this->comment_class->checkCreate()) {
198 201 $tag = ArrayHelper::remove($this->form_options, 'tag', 'div');
199 202 $view = ArrayHelper::remove($this->form_options, 'view');
200   - if(!empty($this->form_options['class'])) {
201   - $this->form_options['class'] .= ' '.self::$baseClass['form_container'];
  203 + if(!empty( $this->form_options[ 'class' ] )) {
  204 + $this->form_options[ 'class' ] .= ' ' . self::$baseClass[ 'form_container' ];
202 205 } else {
203   - $this->form_options['class'] = self::$baseClass['form_container'];
  206 + $this->form_options[ 'class' ] = self::$baseClass[ 'form_container' ];
204 207 }
205 208 $this->parts[ 'form' ] = Html::tag($tag, $this->renderForm($view), $this->form_options);
206 209 }
... ... @@ -209,15 +212,15 @@
209 212 public function createDataProvider()
210 213 {
211 214 $this->dataProvider = new \yii\data\ActiveDataProvider([
212   - 'query' => $this->comment_class->getComments($this->model, $this->model_id),
213   - 'sort' => new Sort([
  215 + 'query' => ArrayHelper::remove($this->provider_options, 'query', $this->comment_class->getComments($this->model, $this->model_id)),
  216 + 'sort' => ArrayHelper::remove($this->provider_options, 'sort', new Sort([
214 217 'defaultOrder' => [
215 218 'date_add' => SORT_DESC,
216 219 ],
217   - ]),
218   - 'pagination' => [
  220 + ])),
  221 + 'pagination' => ArrayHelper::remove($this->provider_options, 'query', [
219 222 'pageSize' => 10,
220   - ],
  223 + ]),
221 224 ]);
222 225 }
223 226  
... ... @@ -258,10 +261,10 @@
258 261 $template = preg_replace('/{list}/', ArrayHelper::remove($parts, 'list', ''), $template);
259 262 $template = preg_replace('/{form}/', ArrayHelper::remove($parts, 'form', ''), $template);
260 263 $tag = ArrayHelper::remove($options, 'tag', 'div');
261   - if(!empty($options['class'])) {
262   - $options['class'] .= ' '.self::$baseClass['widget_container'];
  264 + if(!empty( $options[ 'class' ] )) {
  265 + $options[ 'class' ] .= ' ' . self::$baseClass[ 'widget_container' ];
263 266 } else {
264   - $options['class'] = self::$baseClass['widget_container'];
  267 + $options[ 'class' ] = self::$baseClass[ 'widget_container' ];
265 268 }
266 269 return Html::tag($tag, $template, $options);
267 270 }
... ...
common/modules/comment/widgets/views/_question_comment_view.php 0 → 100644
  1 +<?php
  2 + use common\models\User;
  3 + use common\modules\comment\widgets\CommentWidget;
  4 + use yii\helpers\Html;
  5 + use yii\web\View;
  6 +
  7 + /**
  8 + * @var View $this
  9 + * @var \common\modules\comment\models\Comment $model Current comment model
  10 + * @var integer $key ID of current comment
  11 + * @var integer $index index of current element according
  12 + * to current page, starting from 0
  13 + * @var \yii\widgets\ListView $widget current ListView instance
  14 + * @var User $user
  15 + */
  16 + $user = $model->user;
  17 + $model->buildButtons(['reply']);
  18 +?>
  19 + <div class="comments-name <?= CommentWidget::$baseClass[ 'comment_author' ] ?>">
  20 + <?= $model->getAuthor(' (Гость)') ?>
  21 + </div>
  22 +<?php
  23 + /* == STATUS PRO ==
  24 + ?>
  25 + <div class="comments-status"><span>Pro</span></div>
  26 + <?php
  27 + */
  28 +?>
  29 + <div class="comments-date"><?= \Yii::$app->formatter->asDate($model->date_add, 'php:d.m.Y') ?></div>
  30 + <div class="comments-content">
  31 + <?= $model->text ?>
  32 + </div>
  33 + <div>
  34 + <?php
  35 + if(!empty( $model->buttons[ 'delete' ] )) {
  36 + echo Html::a(($model->user_id != NULL && $model->user_id == \Yii::$app->user->id)?'Удалить':'Пожаловаться ', $model->buttons[ 'delete' ], [ 'class' => CommentWidget::$baseClass[ 'comment_delete' ] ]);
  37 + }
  38 + if(!empty( $model->buttons[ 'update' ] )) {
  39 + echo Html::a('Редактировать', $model->buttons[ 'update' ], [ 'class' => CommentWidget::$baseClass[ 'comment_update' ] ]);
  40 + }
  41 + if(!empty( $model->buttons[ 'reply' ] )) {
  42 + echo Html::a('Ответить', $model->buttons[ 'reply' ], [ 'class' => CommentWidget::$baseClass[ 'comment_reply' ] ]);
  43 + }
  44 + ?>
  45 + </div>
  46 +<?php
  47 + if(!$model->isNewRecord) {
  48 + $this->registerJs("$('div.rating').rating(
  49 + {
  50 + fx : 'full', readOnly : 'true', url : 'rating.php'
  51 + }
  52 + );");
  53 + }
  54 +?>
  55 +<?php
  56 + /* == PROJECT INFO ==
  57 + ?>
  58 + <div class="comments-project-link">Проект: <a href="#">Ремонт спальни</a></div>
  59 + <?php
  60 + */
  61 +?>
0 62 \ No newline at end of file
... ...
common/modules/comment/widgets/views/form-comment-answer.php 0 → 100644
  1 +<?php
  2 + /**
  3 + * @var \common\modules\comment\models\Comment $model
  4 + * @var \common\models\User $user
  5 + * @var \yii\data\ActiveDataProvider $dataProvider
  6 + * @var null|\common\modules\comment\models\Rating $rating
  7 + */
  8 + use yii\widgets\ActiveForm;
  9 + use yii\helpers\Html;
  10 +
  11 +?>
  12 +<div class="new-portf-comm-count">Вопросов: <?= $dataProvider->totalCount ?></div>
  13 +
  14 +<div class="new-portf-add-comm style">
  15 +
  16 + <?php
  17 + $form = ActiveForm::begin();
  18 + if($model->scenario == $model::SCENARIO_GUEST) {
  19 + echo $form->field($model, 'user_name', [
  20 + 'options' => [
  21 + 'class' => 'input-blocks-comm',
  22 + ],
  23 + 'inputOptions' => [
  24 + 'class' => 'custom-input-4',
  25 + ],
  26 + ])
  27 + ->textInput();
  28 + echo $form->field($model, 'user_email', [
  29 + 'options' => [
  30 + 'class' => 'input-blocks-comm',
  31 + ],
  32 + 'inputOptions' => [
  33 + 'class' => 'custom-input-4',
  34 + ],
  35 + ])
  36 + ->textInput();
  37 + }
  38 +
  39 + ?>
  40 + <div class="artbox_comment_reply_block"></div>
  41 + <?php
  42 +
  43 + echo $form->field($model, 'text', [
  44 + 'options' => [
  45 + 'class' => 'input-blocks-comm area-comm',
  46 + ],
  47 + 'inputOptions' => [
  48 + 'class' => 'custom-area-4',
  49 + ],
  50 + ])
  51 + ->label('Вопрос')
  52 + ->textarea();
  53 + ?>
  54 + <div class="input-blocks-comm-button style">
  55 + <?= Html::submitButton('Задать вопрос') ?>
  56 + </div>
  57 + <?php
  58 + $form->end();
  59 + ?>
  60 +</div>
0 61 \ No newline at end of file
... ...
common/modules/comment/widgets/views/form-comment-review.php
... ... @@ -38,6 +38,16 @@
38 38 3 => 3,
39 39 4 => 4,
40 40 5 => 5,
  41 + ], [
  42 + 'item' => function($index, $label, $name, $checked, $value) {
  43 + $return = '<div class="admin-who-check">';
  44 + $return .= '<input class="custom-radio" id="select_admin_' . $value . '" type="radio" name="' . $name . '" value="' . $value . '" ' . ( $checked ? "checked" : "" ) . ' >';
  45 + $return .= '<label for="select_admin_' . $value . '" >';
  46 + $return .= '<span></span>' . ucwords($label);
  47 + $return .= '</label>';
  48 + $return .= '</div>';
  49 + return $return;
  50 + },
41 51 ]);
42 52 if($model->scenario == $model::SCENARIO_GUEST) {
43 53 echo $form->field($model, 'user_name', [
... ... @@ -62,7 +72,7 @@
62 72 if(!empty( $model->comment_pid )) {
63 73 echo Html::tag('div', Html::activeHiddenInput($model, 'comment_pid') . Html::tag('p', $model->parent->authorName, [ 'class' => 'artbox_comment_reply_author' ]), [ 'class' => CommentWidget::$baseClass[ 'reply_block' ] ]);
64 74 } else {
65   - echo Html::tag('div', '', [ 'class' => CommentWidget::$baseClass[ 'reply_block' ] ]);
  75 + echo Html::tag('div', '', [ 'class' => CommentWidget::$baseClass[ 'reply_block' ].' test_class' ]);
66 76 }
67 77 echo $form->field($model, 'text', [
68 78 'options' => [
... ...
common/modules/comment/widgets/views/list-comment-question.php 0 → 100644
  1 +<?php
  2 + /**
  3 + * @var \yii\data\DataProviderInterface $dataProvider
  4 + * @var Comment $commentClass
  5 + */
  6 + use common\modules\comment\models\Comment;
  7 + use common\modules\comment\widgets\CommentWidget;
  8 + echo \yii\widgets\ListView::widget([
  9 + 'dataProvider' => $dataProvider,
  10 + 'itemView' => '_question_comment_view',
  11 + 'options' => [
  12 + 'tag' => 'ul',
  13 + 'class' => 'proektant-comments style',
  14 + ],
  15 + 'itemOptions' => [
  16 + 'tag' => 'li',
  17 + 'class' => CommentWidget::$baseClass[ 'comment_container' ],
  18 + 'data' => [
  19 + 'form' => $commentClass->formName(),
  20 + ],
  21 + ],
  22 + 'layout' => "{items}\n{pager}",
  23 + ]);
0 24 \ No newline at end of file
... ...
frontend/views/tender/view.php
... ... @@ -5,6 +5,7 @@
5 5 * @var Project $model
6 6 */
7 7 use common\models\Project;
  8 + use common\modules\comment\models\Comment;
8 9 use \yii\helpers\Html;
9 10 use yii\helpers\Url;
10 11 use yii\web\View;
... ... @@ -224,6 +225,30 @@ $this-&gt;title = &#39;My Yii Application&#39;;
224 225 <?php
225 226 echo \common\modules\comment\widgets\CommentWidget::widget([
226 227 'context' => $this,
  228 + 'model' => $model->className(),
  229 + 'model_id' => $model->project_id,
  230 + 'comment_class' => \common\modules\comment\models\CommentProjectAnswer::className(),
  231 + 'class_options' => [
  232 + 'scenario' => is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST,
  233 + 'user_id' => \Yii::$app->user->getId(),
  234 + 'guestComment' => false,
  235 + 'status' => \common\modules\comment\models\Comment::STATUS_ACTIVE,
  236 + ],
  237 + 'list_options' => [
  238 + 'view' => 'list-comment-question',
  239 + ],
  240 + 'form_options' => [
  241 + 'view' => 'form-comment-answer',
  242 + 'tag' => 'span',
  243 + ],
  244 + 'options' => [
  245 + 'class' => 'proektant-comments-wr style',
  246 + ],
  247 + ]);
  248 + ?>
  249 + <?php
  250 + echo \common\modules\comment\widgets\CommentWidget::widget([
  251 + 'context' => $this,
227 252 'model' => $model::className(),
228 253 'model_id' => $model->project_id,
229 254 'comment_class' => \common\modules\comment\models\CommentProject::className(),
... ...