Commit e608c5f77d195326adb51a8c361d268a849ce8fb
1 parent
a4d63ed9
Comment added
Showing
44 changed files
with
3890 additions
and
2391 deletions
Show diff stats
common/config/main.php
@@ -2,7 +2,11 @@ | @@ -2,7 +2,11 @@ | ||
2 | return [ | 2 | return [ |
3 | 'language' => 'ru', | 3 | 'language' => 'ru', |
4 | 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', | 4 | 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', |
5 | - | 5 | + 'controllerMap' => [ |
6 | + 'artbox-comment' => [ | ||
7 | + 'class' => \common\modules\comment\Controller::className(), | ||
8 | + ], | ||
9 | + ], | ||
6 | 'components' => [ | 10 | 'components' => [ |
7 | 'assetManager' => [ | 11 | 'assetManager' => [ |
8 | 'bundles' => [ | 12 | 'bundles' => [ |
@@ -349,46 +353,46 @@ return [ | @@ -349,46 +353,46 @@ return [ | ||
349 | ]*/ | 353 | ]*/ |
350 | ] | 354 | ] |
351 | ], | 355 | ], |
352 | -// 'comment' => [ | ||
353 | -// 'class' => 'common\modules\comment\Module', | ||
354 | -// 'useRbac' => true, | ||
355 | -// 'rbac' => [ | ||
356 | -// 'rules' => [ | ||
357 | -// \common\modules\comment\rbac\ArtboxCommentCreateRule::className(), | ||
358 | -// \common\modules\comment\rbac\ArtboxCommentDeleteRule::className(), | ||
359 | -// \common\modules\comment\rbac\ArtboxCommentUpdateRule::className(), | ||
360 | -// \common\modules\comment\rbac\ArtboxCommentUpdateOwnRule::className(), | ||
361 | -// \common\modules\comment\rbac\ArtboxCommentDeleteOwnRule::className(), | ||
362 | -// ], | ||
363 | -// 'permissions' => [ | ||
364 | -// [ | ||
365 | -// 'name' => common\modules\comment\Permissions::CREATE, | ||
366 | -// 'description' => 'Can create comments', | ||
367 | -// 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentCreateRule())->name, | ||
368 | -// ], | ||
369 | -// [ | ||
370 | -// 'name' => common\modules\comment\Permissions::UPDATE, | ||
371 | -// 'description' => 'Can update comments', | ||
372 | -// 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentUpdateRule())->name, | ||
373 | -// ], | ||
374 | -// [ | ||
375 | -// 'name' => common\modules\comment\Permissions::DELETE, | ||
376 | -// 'description' => 'Can delete comments', | ||
377 | -// 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentDeleteRule())->name, | ||
378 | -// ], | ||
379 | -// [ | ||
380 | -// 'name' => common\modules\comment\Permissions::UPDATE_OWN, | ||
381 | -// 'description' => 'Can update own comments', | ||
382 | -// 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentUpdateOwnRule())->name, | ||
383 | -// ], | ||
384 | -// [ | ||
385 | -// 'name' => common\modules\comment\Permissions::DELETE_OWN, | ||
386 | -// 'description' => 'Can delete own comments', | ||
387 | -// 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentDeleteOwnRule())->name, | ||
388 | -// ], | ||
389 | -// ], | ||
390 | -// ], | ||
391 | -// | ||
392 | -// ], | 356 | + 'comment' => [ |
357 | + 'class' => 'common\modules\comment\Module', | ||
358 | + 'useRbac' => false, | ||
359 | + 'rbac' => [ | ||
360 | + 'rules' => [ | ||
361 | + \common\modules\comment\rbac\ArtboxCommentCreateRule::className(), | ||
362 | + \common\modules\comment\rbac\ArtboxCommentDeleteRule::className(), | ||
363 | + \common\modules\comment\rbac\ArtboxCommentUpdateRule::className(), | ||
364 | + \common\modules\comment\rbac\ArtboxCommentUpdateOwnRule::className(), | ||
365 | + \common\modules\comment\rbac\ArtboxCommentDeleteOwnRule::className(), | ||
366 | + ], | ||
367 | + 'permissions' => [ | ||
368 | + [ | ||
369 | + 'name' => common\modules\comment\Permissions::CREATE, | ||
370 | + 'description' => 'Can create comments', | ||
371 | + 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentCreateRule())->name, | ||
372 | + ], | ||
373 | + [ | ||
374 | + 'name' => common\modules\comment\Permissions::UPDATE, | ||
375 | + 'description' => 'Can update comments', | ||
376 | + 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentUpdateRule())->name, | ||
377 | + ], | ||
378 | + [ | ||
379 | + 'name' => common\modules\comment\Permissions::DELETE, | ||
380 | + 'description' => 'Can delete comments', | ||
381 | + 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentDeleteRule())->name, | ||
382 | + ], | ||
383 | + [ | ||
384 | + 'name' => common\modules\comment\Permissions::UPDATE_OWN, | ||
385 | + 'description' => 'Can update own comments', | ||
386 | + 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentUpdateOwnRule())->name, | ||
387 | + ], | ||
388 | + [ | ||
389 | + 'name' => common\modules\comment\Permissions::DELETE_OWN, | ||
390 | + 'description' => 'Can delete own comments', | ||
391 | + 'ruleName' =>(new \common\modules\comment\rbac\ArtboxCommentDeleteOwnRule())->name, | ||
392 | + ], | ||
393 | + ], | ||
394 | + ], | ||
395 | + | ||
396 | + ], | ||
393 | ], | 397 | ], |
394 | ]; | 398 | ]; |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\models; | ||
4 | + | ||
5 | +use common\modules\product\models\Product; | ||
6 | +use Yii; | ||
7 | + | ||
8 | +/** | ||
9 | + * This is the model class for table "product_to_rating". | ||
10 | + * | ||
11 | + * @property integer $product_to_rating_id | ||
12 | + * @property integer $product_id | ||
13 | + * @property double $value | ||
14 | + * | ||
15 | + * @property Product $product | ||
16 | + */ | ||
17 | +class ProductToRating extends \yii\db\ActiveRecord | ||
18 | +{ | ||
19 | + /** | ||
20 | + * @inheritdoc | ||
21 | + */ | ||
22 | + public static function tableName() | ||
23 | + { | ||
24 | + return 'product_to_rating'; | ||
25 | + } | ||
26 | + | ||
27 | + /** | ||
28 | + * @inheritdoc | ||
29 | + */ | ||
30 | + public function rules() | ||
31 | + { | ||
32 | + return [ | ||
33 | + [['product_id'], 'required'], | ||
34 | + [['product_id'], 'integer'], | ||
35 | + [['value'], 'number', 'min' => 0], | ||
36 | + [['product_id'], 'exist', 'skipOnError' => true, 'targetClass' => Product::className(), 'targetAttribute' => ['product_id' => 'product_id']], | ||
37 | + ]; | ||
38 | + } | ||
39 | + | ||
40 | + /** | ||
41 | + * @inheritdoc | ||
42 | + */ | ||
43 | + public function attributeLabels() | ||
44 | + { | ||
45 | + return [ | ||
46 | + 'product_to_rating_id' => 'Product To Rating ID', | ||
47 | + 'product_id' => 'Product ID', | ||
48 | + 'value' => 'Value', | ||
49 | + ]; | ||
50 | + } | ||
51 | + | ||
52 | + /** | ||
53 | + * @return \yii\db\ActiveQuery | ||
54 | + */ | ||
55 | + public function getProduct() | ||
56 | + { | ||
57 | + return $this->hasOne(Product::className(), ['product_id' => 'product_id']); | ||
58 | + } | ||
59 | +} |
common/modules/comment/Controller.php
1 | -<?php | ||
2 | - namespace common\modules\comment; | ||
3 | - | ||
4 | - class Controller extends \yii\web\Controller | ||
5 | - { | ||
6 | - public function behaviors() | ||
7 | - { | ||
8 | - return [ | ||
9 | - 'verbs' => [ | ||
10 | - 'class' => \yii\filters\VerbFilter::className(), | ||
11 | - 'actions' => [ | ||
12 | - '*' => ['post'], | ||
13 | - ], | ||
14 | - ], | ||
15 | - ]; | ||
16 | - } | ||
17 | - | ||
18 | - public function actionDelete() | ||
19 | - { | ||
20 | - \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
21 | - $post = \Yii::$app->request->post('Comment'); | ||
22 | - if(!empty($post['comment_id'])) { | ||
23 | - if($model = \common\modules\comment\models\Comment::findOne($post['comment_id'])) { | ||
24 | - /** | ||
25 | - * @var \common\modules\comment\models\Comment $model | ||
26 | - */ | ||
27 | - $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST; | ||
28 | - if($model->deleteComment()) { | ||
29 | - \Yii::$app->response->data = ['text' => 'Comment marked as deleted and will be check by administrators']; | ||
30 | - } else { | ||
31 | - \Yii::$app->response->data = ['error' => $model->hasErrors('comment_id')?$model->getFirstError('comment_id'):'Cannot delete message']; | ||
32 | - } | ||
33 | - }else { | ||
34 | - \Yii::$app->response->data = ['error' => 'Comment not found']; | ||
35 | - }; | ||
36 | - } else { | ||
37 | - \Yii::$app->response->data = ['error' => 'Missing comment_id']; | ||
38 | - } | ||
39 | - \Yii::$app->response->send(); | ||
40 | - } | ||
41 | - | ||
42 | - public function actionUpdate() | ||
43 | - { | ||
44 | - \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
45 | - $post = \Yii::$app->request->post(); | ||
46 | - if(!empty($post['Comment']['comment_id'])) { | ||
47 | - if($model = \common\modules\comment\models\Comment::findOne($post['Comment']['comment_id'])) { | ||
48 | - /** | ||
49 | - * @var \common\modules\comment\models\Comment $model | ||
50 | - */ | ||
51 | - $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST; | ||
52 | - $model->load($post); | ||
53 | - if(empty($post['Comment']['comment_pid'])) { | ||
54 | - $model->comment_pid = null; | ||
55 | - } | ||
56 | - if($model->updateComment()) { | ||
57 | - \Yii::$app->response->data = ['text' => 'Comment successfully updated']; | ||
58 | - } else { | ||
59 | - \Yii::$app->response->data = ['error' => $model->hasErrors()?$model->getFirstErrors():'Cannot update message']; | ||
60 | - } | ||
61 | - }else { | ||
62 | - \Yii::$app->response->data = ['error' => 'Comment not found']; | ||
63 | - }; | ||
64 | - } else { | ||
65 | - \Yii::$app->response->data = ['error' => 'Missing comment_id']; | ||
66 | - } | ||
67 | - \Yii::$app->response->send(); | ||
68 | - } | ||
69 | - | ||
70 | - public function actionForm() | ||
71 | - { | ||
72 | - $post = \Yii::$app->request->post('Comment'); | ||
73 | - if(!empty($post['comment_id'])) { | ||
74 | - $model = \common\modules\comment\models\Comment::find()->where(['comment_id' => $post['comment_id']])->with('parent', 'author')->one(); | ||
75 | - if($model) { | ||
76 | - /** | ||
77 | - * @var \common\modules\comment\models\Comment $model | ||
78 | - */ | ||
79 | - $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST; | ||
80 | - if($model->checkUpdate()) { | ||
81 | - return $this->renderAjax('@common/modules/comment/views/comment_form', [ | ||
82 | - 'model' => $model, | ||
83 | - ]); | ||
84 | - } else { | ||
85 | - \Yii::$app->response->data = ['error' => 'You are not able to update this comment']; | ||
86 | - } | ||
87 | - }else { | ||
88 | - \Yii::$app->response->data = ['error' => 'Comment not found']; | ||
89 | - }; | ||
90 | - } else { | ||
91 | - \Yii::$app->response->data = ['error' => 'Missing comment_id']; | ||
92 | - } | ||
93 | - \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
94 | - \Yii::$app->response->send(); | ||
95 | - } | ||
96 | - | 1 | +<?php |
2 | + namespace common\modules\comment; | ||
3 | + | ||
4 | + class Controller extends \yii\web\Controller | ||
5 | + { | ||
6 | + | ||
7 | + public $enableCsrfValidation = false; | ||
8 | + | ||
9 | + public function behaviors() | ||
10 | + { | ||
11 | + return [ | ||
12 | + 'verbs' => [ | ||
13 | + 'class' => \yii\filters\VerbFilter::className(), | ||
14 | + 'actions' => [ | ||
15 | + '*' => [ 'post' ], | ||
16 | + ], | ||
17 | + ], | ||
18 | + ]; | ||
19 | + } | ||
20 | + | ||
21 | + public function actionDelete() | ||
22 | + { | ||
23 | + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
24 | + $post = \Yii::$app->request->post('Comment'); | ||
25 | + $get = \Yii::$app->request->get(); | ||
26 | + if(empty( $post[ 'comment_id' ] ) && !empty( $get[ 'comment_id' ] )) { | ||
27 | + $post[ 'comment_id' ] = $get[ 'comment_id' ]; | ||
28 | + } | ||
29 | + if(!empty( $post[ 'comment_id' ] )) { | ||
30 | + if($model = \common\modules\comment\models\Comment::findOne($post[ 'comment_id' ])) { | ||
31 | + /** | ||
32 | + * @var \common\modules\comment\models\Comment $model | ||
33 | + */ | ||
34 | + $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST; | ||
35 | + if($model->deleteComment()) { | ||
36 | + \Yii::$app->response->data = [ 'text' => 'Comment marked as deleted and will be check by administrators' ]; | ||
37 | + } else { | ||
38 | + \Yii::$app->response->data = [ 'error' => $model->hasErrors('comment_id') ? $model->getFirstError('comment_id') : 'Cannot delete message' ]; | ||
39 | + } | ||
40 | + } else { | ||
41 | + \Yii::$app->response->data = [ 'error' => 'Comment not found' ]; | ||
42 | + }; | ||
43 | + } else { | ||
44 | + \Yii::$app->response->data = [ 'error' => 'Missing comment_id' ]; | ||
45 | + } | ||
46 | + \Yii::$app->response->send(); | ||
47 | + } | ||
48 | + | ||
49 | + public function actionUpdate() | ||
50 | + { | ||
51 | + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
52 | + $post = \Yii::$app->request->post(); | ||
53 | + if(!empty( $post[ 'Comment' ][ 'comment_id' ] )) { | ||
54 | + if($model = \common\modules\comment\models\Comment::findOne($post[ 'Comment' ][ 'comment_id' ])) { | ||
55 | + /** | ||
56 | + * @var \common\modules\comment\models\Comment $model | ||
57 | + */ | ||
58 | + $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST; | ||
59 | + $model->load($post); | ||
60 | + if(empty( $post[ 'Comment' ][ 'comment_pid' ] )) { | ||
61 | + $model->comment_pid = NULL; | ||
62 | + } | ||
63 | + if($model->updateComment()) { | ||
64 | + $model->rating->load($post); | ||
65 | + if($model->rating->save()) { | ||
66 | + return [ | ||
67 | + 'result' => [ | ||
68 | + 'text' => 'Comment successfully updated', | ||
69 | + 'html' => $this->renderAjax('@common/modules/comment/widgets/views/_review_comment_view', [ 'model' => $model ]), | ||
70 | + ], | ||
71 | + ]; | ||
72 | + } else { | ||
73 | + return [ | ||
74 | + 'error' => $model->hasErrors() ? $model->getFirstErrors() : 'Cannot update message', | ||
75 | + 'form' => $this->renderAjax('@common/modules/comment/widgets/views/form-comment-review', [ | ||
76 | + 'model' => $model, | ||
77 | + ]), | ||
78 | + ]; | ||
79 | + } | ||
80 | + } else { | ||
81 | + return [ | ||
82 | + 'error' => $model->hasErrors() ? $model->getFirstErrors() : 'Cannot update message', | ||
83 | + 'form' => $this->renderAjax('@common/modules/comment/widgets/views/form-comment-review', [ | ||
84 | + 'model' => $model, | ||
85 | + ]), | ||
86 | + ]; | ||
87 | + } | ||
88 | + } else { | ||
89 | + return [ 'error' => 'Comment not found' ]; | ||
90 | + } | ||
91 | + } else { | ||
92 | + return [ 'error' => 'Missing comment_id' ]; | ||
93 | + } | ||
94 | + } | ||
95 | + | ||
96 | + public function actionForm() | ||
97 | + { | ||
98 | + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
99 | + $post = \Yii::$app->request->post('Comment'); | ||
100 | + if(!empty( $post[ 'comment_id' ] )) { | ||
101 | + $model = \common\modules\comment\models\Comment::find() | ||
102 | + ->where([ 'comment_id' => $post[ 'comment_id' ] ]) | ||
103 | + ->with('parent', 'user') | ||
104 | + ->one(); | ||
105 | + if($model) { | ||
106 | + /** | ||
107 | + * @var \common\modules\comment\models\Comment $model | ||
108 | + */ | ||
109 | + $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\Comment::SCENARIO_USER : \common\modules\comment\models\Comment::SCENARIO_GUEST; | ||
110 | + if($model->checkUpdate()) { | ||
111 | + return [ | ||
112 | + 'result' => [ | ||
113 | + 'form' => $this->renderAjax('@common/modules/comment/widgets/views/form-comment-review', [ | ||
114 | + 'model' => $model, | ||
115 | + ]), | ||
116 | + ], | ||
117 | + ]; | ||
118 | + } else { | ||
119 | + return [ 'error' => 'You are not able to update this comment' ]; | ||
120 | + } | ||
121 | + } else { | ||
122 | + return [ 'error' => 'Comment not found' ]; | ||
123 | + } | ||
124 | + } else { | ||
125 | + return [ 'error' => 'Missing comment_id' ]; | ||
126 | + } | ||
127 | + } | ||
128 | + | ||
129 | + public function actionUpdateAnswer() | ||
130 | + { | ||
131 | + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
132 | + $post = \Yii::$app->request->post(); | ||
133 | + if(!empty( $post[ 'CommentProjectAnswer' ][ 'comment_id' ] )) { | ||
134 | + if($model = \common\modules\comment\models\CommentProjectAnswer::findOne($post[ 'CommentProjectAnswer' ][ 'comment_id' ])) { | ||
135 | + /** | ||
136 | + * @var \common\modules\comment\models\CommentProjectAnswer $model | ||
137 | + */ | ||
138 | + $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\CommentProjectAnswer::SCENARIO_USER : \common\modules\comment\models\CommentProjectAnswer::SCENARIO_GUEST; | ||
139 | + $model->load($post); | ||
140 | + if(empty( $post[ 'CommentProjectAnswer' ][ 'comment_pid' ] )) { | ||
141 | + $model->comment_pid = NULL; | ||
142 | + } | ||
143 | + if($model->updateComment()) { | ||
144 | + $model->rating->load($post); | ||
145 | + if($model->rating->save()) { | ||
146 | + return [ | ||
147 | + 'result' => [ | ||
148 | + 'text' => 'Comment successfully updated', | ||
149 | + 'html' => $this->renderAjax('@common/modules/comment/widgets/views/_question_comment_view', [ 'model' => $model ]), | ||
150 | + ], | ||
151 | + ]; | ||
152 | + } else { | ||
153 | + return [ | ||
154 | + 'error' => $model->hasErrors() ? $model->getFirstErrors() : 'Cannot update message', | ||
155 | + 'form' => $this->renderAjax('@common/modules/comment/widgets/views/form-comment-answer', [ | ||
156 | + 'model' => $model, | ||
157 | + ]), | ||
158 | + ]; | ||
159 | + } | ||
160 | + } else { | ||
161 | + return [ | ||
162 | + 'error' => $model->hasErrors() ? $model->getFirstErrors() : 'Cannot update message', | ||
163 | + 'form' => $this->renderAjax('@common/modules/comment/widgets/views/form-comment-answer', [ | ||
164 | + 'model' => $model, | ||
165 | + ]), | ||
166 | + ]; | ||
167 | + } | ||
168 | + } else { | ||
169 | + return [ 'error' => 'Comment not found' ]; | ||
170 | + } | ||
171 | + } else { | ||
172 | + return [ 'error' => 'Missing comment_id' ]; | ||
173 | + } | ||
174 | + } | ||
175 | + | ||
176 | + public function actionFormAnswer() | ||
177 | + { | ||
178 | + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
179 | + $post = \Yii::$app->request->post('CommentProjectAnswer'); | ||
180 | + if(!empty( $post[ 'comment_id' ] )) { | ||
181 | + $model = \common\modules\comment\models\CommentProjectAnswer::find() | ||
182 | + ->where([ 'comment_id' => $post[ 'comment_id' ] ]) | ||
183 | + ->with('parent', 'user') | ||
184 | + ->one(); | ||
185 | + if($model) { | ||
186 | + /** | ||
187 | + * @var \common\modules\comment\models\CommentProjectAnswer $model | ||
188 | + */ | ||
189 | + $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\CommentProjectAnswer::SCENARIO_USER : \common\modules\comment\models\CommentProjectAnswer::SCENARIO_GUEST; | ||
190 | + if($model->checkUpdate()) { | ||
191 | + return [ | ||
192 | + 'result' => [ | ||
193 | + 'form' => $this->renderAjax('@common/modules/comment/widgets/views/form-comment-answer', [ | ||
194 | + 'model' => $model, | ||
195 | + ]), | ||
196 | + ], | ||
197 | + ]; | ||
198 | + } else { | ||
199 | + return [ 'error' => 'You are not able to update this comment' ]; | ||
200 | + } | ||
201 | + } else { | ||
202 | + return [ 'error' => 'Comment not found' ]; | ||
203 | + } | ||
204 | + } else { | ||
205 | + return [ 'error' => 'Missing comment_id' ]; | ||
206 | + } | ||
207 | + } | ||
208 | + | ||
209 | + public function actionDeleteAnswer() | ||
210 | + { | ||
211 | + \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||
212 | + $post = \Yii::$app->request->post('CommentProjectAnswer'); | ||
213 | + $get = \Yii::$app->request->get(); | ||
214 | + if(empty( $post[ 'comment_id' ] ) && !empty( $get[ 'comment_id' ] )) { | ||
215 | + $post[ 'comment_id' ] = $get[ 'comment_id' ]; | ||
216 | + } | ||
217 | + if(!empty( $post[ 'comment_id' ] )) { | ||
218 | + if($model = \common\modules\comment\models\CommentProjectAnswer::findOne($post[ 'comment_id' ])) { | ||
219 | + /** | ||
220 | + * @var \common\modules\comment\models\Comment $model | ||
221 | + */ | ||
222 | + $model->scenario = is_int(\Yii::$app->user->getId()) ? \common\modules\comment\models\CommentProjectAnswer::SCENARIO_USER : \common\modules\comment\models\CommentProjectAnswer::SCENARIO_GUEST; | ||
223 | + if($model->deleteComment()) { | ||
224 | + \Yii::$app->response->data = [ 'text' => 'Comment marked as deleted and will be check by administrators' ]; | ||
225 | + } else { | ||
226 | + \Yii::$app->response->data = [ 'error' => $model->hasErrors('comment_id') ? $model->getFirstError('comment_id') : 'Cannot delete message' ]; | ||
227 | + } | ||
228 | + } else { | ||
229 | + \Yii::$app->response->data = [ 'error' => 'Comment not found' ]; | ||
230 | + }; | ||
231 | + } else { | ||
232 | + \Yii::$app->response->data = [ 'error' => 'Missing comment_id' ]; | ||
233 | + } | ||
234 | + \Yii::$app->response->send(); | ||
235 | + } | ||
236 | + | ||
97 | } | 237 | } |
98 | \ No newline at end of file | 238 | \ No newline at end of file |
common/modules/comment/Module.php
1 | -<?php | ||
2 | - namespace common\modules\comment; | ||
3 | - | ||
4 | - /** | ||
5 | - * Class Module | ||
6 | - * @package common\modules\comment | ||
7 | - */ | ||
8 | - class Module extends \yii\base\Module | ||
9 | - { | ||
10 | - | ||
11 | - /** | ||
12 | - * @var string Module name | ||
13 | - */ | ||
14 | - public static $moduleName = 'artbox_comment'; | ||
15 | - | ||
16 | - /** | ||
17 | - * @var bool Wheather to use Rbac system | ||
18 | - * @link http://www.yiiframework.com/doc-2.0/guide-security-authorization.html#rbac | ||
19 | - * @see \yii\rbac\ManagerInterface | ||
20 | - */ | ||
21 | - public $useRbac = false; | ||
22 | - | ||
23 | - /** | ||
24 | - * Array of RBAC rules and permissions that can be used by install command. | ||
25 | - * | ||
26 | - * Currently supports associative array, of such view: | ||
27 | - * | ||
28 | - * <code> | ||
29 | - * [ | ||
30 | - * 'rules' => [ | ||
31 | - * \full\namapaced\ClassName, | ||
32 | - * \another\one\ClassName, | ||
33 | - * ], | ||
34 | - * 'permissions' => [ | ||
35 | - * [ | ||
36 | - * 'name' => stringName, | ||
37 | - * 'description' => descriptionText, | ||
38 | - * 'ruleName' => (new \full\namespaced\ClassName())->name (optional) | ||
39 | - * ], | ||
40 | - * [ | ||
41 | - * 'name' => stringName2, | ||
42 | - * 'description' => descriptionText2, | ||
43 | - * 'ruleName' => (new \another\one\ClassName())->name (optional) | ||
44 | - * ], | ||
45 | - * ] | ||
46 | - * ] | ||
47 | - * </code> | ||
48 | - * | ||
49 | - * @var array | ||
50 | - * @see \common\modules\comment\commands\RbacController | ||
51 | - */ | ||
52 | - public $rbac = []; | ||
53 | - | ||
54 | - /** | ||
55 | - * @var \yii\db\Connection Connection to the db | ||
56 | - */ | ||
57 | - public $db = null; | ||
58 | - | ||
59 | - /** | ||
60 | - * @inheritdoc | ||
61 | - */ | ||
62 | - public function init() | ||
63 | - { | ||
64 | - parent::init(); | ||
65 | - if(\Yii::$app instanceof \yii\console\Application) { | ||
66 | - $this->controllerNamespace = 'common\modules\comment\commands'; | ||
67 | - } | ||
68 | - if($this->db === null) { | ||
69 | - $this->db = \Yii::$app->db; | ||
70 | - } elseif(!$this->db instanceof \yii\db\Connection) { | ||
71 | - throw new \yii\base\InvalidConfigException('ะะพะฝัะธะณ db ะพะฑัะทะฐะฝ ะฝะฐัะปะตะดะพะฒะฐัััั ะพั'.\yii\db\Connection::className()); | ||
72 | - } | ||
73 | - } | 1 | +<?php |
2 | + namespace common\modules\comment; | ||
3 | + | ||
4 | + /** | ||
5 | + * Class Module | ||
6 | + * @package common\modules\comment | ||
7 | + */ | ||
8 | + class Module extends \yii\base\Module | ||
9 | + { | ||
10 | + | ||
11 | + /** | ||
12 | + * @var string Module name | ||
13 | + */ | ||
14 | + public static $moduleName = 'artbox_comment'; | ||
15 | + | ||
16 | + /** | ||
17 | + * @var bool Wheather to use Rbac system | ||
18 | + * @link http://www.yiiframework.com/doc-2.0/guide-security-authorization.html#rbac | ||
19 | + * @see \yii\rbac\ManagerInterface | ||
20 | + */ | ||
21 | + public $useRbac = false; | ||
22 | + | ||
23 | + /** | ||
24 | + * Array of RBAC rules and permissions that can be used by install command. | ||
25 | + * | ||
26 | + * Currently supports associative array, of such view: | ||
27 | + * | ||
28 | + * <code> | ||
29 | + * [ | ||
30 | + * 'rules' => [ | ||
31 | + * \full\namapaced\ClassName, | ||
32 | + * \another\one\ClassName, | ||
33 | + * ], | ||
34 | + * 'permissions' => [ | ||
35 | + * [ | ||
36 | + * 'name' => stringName, | ||
37 | + * 'description' => descriptionText, | ||
38 | + * 'ruleName' => (new \full\namespaced\ClassName())->name (optional) | ||
39 | + * ], | ||
40 | + * [ | ||
41 | + * 'name' => stringName2, | ||
42 | + * 'description' => descriptionText2, | ||
43 | + * 'ruleName' => (new \another\one\ClassName())->name (optional) | ||
44 | + * ], | ||
45 | + * ] | ||
46 | + * ] | ||
47 | + * </code> | ||
48 | + * | ||
49 | + * @var array | ||
50 | + * @see \common\modules\comment\commands\RbacController | ||
51 | + */ | ||
52 | + public $rbac = []; | ||
53 | + | ||
54 | + /** | ||
55 | + * @var \yii\db\Connection Connection to the db | ||
56 | + */ | ||
57 | + public $db = null; | ||
58 | + | ||
59 | + /** | ||
60 | + * @inheritdoc | ||
61 | + */ | ||
62 | + public function init() | ||
63 | + { | ||
64 | + parent::init(); | ||
65 | + if(\Yii::$app instanceof \yii\console\Application) { | ||
66 | + $this->controllerNamespace = 'common\modules\comment\commands'; | ||
67 | + } | ||
68 | + if($this->db === null) { | ||
69 | + $this->db = \Yii::$app->db; | ||
70 | + } elseif(!$this->db instanceof \yii\db\Connection) { | ||
71 | + throw new \yii\base\InvalidConfigException('ะะพะฝัะธะณ db ะพะฑัะทะฐะฝ ะฝะฐัะปะตะดะพะฒะฐัััั ะพั'.\yii\db\Connection::className()); | ||
72 | + } | ||
73 | + } | ||
74 | } | 74 | } |
75 | \ No newline at end of file | 75 | \ No newline at end of file |
common/modules/comment/Permissions.php
1 | -<?php | ||
2 | - namespace common\modules\comment; | ||
3 | - | ||
4 | - class Permissions | ||
5 | - { | ||
6 | - | ||
7 | - const CREATE = 'artbox_comment.create'; | ||
8 | - const UPDATE = 'artbox_comment.update'; | ||
9 | - const DELETE = 'artbox_comment.delete'; | ||
10 | - const UPDATE_OWN = 'artbox_comment.update_own'; | ||
11 | - const DELETE_OWN = 'artbox_comment.delete_own'; | 1 | +<?php |
2 | + namespace common\modules\comment; | ||
3 | + | ||
4 | + class Permissions | ||
5 | + { | ||
6 | + | ||
7 | + const CREATE = 'artbox_comment.create'; | ||
8 | + const UPDATE = 'artbox_comment.update'; | ||
9 | + const DELETE = 'artbox_comment.delete'; | ||
10 | + const UPDATE_OWN = 'artbox_comment.update_own'; | ||
11 | + const DELETE_OWN = 'artbox_comment.delete_own'; | ||
12 | } | 12 | } |
13 | \ No newline at end of file | 13 | \ No newline at end of file |
common/modules/comment/assets/CommentAsset.php
1 | -<?php | ||
2 | - namespace common\modules\comment\assets; | ||
3 | - | ||
4 | - class CommentAsset extends \yii\web\AssetBundle | ||
5 | - { | ||
6 | - | ||
7 | - public $sourcePath = '@common/modules/comment/resources'; | ||
8 | - | ||
9 | - public $css = [ | ||
10 | - 'comment.css', | ||
11 | - ]; | ||
12 | - | ||
13 | - public $js = [ | ||
14 | - 'comment.js', | ||
15 | - ]; | ||
16 | - | ||
17 | - public $depends = [ | ||
18 | - '\yii\web\YiiAsset', | ||
19 | - '\yii\web\JqueryAsset', | ||
20 | - ]; | ||
21 | - | ||
22 | - public $jsOptions = [ | ||
23 | - 'position' => \yii\web\View::POS_READY, | ||
24 | - ]; | ||
25 | - | 1 | +<?php |
2 | + namespace common\modules\comment\assets; | ||
3 | + | ||
4 | + class CommentAsset extends \yii\web\AssetBundle | ||
5 | + { | ||
6 | + | ||
7 | + public $sourcePath = '@common/modules/comment/resources'; | ||
8 | + | ||
9 | + public $css = [ | ||
10 | + 'comment.css', | ||
11 | + ]; | ||
12 | + | ||
13 | + public $js = [ | ||
14 | + 'comment.js', | ||
15 | + ]; | ||
16 | + | ||
17 | + public $depends = [ | ||
18 | + '\yii\web\YiiAsset', | ||
19 | + '\yii\web\JqueryAsset', | ||
20 | + ]; | ||
21 | + | ||
22 | + public $jsOptions = [ | ||
23 | + 'position' => \yii\web\View::POS_HEAD, | ||
24 | + ]; | ||
25 | + | ||
26 | } | 26 | } |
27 | \ No newline at end of file | 27 | \ No newline at end of file |
common/modules/comment/commands/RbacController.php
1 | -<?php | ||
2 | - namespace common\modules\comment\commands; | ||
3 | - | ||
4 | - class RbacController extends \yii\console\Controller | ||
5 | - { | ||
6 | - | ||
7 | - public function actionInstall() | ||
8 | - { | ||
9 | - /** | ||
10 | - * @var \common\modules\comment\Module $module | ||
11 | - */ | ||
12 | - $module = \Yii::$app->controller->module; | ||
13 | - if(!$module->useRbac) { | ||
14 | - throw new \yii\base\InvalidConfigException('Please set useRbac config to TRUE in your module configs'); | ||
15 | - } | ||
16 | - $auth = \Yii::$app->getAuthManager(); | ||
17 | - if(!$auth instanceof \yii\rbac\ManagerInterface) { | ||
18 | - throw new \yii\base\InvalidConfigException('ManagerInterface is not configured'); | ||
19 | - } | ||
20 | - if(!empty($module->rbac['rules'])) { | ||
21 | - foreach($module->rbac['rules'] as $rule) { | ||
22 | - $rule_model = new $rule(); | ||
23 | - echo "Creating rule: ".$rule_model->name."\n"; | ||
24 | - if($auth->add($rule_model)) { | ||
25 | - echo "Successful\n"; | ||
26 | - } else { | ||
27 | - echo "Failed\n"; | ||
28 | - } | ||
29 | - unset($rule_model); | ||
30 | - } | ||
31 | - } | ||
32 | - if(!empty($module->rbac['permissions'])) { | ||
33 | - foreach($module->rbac['permissions'] as $permission) { | ||
34 | - echo "Creating permission: ".$permission['name']."\n"; | ||
35 | - if($auth->add(new \yii\rbac\Permission($permission))) { | ||
36 | - echo "Successful\n"; | ||
37 | - } else { | ||
38 | - echo "Failed\n"; | ||
39 | - } | ||
40 | - } | ||
41 | - } | ||
42 | - } | ||
43 | - | ||
44 | - public function actionUninstall() | ||
45 | - { | ||
46 | - /** | ||
47 | - * @var \common\modules\comment\Module $module | ||
48 | - */ | ||
49 | - $module = \Yii::$app->controller->module; | ||
50 | - if(!$module->useRbac) { | ||
51 | - throw new \yii\base\InvalidConfigException('Please set useRbac config to TRUE in your module configs'); | ||
52 | - } | ||
53 | - $auth = \Yii::$app->getAuthManager(); | ||
54 | - if(!$auth instanceof \yii\rbac\ManagerInterface) { | ||
55 | - throw new \yii\base\InvalidConfigException('ManagerInterface is not configured'); | ||
56 | - } | ||
57 | - if(!empty($module->rbac['rules'])) { | ||
58 | - foreach($module->rbac['rules'] as $rule) { | ||
59 | - $rule_model = new $rule(); | ||
60 | - echo "Removing rule: ".$rule_model->name."\n"; | ||
61 | - if($auth->remove($rule_model)) { | ||
62 | - echo "Successful\n"; | ||
63 | - } else { | ||
64 | - echo "Failed\n"; | ||
65 | - } | ||
66 | - unset($rule_model); | ||
67 | - } | ||
68 | - } | ||
69 | - if(!empty($module->rbac['permissions'])) { | ||
70 | - foreach($module->rbac['permissions'] as $permission) { | ||
71 | - echo "Removing permission: ".$permission['name']."\n"; | ||
72 | - if($auth->remove(new \yii\rbac\Permission($permission))) { | ||
73 | - echo "Successful\n"; | ||
74 | - } else { | ||
75 | - echo "Failed\n"; | ||
76 | - } | ||
77 | - } | ||
78 | - } | ||
79 | - } | ||
80 | - | 1 | +<?php |
2 | + namespace common\modules\comment\commands; | ||
3 | + | ||
4 | + class RbacController extends \yii\console\Controller | ||
5 | + { | ||
6 | + | ||
7 | + public function actionInstall() | ||
8 | + { | ||
9 | + /** | ||
10 | + * @var \common\modules\comment\Module $module | ||
11 | + */ | ||
12 | + $module = \Yii::$app->controller->module; | ||
13 | + if(!$module->useRbac) { | ||
14 | + throw new \yii\base\InvalidConfigException('Please set useRbac config to TRUE in your module configs'); | ||
15 | + } | ||
16 | + $auth = \Yii::$app->getAuthManager(); | ||
17 | + if(!$auth instanceof \yii\rbac\ManagerInterface) { | ||
18 | + throw new \yii\base\InvalidConfigException('ManagerInterface is not configured'); | ||
19 | + } | ||
20 | + if(!empty($module->rbac['rules'])) { | ||
21 | + foreach($module->rbac['rules'] as $rule) { | ||
22 | + $rule_model = new $rule(); | ||
23 | + echo "Creating rule: ".$rule_model->name."\n"; | ||
24 | + if($auth->add($rule_model)) { | ||
25 | + echo "Successful\n"; | ||
26 | + } else { | ||
27 | + echo "Failed\n"; | ||
28 | + } | ||
29 | + unset($rule_model); | ||
30 | + } | ||
31 | + } | ||
32 | + if(!empty($module->rbac['permissions'])) { | ||
33 | + foreach($module->rbac['permissions'] as $permission) { | ||
34 | + echo "Creating permission: ".$permission['name']."\n"; | ||
35 | + if($auth->add(new \yii\rbac\Permission($permission))) { | ||
36 | + echo "Successful\n"; | ||
37 | + } else { | ||
38 | + echo "Failed\n"; | ||
39 | + } | ||
40 | + } | ||
41 | + } | ||
42 | + } | ||
43 | + | ||
44 | + public function actionUninstall() | ||
45 | + { | ||
46 | + /** | ||
47 | + * @var \common\modules\comment\Module $module | ||
48 | + */ | ||
49 | + $module = \Yii::$app->controller->module; | ||
50 | + if(!$module->useRbac) { | ||
51 | + throw new \yii\base\InvalidConfigException('Please set useRbac config to TRUE in your module configs'); | ||
52 | + } | ||
53 | + $auth = \Yii::$app->getAuthManager(); | ||
54 | + if(!$auth instanceof \yii\rbac\ManagerInterface) { | ||
55 | + throw new \yii\base\InvalidConfigException('ManagerInterface is not configured'); | ||
56 | + } | ||
57 | + if(!empty($module->rbac['rules'])) { | ||
58 | + foreach($module->rbac['rules'] as $rule) { | ||
59 | + $rule_model = new $rule(); | ||
60 | + echo "Removing rule: ".$rule_model->name."\n"; | ||
61 | + if($auth->remove($rule_model)) { | ||
62 | + echo "Successful\n"; | ||
63 | + } else { | ||
64 | + echo "Failed\n"; | ||
65 | + } | ||
66 | + unset($rule_model); | ||
67 | + } | ||
68 | + } | ||
69 | + if(!empty($module->rbac['permissions'])) { | ||
70 | + foreach($module->rbac['permissions'] as $permission) { | ||
71 | + echo "Removing permission: ".$permission['name']."\n"; | ||
72 | + if($auth->remove(new \yii\rbac\Permission($permission))) { | ||
73 | + echo "Successful\n"; | ||
74 | + } else { | ||
75 | + echo "Failed\n"; | ||
76 | + } | ||
77 | + } | ||
78 | + } | ||
79 | + } | ||
80 | + | ||
81 | } | 81 | } |
82 | \ No newline at end of file | 82 | \ No newline at end of file |
common/modules/comment/interfaces/CommentInterface.php
1 | -<?php | ||
2 | - namespace common\modules\comment\interfaces; | ||
3 | - | ||
4 | - interface CommentInterface { | ||
5 | - public function load($data, $formName = null); | ||
6 | - public function formName(); | ||
7 | - public function getComments($model, $model_id); | ||
8 | - public function postComment(); | ||
9 | - public function deleteComment(); | ||
10 | - public function updateComment(); | ||
11 | - } | 1 | +<?php |
2 | + namespace common\modules\comment\interfaces; | ||
3 | + | ||
4 | + interface CommentInterface { | ||
5 | + public function load($data, $formName = null); | ||
6 | + public function formName(); | ||
7 | + public static function getComments($model, $model_id); | ||
8 | + public function postComment(); | ||
9 | + public function deleteComment(); | ||
10 | + public function updateComment(); | ||
11 | + } |
common/modules/comment/models/Comment.php
1 | -<?php | ||
2 | - namespace common\modules\comment\models; | ||
3 | - | ||
4 | - use common\models\User; | ||
5 | - use yii\db\ActiveQuery; | ||
6 | - | ||
7 | - /** | ||
8 | - * Class Comment | ||
9 | - * @property bool $guestComment | ||
10 | - * @property integer $comment_id | ||
11 | - * @property string $text | ||
12 | - * @property int $user_id | ||
13 | - * @property string $user_name | ||
14 | - * @property string $user_email | ||
15 | - * @property int $comment_pid | ||
16 | - * @property int $status | ||
17 | - * @property string $date_add | ||
18 | - * @property string $date_update | ||
19 | - * @property string $date_delete | ||
20 | - * @property string $model | ||
21 | - * @property int $model_id | ||
22 | - * @property Rating $rating | ||
23 | - * @property User $user | ||
24 | - * @package common\modules\comment\models | ||
25 | - */ | ||
26 | - class Comment extends \yii\db\ActiveRecord | ||
27 | - implements \common\modules\comment\interfaces\CommentInterface | ||
28 | - { | ||
29 | - | ||
30 | - const STATUS_HIDDEN = 0; | ||
31 | - const STATUS_DELETED = 2; | ||
32 | - const STATUS_ACTIVE = 1; | ||
33 | - const STATUS_PERSONAL = 3; | ||
34 | - | ||
35 | - const SCENARIO_USER = 'user'; | ||
36 | - const SCENARIO_GUEST = 'guest'; | ||
37 | - | ||
38 | - /** | ||
39 | - * @var bool | ||
40 | - */ | ||
41 | - public $guestComment = true; | ||
42 | - | ||
43 | - public function rules() | ||
44 | - { | ||
45 | - return [ | ||
46 | - [ | ||
47 | - [ | ||
48 | - 'text', | ||
49 | - 'user_name', | ||
50 | - 'user_email', | ||
51 | - ], | ||
52 | - 'required', | ||
53 | - ], | ||
54 | - [ | ||
55 | - [ | ||
56 | - 'rating', | ||
57 | - ], | ||
58 | - 'safe', | ||
59 | - ], | ||
60 | - [ | ||
61 | - [ 'user_email' ], | ||
62 | - 'email', | ||
63 | - ], | ||
64 | - [ | ||
65 | - [ 'user_name' ], | ||
66 | - 'string', | ||
67 | - ], | ||
68 | - [ | ||
69 | - [ | ||
70 | - 'comment_id', | ||
71 | - 'comment_pid', | ||
72 | - ], | ||
73 | - 'integer', | ||
74 | - ], | ||
75 | - [ | ||
76 | - [ 'status' ], | ||
77 | - 'default', | ||
78 | - 'value' => 1, | ||
79 | - ], | ||
80 | - [ | ||
81 | - [ 'comment_pid' ], | ||
82 | - 'exist', | ||
83 | - 'targetAttribute' => 'comment_id', | ||
84 | - 'filter' => [ | ||
85 | - 'model' => $this->model, | ||
86 | - 'model_id' => $this->model_id, | ||
87 | - ], | ||
88 | - ], | ||
89 | - ]; | ||
90 | - } | ||
91 | - | ||
92 | - public function scenarios() | ||
93 | - { | ||
94 | - return [ | ||
95 | - self::SCENARIO_GUEST => [ | ||
96 | - 'user_name', | ||
97 | - 'user_email', | ||
98 | - 'text', | ||
99 | - 'comment_pid', | ||
100 | - ], | ||
101 | - self::SCENARIO_USER => [ | ||
102 | - 'text', | ||
103 | - 'comment_pid', | ||
104 | - ], | ||
105 | - ]; | ||
106 | - } | ||
107 | - | ||
108 | - /** | ||
109 | - * @inheritdoc | ||
110 | - */ | ||
111 | - public function behaviors() | ||
112 | - { | ||
113 | - return [ | ||
114 | - [ | ||
115 | - 'class' => \yii\behaviors\TimestampBehavior::className(), | ||
116 | - 'createdAtAttribute' => 'date_add', | ||
117 | - 'updatedAtAttribute' => 'date_update', | ||
118 | - 'value' => new \yii\db\Expression('NOW()'), | ||
119 | - ], | ||
120 | - ]; | ||
121 | - } | ||
122 | - | ||
123 | - public function afterSave($insert, $changedAttributes) | ||
124 | - { | ||
125 | - if($this->model == User::className()) { | ||
126 | - if($user = User::findOne($this->model_id)) { | ||
127 | - /** | ||
128 | - * @var User $user | ||
129 | - */ | ||
130 | - $user->updateRating(); | ||
131 | - } | ||
132 | - } | ||
133 | - parent::afterSave($insert, $changedAttributes); | ||
134 | - } | ||
135 | - | ||
136 | - /** | ||
137 | - * @inheritdoc | ||
138 | - */ | ||
139 | - public static function tableName() | ||
140 | - { | ||
141 | - return '{{%comment}}'; | ||
142 | - } | ||
143 | - | ||
144 | - /** | ||
145 | - * @inheritdoc | ||
146 | - */ | ||
147 | - public function attributeLabels() | ||
148 | - { | ||
149 | - return [ | ||
150 | - 'text' => \Yii::t('app', 'ะะพะผะผะตะฝัะฐัะธะน'), | ||
151 | - 'user_name' => \Yii::t('app', 'ะะผั'), | ||
152 | - 'user_email' => \Yii::t('app', 'Email'), | ||
153 | - ]; | ||
154 | - } | ||
155 | - | ||
156 | - public function getGuestComment() | ||
157 | - { | ||
158 | - return $this->guestComment; | ||
159 | - } | ||
160 | - | ||
161 | - public function setGuestComment($value) | ||
162 | - { | ||
163 | - $this->guestComment = $value; | ||
164 | - } | ||
165 | - | ||
166 | - /** | ||
167 | - * @param string $model | ||
168 | - * @param integer $model_id | ||
169 | - * | ||
170 | - * @return ActiveQuery | ||
171 | - */ | ||
172 | - public function getComments($model, $model_id) | ||
173 | - { | ||
174 | - return $this->find() | ||
175 | - ->where([ | ||
176 | - 'comment.model' => $model, | ||
177 | - 'comment.model_id' => $model_id, | ||
178 | - 'comment.status' => 1, | ||
179 | - ])->with('rating'); | ||
180 | - } | ||
181 | - | ||
182 | - public function postComment() | ||
183 | - { | ||
184 | - if($this->checkCreate()) { | ||
185 | - if($this->insert()) { | ||
186 | - $this->clearSafe(); | ||
187 | - return true; | ||
188 | - } else { | ||
189 | - return false; | ||
190 | - } | ||
191 | - } else { | ||
192 | - $this->addError('comment_id', 'You can`t post comment here'); | ||
193 | - return false; | ||
194 | - } | ||
195 | - } | ||
196 | - | ||
197 | - public function updateComment() | ||
198 | - { | ||
199 | - if($this->checkUpdate()) { | ||
200 | - if(empty( $this->comment_id )) { | ||
201 | - $this->addError('comment_id', 'Comment ID not found'); | ||
202 | - return false; | ||
203 | - } else { | ||
204 | - if($this->update()) { | ||
205 | - $this->clearSafe(); | ||
206 | - return true; | ||
207 | - } else { | ||
208 | - return false; | ||
209 | - } | ||
210 | - } | ||
211 | - } else { | ||
212 | - $this->addError('comment_id', 'You can`t update this post'); | ||
213 | - return false; | ||
214 | - } | ||
215 | - } | ||
216 | - | ||
217 | - public function deleteComment() | ||
218 | - { | ||
219 | - if($this->checkDelete()) { | ||
220 | - if(empty( $this->comment_id )) { | ||
221 | - $this->addError('comment_id', 'Comment ID not found'); | ||
222 | - return false; | ||
223 | - } else { | ||
224 | - if($this->status == self::STATUS_DELETED) { | ||
225 | - return false; | ||
226 | - } | ||
227 | - $this->status = self::STATUS_DELETED; | ||
228 | - if($this->update()) { | ||
229 | - $this->clearSafe(); | ||
230 | - return true; | ||
231 | - } else { | ||
232 | - return false; | ||
233 | - } | ||
234 | - } | ||
235 | - } else { | ||
236 | - $this->addError('comment_id', 'You can`t delete this post'); | ||
237 | - return false; | ||
238 | - } | ||
239 | - } | ||
240 | - | ||
241 | - public function checkCreate() | ||
242 | - { | ||
243 | - if($this->getGuestComment()) { | ||
244 | - return true; | ||
245 | - } else { | ||
246 | - return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [ | ||
247 | - 'model' => $this->model, | ||
248 | - 'model_id' => $this->model_id, | ||
249 | - ]); | ||
250 | - } | ||
251 | - } | ||
252 | - | ||
253 | - public function checkUpdate() | ||
254 | - { | ||
255 | - if($this->scenario == self::SCENARIO_GUEST) { | ||
256 | - return false; | ||
257 | - } else { | ||
258 | - return \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE, [ | ||
259 | - 'model' => $this->model, | ||
260 | - 'model_id' => $this->model_id, | ||
261 | - ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE_OWN, [ | ||
262 | - 'model' => $this->model, | ||
263 | - 'model_id' => $this->model_id, | ||
264 | - ]); | ||
265 | - } | ||
266 | - } | ||
267 | - | ||
268 | - public function checkDelete() | ||
269 | - { | ||
270 | - if($this->scenario == self::SCENARIO_GUEST) { | ||
271 | - return false; | ||
272 | - } else { | ||
273 | - return \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [ | ||
274 | - 'model' => $this->model, | ||
275 | - 'model_id' => $this->model_id, | ||
276 | - ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [ | ||
277 | - 'model' => $this->model, | ||
278 | - 'model_id' => $this->model_id, | ||
279 | - ]); | ||
280 | - } | ||
281 | - } | ||
282 | - | ||
283 | - protected function clearSafe($setNew = true) | ||
284 | - { | ||
285 | - $safe = $this->safeAttributes(); | ||
286 | - $count = count($safe); | ||
287 | - $values = array_fill(0, $count, NULL); | ||
288 | - $result = array_combine($safe, $values); | ||
289 | - $this->setAttributes($result); | ||
290 | - $this->setIsNewRecord($setNew); | ||
291 | - } | ||
292 | - | ||
293 | - public function getParent() | ||
294 | - { | ||
295 | - return $this->hasOne(self::className(), [ 'comment_id' => 'comment_pid' ]); | ||
296 | - } | ||
297 | - | ||
298 | - public function getAuthor() | ||
299 | - { | ||
300 | - // if($this->user_id != NULL) { | ||
301 | - return $this->hasOne(\common\models\User::className(), [ 'id' => 'user_id' ]); | ||
302 | - // } else { | ||
303 | - // return ['firstname' => $this->user_name, 'email' => $this->user_email]; | ||
304 | - // } | ||
305 | - } | ||
306 | - | ||
307 | - public function checkRating() | ||
308 | - { | ||
309 | - $rating = $this->hasOne(\common\modules\comment\models\Rating::className(), [ | ||
310 | - 'model_id' => 'comment_id', | ||
311 | - ]) | ||
312 | - ->andWhere([ | ||
313 | - 'model' => $this->className(), | ||
314 | - ]) | ||
315 | - ->one(); | ||
316 | - if(!$rating instanceof \common\modules\comment\models\Rating && !empty($this->primaryKey)) { | ||
317 | - $rating = new \common\modules\comment\models\Rating([ | ||
318 | - 'model' => $this->className(), | ||
319 | - 'model_id' => $this->comment_id, | ||
320 | - 'user_id' => $this->user_id, | ||
321 | - ]); | ||
322 | - $rating->save(); | ||
323 | - } | ||
324 | - } | ||
325 | - | ||
326 | - public function getRating() | ||
327 | - { | ||
328 | - $this->checkRating(); | ||
329 | - return $this->hasOne(\common\modules\comment\models\Rating::className(), [ | ||
330 | - 'model_id' => 'comment_id', | ||
331 | - ]) | ||
332 | - ->andWhere([ 'model' => $this->className() ]); | ||
333 | - } | ||
334 | - | ||
335 | - public function hasRating($return = true) | ||
336 | - { | ||
337 | - $rating = $this->hasOne(\common\modules\comment\models\Rating::className(), [ | ||
338 | - 'model_id' => 'comment_id', | ||
339 | - ]) | ||
340 | - ->andWhere([ 'model' => $this->className() ]) | ||
341 | - ->andWhere([ | ||
342 | - 'not', | ||
343 | - [ 'value' => NULL ], | ||
344 | - ]) | ||
345 | - ->one(); | ||
346 | - if($return) { | ||
347 | - return $rating; | ||
348 | - } else { | ||
349 | - return $rating ? true : false; | ||
350 | - } | ||
351 | - } | ||
352 | - | ||
353 | - public function getUser() | ||
354 | - { | ||
355 | - return $this->hasOne(User::className(), [ 'id' => 'user_id' ]); | ||
356 | - } | ||
357 | - | ||
358 | - } | 1 | +<?php |
2 | + namespace common\modules\comment\models; | ||
3 | + | ||
4 | + use common\models\User; | ||
5 | + use common\modules\product\models\Product; | ||
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 Comment extends \yii\db\ActiveRecord | ||
30 | + implements \common\modules\comment\interfaces\CommentInterface | ||
31 | + { | ||
32 | + | ||
33 | + const STATUS_HIDDEN = 0; | ||
34 | + const STATUS_DELETED = 2; | ||
35 | + const STATUS_ACTIVE = 1; | ||
36 | + const STATUS_PERSONAL = 3; | ||
37 | + | ||
38 | + const SCENARIO_USER = 'user'; | ||
39 | + const SCENARIO_GUEST = 'guest'; | ||
40 | + | ||
41 | + /** | ||
42 | + * @var bool | ||
43 | + */ | ||
44 | + public $guestComment = true; | ||
45 | + | ||
46 | + public $buttons = [ ]; | ||
47 | + | ||
48 | + public function rules() | ||
49 | + { | ||
50 | + return [ | ||
51 | + [ | ||
52 | + [ | ||
53 | + 'text', | ||
54 | + 'user_name', | ||
55 | + 'user_email', | ||
56 | + ], | ||
57 | + 'required', | ||
58 | + ], | ||
59 | + [ | ||
60 | + [ | ||
61 | + 'rating', | ||
62 | + ], | ||
63 | + 'safe', | ||
64 | + ], | ||
65 | + [ | ||
66 | + [ 'user_email' ], | ||
67 | + 'email', | ||
68 | + ], | ||
69 | + [ | ||
70 | + [ 'user_name' ], | ||
71 | + 'string', | ||
72 | + ], | ||
73 | + [ | ||
74 | + [ | ||
75 | + 'comment_id', | ||
76 | + 'comment_pid', | ||
77 | + ], | ||
78 | + 'integer', | ||
79 | + ], | ||
80 | + [ | ||
81 | + [ 'status' ], | ||
82 | + 'default', | ||
83 | + 'value' => 1, | ||
84 | + ], | ||
85 | + [ | ||
86 | + [ 'comment_pid' ], | ||
87 | + 'exist', | ||
88 | + 'targetAttribute' => 'comment_id', | ||
89 | + 'filter' => [ | ||
90 | + 'model' => $this->model, | ||
91 | + 'model_id' => $this->model_id, | ||
92 | + ], | ||
93 | + ], | ||
94 | + ]; | ||
95 | + } | ||
96 | + | ||
97 | + public function scenarios() | ||
98 | + { | ||
99 | + return [ | ||
100 | + self::SCENARIO_GUEST => [ | ||
101 | + 'user_name', | ||
102 | + 'user_email', | ||
103 | + 'text', | ||
104 | + 'comment_pid', | ||
105 | + ], | ||
106 | + self::SCENARIO_USER => [ | ||
107 | + 'text', | ||
108 | + 'comment_pid', | ||
109 | + ], | ||
110 | + ]; | ||
111 | + } | ||
112 | + | ||
113 | + /** | ||
114 | + * @inheritdoc | ||
115 | + */ | ||
116 | + public function behaviors() | ||
117 | + { | ||
118 | + return [ | ||
119 | + [ | ||
120 | + 'class' => \yii\behaviors\TimestampBehavior::className(), | ||
121 | + 'createdAtAttribute' => 'date_add', | ||
122 | + 'updatedAtAttribute' => 'date_update', | ||
123 | + 'value' => new \yii\db\Expression('NOW()'), | ||
124 | + ], | ||
125 | + ]; | ||
126 | + } | ||
127 | + | ||
128 | + public function afterSave($insert, $changedAttributes) | ||
129 | + { | ||
130 | + if($this->model == User::className()) { | ||
131 | + if($user = User::findOne($this->model_id)) { | ||
132 | + /** | ||
133 | + * @var User $user | ||
134 | + */ | ||
135 | + $user->updateRating(); | ||
136 | + } | ||
137 | + } | ||
138 | + if($this->model == Product::className()) { | ||
139 | + if($product = Product::findOne($this->model_id)) { | ||
140 | + $product->recalculateRating(); | ||
141 | + } | ||
142 | + } | ||
143 | + parent::afterSave($insert, $changedAttributes); | ||
144 | + } | ||
145 | + | ||
146 | + /** | ||
147 | + * @inheritdoc | ||
148 | + */ | ||
149 | + public static function tableName() | ||
150 | + { | ||
151 | + return '{{%comment}}'; | ||
152 | + } | ||
153 | + | ||
154 | + /** | ||
155 | + * @inheritdoc | ||
156 | + */ | ||
157 | + public function attributeLabels() | ||
158 | + { | ||
159 | + return [ | ||
160 | + 'text' => \Yii::t('app', 'ะะพะผะผะตะฝัะฐัะธะน'), | ||
161 | + 'user_name' => \Yii::t('app', 'ะะผั'), | ||
162 | + 'user_email' => \Yii::t('app', 'Email'), | ||
163 | + ]; | ||
164 | + } | ||
165 | + | ||
166 | + public function getGuestComment() | ||
167 | + { | ||
168 | + return $this->guestComment; | ||
169 | + } | ||
170 | + | ||
171 | + public function setGuestComment($value) | ||
172 | + { | ||
173 | + $this->guestComment = $value; | ||
174 | + } | ||
175 | + | ||
176 | + /** | ||
177 | + * @param string $model | ||
178 | + * @param integer $model_id | ||
179 | + * | ||
180 | + * @return ActiveQuery | ||
181 | + */ | ||
182 | + public static function getComments($model, $model_id) | ||
183 | + { | ||
184 | + return self::find() | ||
185 | + ->where([ | ||
186 | + 'comment.model' => $model, | ||
187 | + 'comment.model_id' => $model_id, | ||
188 | + 'comment.status' => 1, | ||
189 | + ]) | ||
190 | + ->with('rating'); | ||
191 | + } | ||
192 | + | ||
193 | + public function postComment() | ||
194 | + { | ||
195 | + if($this->checkCreate()) { | ||
196 | + if(!empty($this->comment_pid) && !$this->checkReply()) { | ||
197 | + $this->addError('comment_id', 'You can`t reply to this message'); | ||
198 | + return false; | ||
199 | + } | ||
200 | + if($this->insert()) { | ||
201 | + $this->clearSafe(); | ||
202 | + return true; | ||
203 | + } else { | ||
204 | + return false; | ||
205 | + } | ||
206 | + } | ||
207 | + $this->addError('comment_id', 'You can`t post comment here'); | ||
208 | + return false; | ||
209 | + } | ||
210 | + | ||
211 | + public function updateComment() | ||
212 | + { | ||
213 | + if($this->checkUpdate()) { | ||
214 | + if(empty( $this->comment_id )) { | ||
215 | + $this->addError('comment_id', 'Comment ID not found'); | ||
216 | + return false; | ||
217 | + } else { | ||
218 | + if($this->update()) { | ||
219 | + // $this->clearSafe(); Clears safe attributes after AJAX update | ||
220 | + return true; | ||
221 | + } else { | ||
222 | + return false; | ||
223 | + } | ||
224 | + } | ||
225 | + } else { | ||
226 | + $this->addError('comment_id', 'You can`t update this post'); | ||
227 | + return false; | ||
228 | + } | ||
229 | + } | ||
230 | + | ||
231 | + public function deleteComment() | ||
232 | + { | ||
233 | + if($this->checkDelete()) { | ||
234 | + if(empty( $this->comment_id )) { | ||
235 | + $this->addError('comment_id', 'Comment ID not found'); | ||
236 | + return false; | ||
237 | + } else { | ||
238 | + if($this->user_id == \Yii::$app->user->id) { | ||
239 | + if($this->delete()) { | ||
240 | + return true; | ||
241 | + } else { | ||
242 | + $this->addError('comment_id', 'Can\'t delete post.'); | ||
243 | + return false; | ||
244 | + } | ||
245 | + } else { | ||
246 | + if($this->status == self::STATUS_DELETED) { | ||
247 | + return false; | ||
248 | + } | ||
249 | + $this->status = self::STATUS_DELETED; | ||
250 | + if($this->update()) { | ||
251 | + $this->clearSafe(); | ||
252 | + return true; | ||
253 | + } else { | ||
254 | + return false; | ||
255 | + } | ||
256 | + } | ||
257 | + } | ||
258 | + } else { | ||
259 | + $this->addError('comment_id', 'You can`t delete this post'); | ||
260 | + return false; | ||
261 | + } | ||
262 | + } | ||
263 | + | ||
264 | + public function checkCreate() | ||
265 | + { | ||
266 | + if($this->getGuestComment()) { | ||
267 | + return true; | ||
268 | + } else { | ||
269 | + return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [ | ||
270 | + 'model' => $this->model, | ||
271 | + 'model_id' => $this->model_id, | ||
272 | + 'comment_model' => $this, | ||
273 | + ]); | ||
274 | + } | ||
275 | + } | ||
276 | + | ||
277 | + public function checkUpdate() | ||
278 | + { | ||
279 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
280 | + return false; | ||
281 | + } else { | ||
282 | + return \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE, [ | ||
283 | + 'model' => $this->model, | ||
284 | + 'model_id' => $this->model_id, | ||
285 | + 'comment' => $this, | ||
286 | + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE_OWN, [ | ||
287 | + 'model' => $this->model, | ||
288 | + 'model_id' => $this->model_id, | ||
289 | + 'comment' => $this, | ||
290 | + ]); | ||
291 | + } | ||
292 | + } | ||
293 | + | ||
294 | + public function checkDelete() | ||
295 | + { | ||
296 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
297 | + return false; | ||
298 | + } else { | ||
299 | + return ( \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [ | ||
300 | + 'model' => $this->model, | ||
301 | + 'model_id' => $this->model_id, | ||
302 | + 'comment' => $this, | ||
303 | + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [ | ||
304 | + 'model' => $this->model, | ||
305 | + 'model_id' => $this->model_id, | ||
306 | + 'comment' => $this, | ||
307 | + ]) ); | ||
308 | + } | ||
309 | + } | ||
310 | + | ||
311 | + public function checkReply() | ||
312 | + { | ||
313 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
314 | + return false; | ||
315 | + } else { | ||
316 | + return $this->allowReply; | ||
317 | + } | ||
318 | + } | ||
319 | + | ||
320 | + protected function clearSafe($setNew = true) | ||
321 | + { | ||
322 | + $safe = $this->safeAttributes(); | ||
323 | + $count = count($safe); | ||
324 | + $values = array_fill(0, $count, NULL); | ||
325 | + $result = array_combine($safe, $values); | ||
326 | + $this->setAttributes($result); | ||
327 | + $this->setIsNewRecord($setNew); | ||
328 | + } | ||
329 | + | ||
330 | + public function getParent() | ||
331 | + { | ||
332 | + return $this->hasOne(self::className(), [ 'comment_id' => 'comment_pid' ]); | ||
333 | + } | ||
334 | + | ||
335 | + public function getAuthorName() | ||
336 | + { | ||
337 | + if(!empty( $this->author )) { | ||
338 | + return $this->author->username; | ||
339 | + } else { | ||
340 | + return $this->user_name; | ||
341 | + } | ||
342 | + } | ||
343 | + | ||
344 | + public function getAuthor($guestMark = '') | ||
345 | + { | ||
346 | + if(!empty( $this->user )) { | ||
347 | + return $this->user->username; | ||
348 | + } else { | ||
349 | + $name = $this->user_name; | ||
350 | + if(!empty( $guestMark )) { | ||
351 | + $name .= $guestMark; | ||
352 | + } | ||
353 | + return $name; | ||
354 | + } | ||
355 | + } | ||
356 | + | ||
357 | + public function checkRating() | ||
358 | + { | ||
359 | + $rating = $this->hasOne(\common\modules\comment\models\Rating::className(), [ | ||
360 | + 'model_id' => 'comment_id', | ||
361 | + ]) | ||
362 | + ->andWhere([ | ||
363 | + 'model' => $this->className(), | ||
364 | + ]) | ||
365 | + ->one(); | ||
366 | + if(!$rating instanceof \common\modules\comment\models\Rating && !empty( $this->primaryKey )) { | ||
367 | + $rating = new \common\modules\comment\models\Rating([ | ||
368 | + 'model' => $this->className(), | ||
369 | + 'model_id' => $this->comment_id, | ||
370 | + 'user_id' => $this->user_id, | ||
371 | + ]); | ||
372 | + $rating->save(); | ||
373 | + } | ||
374 | + } | ||
375 | + | ||
376 | + public function getRating() | ||
377 | + { | ||
378 | + $this->checkRating(); | ||
379 | + return $this->hasOne(\common\modules\comment\models\Rating::className(), [ | ||
380 | + 'model_id' => 'comment_id', | ||
381 | + ]) | ||
382 | + ->andWhere([ 'rating.model' => $this->className() ]); | ||
383 | + } | ||
384 | + | ||
385 | + public function hasRating($return = true) | ||
386 | + { | ||
387 | + $rating = $this->hasOne(\common\modules\comment\models\Rating::className(), [ | ||
388 | + 'model_id' => 'comment_id', | ||
389 | + ]) | ||
390 | + ->andWhere([ 'model' => $this->className() ]) | ||
391 | + ->andWhere([ | ||
392 | + 'not', | ||
393 | + [ 'value' => NULL ], | ||
394 | + ]) | ||
395 | + ->one(); | ||
396 | + if($return) { | ||
397 | + return $rating; | ||
398 | + } else { | ||
399 | + return $rating ? true : false; | ||
400 | + } | ||
401 | + } | ||
402 | + | ||
403 | + public function getUser() | ||
404 | + { | ||
405 | + return $this->hasOne(User::className(), [ 'id' => 'user_id' ]); | ||
406 | + } | ||
407 | + | ||
408 | + public function buildButtons( | ||
409 | + $buttons = [ | ||
410 | + 'delete', | ||
411 | + 'update', | ||
412 | + 'reply', | ||
413 | + ] | ||
414 | + ) { | ||
415 | + if(in_array('delete', $buttons)) { | ||
416 | + if($this->checkDelete()) { | ||
417 | + $this->buttons[ 'delete' ] = Url::to([ | ||
418 | + 'artbox-comment/delete', | ||
419 | + 'comment_id' => $this->comment_id, | ||
420 | + ]); | ||
421 | + } | ||
422 | + } | ||
423 | + if(in_array('update', $buttons)) { | ||
424 | + if($this->checkUpdate()) { | ||
425 | + $this->buttons[ 'update' ] = Url::to([ | ||
426 | + 'artbox-comment/update', | ||
427 | + 'comment_id' => $this->comment_id, | ||
428 | + ]); | ||
429 | + } | ||
430 | + } | ||
431 | + if(in_array('reply', $buttons)) { | ||
432 | + if($this->checkReply()) { | ||
433 | + $this->buttons[ 'reply' ] = Url::to([ | ||
434 | + 'artbox-comment/reply', | ||
435 | + 'comment_id' => $this->comment_id, | ||
436 | + ]); | ||
437 | + } | ||
438 | + } | ||
439 | + } | ||
440 | + | ||
441 | + public function getAllowReply() | ||
442 | + { | ||
443 | + return $this->hasAttribute('comment_pid'); | ||
444 | + } | ||
445 | + | ||
446 | + } |
common/modules/comment/models/CommentProject.php
1 | -<?php | ||
2 | - namespace common\modules\comment\models; | ||
3 | - | ||
4 | - use common\models\Currency; | ||
5 | - use common\models\File; | ||
6 | - use common\models\Project; | ||
7 | - use common\models\User; | ||
8 | - use yii\db\ActiveQuery; | ||
9 | - use yii\db\ActiveRecord; | ||
10 | - use yii\web\UploadedFile; | ||
11 | - | ||
12 | - /** | ||
13 | - * Class Comment | ||
14 | - * @property bool $guestComment | ||
15 | - * @property integer $comment_id | ||
16 | - * @property string $text | ||
17 | - * @property int $user_id | ||
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 string $files | ||
25 | - * @property float $budget_from | ||
26 | - * @property float $budget_to | ||
27 | - * @property int $term_from | ||
28 | - * @property int $term_to | ||
29 | - * @property int $state | ||
30 | - * @property Currency $currency | ||
31 | - * @property Project $project | ||
32 | - * @package common\modules\comment\models | ||
33 | - */ | ||
34 | - class CommentProject extends \yii\db\ActiveRecord | ||
35 | - implements \common\modules\comment\interfaces\CommentInterface | ||
36 | - { | ||
37 | - | ||
38 | - const STATUS_HIDDEN = 0; | ||
39 | - const STATUS_DELETED = 2; | ||
40 | - const STATUS_ACTIVE = 1; | ||
41 | - const STATUS_PERSONAL = 3; | ||
42 | - const STATUS_ANONYMOUS = 4; | ||
43 | - | ||
44 | - const STATE_NEW = 1; | ||
45 | - const STATE_CANDIDATE = 2; | ||
46 | - const STATE_PERFORMER = 3; | ||
47 | - const STATE_DENY = 4; | ||
48 | - const STATE_TRASH = 5; | ||
49 | - | ||
50 | - const SCENARIO_USER = 'user'; | ||
51 | - const SCENARIO_GUEST = 'guest'; | ||
52 | - const SCENARIO_STATE = 'state'; | ||
53 | - const SCENARIO_OWNER = 'owner'; | ||
54 | - | ||
55 | - /** | ||
56 | - * @var bool | ||
57 | - */ | ||
58 | - public $guestComment = false; | ||
59 | - | ||
60 | - public $file; | ||
61 | - | ||
62 | - public function rules() | ||
63 | - { | ||
64 | - return [ | ||
65 | - [ | ||
66 | - [ | ||
67 | - 'text', | ||
68 | - 'budget_from', | ||
69 | - 'budget_to', | ||
70 | - 'term_from', | ||
71 | - 'term_to', | ||
72 | - 'budget_currency', | ||
73 | - ], | ||
74 | - 'required', | ||
75 | - ], | ||
76 | - [ | ||
77 | - [ | ||
78 | - 'budget_currency', | ||
79 | - ], | ||
80 | - 'integer', | ||
81 | - ], | ||
82 | - [ | ||
83 | - [ | ||
84 | - 'budget_from', | ||
85 | - 'budget_to', | ||
86 | - 'term_from', | ||
87 | - 'term_to', | ||
88 | - ], | ||
89 | - 'integer', | ||
90 | - 'min' => 0, | ||
91 | - ], | ||
92 | - [ | ||
93 | - [ | ||
94 | - 'budget_currency', | ||
95 | - ], | ||
96 | - 'default', | ||
97 | - 'value' => 3, | ||
98 | - ], | ||
99 | - [ | ||
100 | - [ 'budget_currency' ], | ||
101 | - 'exist', | ||
102 | - 'targetClass' => Currency::className(), | ||
103 | - 'targetAttribute' => 'currency_id', | ||
104 | - ], | ||
105 | - [ | ||
106 | - [ | ||
107 | - 'files', | ||
108 | - ], | ||
109 | - 'string', | ||
110 | - ], | ||
111 | - [ | ||
112 | - [ | ||
113 | - 'file', | ||
114 | - ], | ||
115 | - 'safe', | ||
116 | - ], | ||
117 | - [ | ||
118 | - [ 'status' ], | ||
119 | - 'default', | ||
120 | - 'value' => 1, | ||
121 | - ], | ||
122 | - [ | ||
123 | - [ 'state' ], | ||
124 | - 'integer', | ||
125 | - 'max' => 4, | ||
126 | - 'min' => 1, | ||
127 | - 'on' => self::SCENARIO_STATE, | ||
128 | - ], | ||
129 | - [ | ||
130 | - [ 'state' ], | ||
131 | - 'required', | ||
132 | - 'on' => self::SCENARIO_STATE, | ||
133 | - ], | ||
134 | - [ | ||
135 | - [ 'state' ], | ||
136 | - 'required', | ||
137 | - 'on' => self::SCENARIO_OWNER, | ||
138 | - ], | ||
139 | - [ | ||
140 | - [ 'state' ], | ||
141 | - 'in', | ||
142 | - 'range' => [ | ||
143 | - 1, | ||
144 | - 5, | ||
145 | - ], | ||
146 | - 'on' => self::SCENARIO_OWNER, | ||
147 | - ], | ||
148 | - ]; | ||
149 | - } | ||
150 | - | ||
151 | - public function scenarios() | ||
152 | - { | ||
153 | - return [ | ||
154 | - self::SCENARIO_USER => [ | ||
155 | - 'text', | ||
156 | - 'budget_from', | ||
157 | - 'budget_to', | ||
158 | - 'term_from', | ||
159 | - 'term_to', | ||
160 | - 'file', | ||
161 | - ], | ||
162 | - self::SCENARIO_GUEST => [ | ||
163 | - | ||
164 | - ], | ||
165 | - self::SCENARIO_STATE => [ | ||
166 | - 'state', | ||
167 | - ], | ||
168 | - self::SCENARIO_OWNER => [ | ||
169 | - 'state', | ||
170 | - ], | ||
171 | - ]; | ||
172 | - } | ||
173 | - | ||
174 | - /** | ||
175 | - * @inheritdoc | ||
176 | - */ | ||
177 | - public function behaviors() | ||
178 | - { | ||
179 | - return [ | ||
180 | - [ | ||
181 | - 'class' => \yii\behaviors\TimestampBehavior::className(), | ||
182 | - 'createdAtAttribute' => 'date_add', | ||
183 | - 'updatedAtAttribute' => 'date_update', | ||
184 | - 'value' => new \yii\db\Expression('NOW()'), | ||
185 | - ], | ||
186 | - ]; | ||
187 | - } | ||
188 | - | ||
189 | - public static function tableName() | ||
190 | - { | ||
191 | - return '{{%comment_project}}'; | ||
192 | - } | ||
193 | - | ||
194 | - /** | ||
195 | - * @inheritdoc | ||
196 | - */ | ||
197 | - public function attributeLabels() | ||
198 | - { | ||
199 | - return [ | ||
200 | - 'text' => \Yii::t('app', 'ะขะตะบัั ะพัะฒะตัะฐ'), | ||
201 | - 'budget_from' => \Yii::t('app', 'ะพั'), | ||
202 | - 'budget_to' => \Yii::t('app', 'ะดะพ'), | ||
203 | - 'term_from' => \Yii::t('app', 'ะพั'), | ||
204 | - 'term_to' => \Yii::t('app', 'ะดะพ'), | ||
205 | - ]; | ||
206 | - } | ||
207 | - | ||
208 | - public function getGuestComment() | ||
209 | - { | ||
210 | - return $this->guestComment; | ||
211 | - } | ||
212 | - | ||
213 | - // public function setGuestComment($value) | ||
214 | - // { | ||
215 | - // $this->guestComment = $value; | ||
216 | - // } | ||
217 | - | ||
218 | - /** | ||
219 | - * @param string $model | ||
220 | - * @param integer $model_id | ||
221 | - * | ||
222 | - * @return ActiveQuery | ||
223 | - */ | ||
224 | - public function getComments($model, $model_id) | ||
225 | - { | ||
226 | - return $this->find() | ||
227 | - ->where([ | ||
228 | - 'comment_project.model' => $model, | ||
229 | - 'comment_project.model_id' => $model_id, | ||
230 | - 'comment_project.status' => 1, | ||
231 | - ]) | ||
232 | - ->with('currency', 'user', 'user.userInfo', 'user.companyInfo', 'user.comments'); | ||
233 | - } | ||
234 | - | ||
235 | - public function postComment() | ||
236 | - { | ||
237 | - if($this->checkCreate()) { | ||
238 | - if(!empty( \Yii::$app->request->post($this->formName())[ 'anonymous' ] )) { | ||
239 | - $this->status = self::STATUS_ANONYMOUS; | ||
240 | - } | ||
241 | - $this->file = UploadedFile::getInstances($this, 'file'); | ||
242 | - if(!empty( $this->file )) { | ||
243 | - $file_id = [ ]; | ||
244 | - if(is_array($this->file)) { | ||
245 | - foreach($this->file as $file) { | ||
246 | - if($file instanceof UploadedFile) { | ||
247 | - $file_model = new File(); | ||
248 | - $file_id[] = $file_model->saveFile($file); | ||
249 | - } | ||
250 | - } | ||
251 | - } else { | ||
252 | - if($this->file instanceof UploadedFile) { | ||
253 | - $file_model = new File(); | ||
254 | - $file_id[] = $file_model->saveFile($this->file); | ||
255 | - } | ||
256 | - } | ||
257 | - $this->files = json_encode($file_id); | ||
258 | - } | ||
259 | - if($this->insert()) { | ||
260 | - $this->clearSafe(); | ||
261 | - return true; | ||
262 | - } else { | ||
263 | - return false; | ||
264 | - } | ||
265 | - } else { | ||
266 | - $this->addError('comment_id', 'You can`t post comment here'); | ||
267 | - return false; | ||
268 | - } | ||
269 | - } | ||
270 | - | ||
271 | - public function updateComment() | ||
272 | - { | ||
273 | - if($this->checkUpdate()) { | ||
274 | - if(empty( $this->comment_id )) { | ||
275 | - $this->addError('comment_id', 'Comment ID not found'); | ||
276 | - return false; | ||
277 | - } else { | ||
278 | - if($this->update()) { | ||
279 | - $this->clearSafe(); | ||
280 | - return true; | ||
281 | - } else { | ||
282 | - return false; | ||
283 | - } | ||
284 | - } | ||
285 | - } else { | ||
286 | - $this->addError('comment_id', 'You can`t update this post'); | ||
287 | - return false; | ||
288 | - } | ||
289 | - } | ||
290 | - | ||
291 | - public function deleteComment() | ||
292 | - { | ||
293 | - if($this->checkDelete()) { | ||
294 | - if(empty( $this->comment_id )) { | ||
295 | - $this->addError('comment_id', 'Comment ID not found'); | ||
296 | - return false; | ||
297 | - } else { | ||
298 | - if($this->status == self::STATUS_DELETED) { | ||
299 | - return false; | ||
300 | - } | ||
301 | - $this->status = self::STATUS_DELETED; | ||
302 | - if($this->update()) { | ||
303 | - $this->clearSafe(); | ||
304 | - return true; | ||
305 | - } else { | ||
306 | - return false; | ||
307 | - } | ||
308 | - } | ||
309 | - } else { | ||
310 | - $this->addError('comment_id', 'You can`t delete this post'); | ||
311 | - return false; | ||
312 | - } | ||
313 | - } | ||
314 | - | ||
315 | - public function checkCreate() | ||
316 | - { | ||
317 | - if($this->getGuestComment()) { | ||
318 | - return true; | ||
319 | - } else { | ||
320 | - return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [ | ||
321 | - 'model' => $this->model, | ||
322 | - 'model_id' => $this->model_id, | ||
323 | - ]); | ||
324 | - } | ||
325 | - } | ||
326 | - | ||
327 | - public function checkUpdate() | ||
328 | - { | ||
329 | - if($this->scenario == self::SCENARIO_GUEST) { | ||
330 | - return false; | ||
331 | - } else { | ||
332 | - return \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE, [ | ||
333 | - 'model' => $this->model, | ||
334 | - 'model_id' => $this->model_id, | ||
335 | - ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE_OWN, [ | ||
336 | - 'model' => $this->model, | ||
337 | - 'model_id' => $this->model_id, | ||
338 | - ]); | ||
339 | - } | ||
340 | - } | ||
341 | - | ||
342 | - public function checkDelete() | ||
343 | - { | ||
344 | - if($this->scenario == self::SCENARIO_GUEST) { | ||
345 | - return false; | ||
346 | - } else { | ||
347 | - return \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [ | ||
348 | - 'model' => $this->model, | ||
349 | - 'model_id' => $this->model_id, | ||
350 | - ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [ | ||
351 | - 'model' => $this->model, | ||
352 | - 'model_id' => $this->model_id, | ||
353 | - ]); | ||
354 | - } | ||
355 | - } | ||
356 | - | ||
357 | - protected function clearSafe($setNew = true) | ||
358 | - { | ||
359 | - $safe = $this->safeAttributes(); | ||
360 | - $count = count($safe); | ||
361 | - $values = array_fill(0, $count, NULL); | ||
362 | - $result = array_combine($safe, $values); | ||
363 | - $this->setAttributes($result); | ||
364 | - $this->setIsNewRecord($setNew); | ||
365 | - } | ||
366 | - | ||
367 | - public function getAuthor() | ||
368 | - { | ||
369 | - // if($this->user_id != NULL) { | ||
370 | - return $this->hasOne(\common\models\User::className(), [ 'id' => 'user_id' ]); | ||
371 | - // } else { | ||
372 | - // return ['firstname' => $this->user_name, 'email' => $this->user_email]; | ||
373 | - // } | ||
374 | - } | ||
375 | - | ||
376 | - /** | ||
377 | - * @return ActiveQuery | ||
378 | - */ | ||
379 | - public function getCurrency() | ||
380 | - { | ||
381 | - return $this->hasOne(Currency::className(), [ 'currency_id' => 'budget_currency' ]); | ||
382 | - } | ||
383 | - | ||
384 | - /** | ||
385 | - * @return File[] | ||
386 | - */ | ||
387 | - public function getFilesList() | ||
388 | - { | ||
389 | - $files = json_decode($this->files); | ||
390 | - if(!empty( $files )) { | ||
391 | - return File::findAll($files); | ||
392 | - } else { | ||
393 | - return [ ]; | ||
394 | - } | ||
395 | - } | ||
396 | - | ||
397 | - /** | ||
398 | - * @return ActiveRecord | ||
399 | - * @throws \TypeError | ||
400 | - */ | ||
401 | - public function getOwner() | ||
402 | - { | ||
403 | - $model = new $this->model(); | ||
404 | - if($model instanceof ActiveRecord) { | ||
405 | - return $model->findOne($this->model_id); | ||
406 | - } else { | ||
407 | - throw new \TypeError('Model must extends Active Record Class'); | ||
408 | - } | ||
409 | - } | ||
410 | - | ||
411 | - public function getProject() | ||
412 | - { | ||
413 | - return $this->hasOne(Project::className(), [ 'project_id' => 'model_id' ]); | ||
414 | - } | ||
415 | - | ||
416 | - /** | ||
417 | - * @return User | ||
418 | - */ | ||
419 | - public function getUser() | ||
420 | - { | ||
421 | - return $this->hasOne(User::className(), [ 'id' => 'user_id' ]); | ||
422 | - } | ||
423 | - | ||
424 | - public function changeState() | ||
425 | - { | ||
426 | - if($this->isAttributeChanged('state')) { | ||
427 | - if($this->save()) { | ||
428 | - return true; | ||
429 | - } else { | ||
430 | - return false; | ||
431 | - } | ||
432 | - } else { | ||
433 | - return true; | ||
434 | - } | ||
435 | - } | ||
436 | - | ||
437 | - } | 1 | +<?php |
2 | + namespace common\modules\comment\models; | ||
3 | + | ||
4 | + use common\models\Currency; | ||
5 | + use common\models\File; | ||
6 | + use common\models\Project; | ||
7 | + use common\models\User; | ||
8 | + use yii\db\ActiveQuery; | ||
9 | + use yii\db\ActiveRecord; | ||
10 | + use yii\web\UploadedFile; | ||
11 | + | ||
12 | + /** | ||
13 | + * Class Comment | ||
14 | + * @property bool $guestComment | ||
15 | + * @property integer $comment_id | ||
16 | + * @property string $text | ||
17 | + * @property int $user_id | ||
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 string $files | ||
25 | + * @property float $budget_from | ||
26 | + * @property float $budget_to | ||
27 | + * @property int $term_from | ||
28 | + * @property int $term_to | ||
29 | + * @property int $state | ||
30 | + * @property Currency $currency | ||
31 | + * @property Project $project | ||
32 | + * @package common\modules\comment\models | ||
33 | + */ | ||
34 | + class CommentProject extends \yii\db\ActiveRecord | ||
35 | + implements \common\modules\comment\interfaces\CommentInterface | ||
36 | + { | ||
37 | + | ||
38 | + const STATUS_HIDDEN = 0; | ||
39 | + const STATUS_DELETED = 2; | ||
40 | + const STATUS_ACTIVE = 1; | ||
41 | + const STATUS_PERSONAL = 3; | ||
42 | + const STATUS_ANONYMOUS = 4; | ||
43 | + | ||
44 | + const STATE_NEW = 1; | ||
45 | + const STATE_CANDIDATE = 2; | ||
46 | + const STATE_PERFORMER = 3; | ||
47 | + const STATE_DENY = 4; | ||
48 | + const STATE_TRASH = 5; | ||
49 | + | ||
50 | + const SCENARIO_USER = 'user'; | ||
51 | + const SCENARIO_GUEST = 'guest'; | ||
52 | + const SCENARIO_STATE = 'state'; | ||
53 | + const SCENARIO_OWNER = 'owner'; | ||
54 | + | ||
55 | + /** | ||
56 | + * @var bool | ||
57 | + */ | ||
58 | + public $guestComment = false; | ||
59 | + | ||
60 | + public $file; | ||
61 | + | ||
62 | + public function rules() | ||
63 | + { | ||
64 | + return [ | ||
65 | + [ | ||
66 | + [ | ||
67 | + 'text', | ||
68 | + 'budget_from', | ||
69 | + 'budget_to', | ||
70 | + 'term_from', | ||
71 | + 'term_to', | ||
72 | + 'budget_currency', | ||
73 | + ], | ||
74 | + 'required', | ||
75 | + ], | ||
76 | + [ | ||
77 | + [ | ||
78 | + 'budget_currency', | ||
79 | + ], | ||
80 | + 'integer', | ||
81 | + ], | ||
82 | + [ | ||
83 | + [ | ||
84 | + 'budget_from', | ||
85 | + 'budget_to', | ||
86 | + 'term_from', | ||
87 | + 'term_to', | ||
88 | + ], | ||
89 | + 'integer', | ||
90 | + 'min' => 0, | ||
91 | + ], | ||
92 | + [ | ||
93 | + [ | ||
94 | + 'budget_currency', | ||
95 | + ], | ||
96 | + 'default', | ||
97 | + 'value' => 3, | ||
98 | + ], | ||
99 | + [ | ||
100 | + [ 'budget_currency' ], | ||
101 | + 'exist', | ||
102 | + 'targetClass' => Currency::className(), | ||
103 | + 'targetAttribute' => 'currency_id', | ||
104 | + ], | ||
105 | + [ | ||
106 | + [ | ||
107 | + 'files', | ||
108 | + ], | ||
109 | + 'string', | ||
110 | + ], | ||
111 | + [ | ||
112 | + [ | ||
113 | + 'file', | ||
114 | + ], | ||
115 | + 'safe', | ||
116 | + ], | ||
117 | + [ | ||
118 | + [ 'status' ], | ||
119 | + 'default', | ||
120 | + 'value' => 1, | ||
121 | + ], | ||
122 | + [ | ||
123 | + [ 'state' ], | ||
124 | + 'integer', | ||
125 | + 'max' => 4, | ||
126 | + 'min' => 1, | ||
127 | + 'on' => self::SCENARIO_STATE, | ||
128 | + ], | ||
129 | + [ | ||
130 | + [ 'state' ], | ||
131 | + 'required', | ||
132 | + 'on' => self::SCENARIO_STATE, | ||
133 | + ], | ||
134 | + [ | ||
135 | + [ 'state' ], | ||
136 | + 'required', | ||
137 | + 'on' => self::SCENARIO_OWNER, | ||
138 | + ], | ||
139 | + [ | ||
140 | + [ 'state' ], | ||
141 | + 'in', | ||
142 | + 'range' => [ | ||
143 | + 1, | ||
144 | + 5, | ||
145 | + ], | ||
146 | + 'on' => self::SCENARIO_OWNER, | ||
147 | + ], | ||
148 | + ]; | ||
149 | + } | ||
150 | + | ||
151 | + public function scenarios() | ||
152 | + { | ||
153 | + return [ | ||
154 | + self::SCENARIO_USER => [ | ||
155 | + 'text', | ||
156 | + 'budget_from', | ||
157 | + 'budget_to', | ||
158 | + 'budget_currency', | ||
159 | + 'term_from', | ||
160 | + 'term_to', | ||
161 | + 'file', | ||
162 | + ], | ||
163 | + self::SCENARIO_GUEST => [ | ||
164 | + | ||
165 | + ], | ||
166 | + self::SCENARIO_STATE => [ | ||
167 | + 'state', | ||
168 | + ], | ||
169 | + self::SCENARIO_OWNER => [ | ||
170 | + 'state', | ||
171 | + ], | ||
172 | + ]; | ||
173 | + } | ||
174 | + | ||
175 | + /** | ||
176 | + * @inheritdoc | ||
177 | + */ | ||
178 | + public function behaviors() | ||
179 | + { | ||
180 | + return [ | ||
181 | + [ | ||
182 | + 'class' => \yii\behaviors\TimestampBehavior::className(), | ||
183 | + 'createdAtAttribute' => 'date_add', | ||
184 | + 'updatedAtAttribute' => 'date_update', | ||
185 | + 'value' => new \yii\db\Expression('NOW()'), | ||
186 | + ], | ||
187 | + ]; | ||
188 | + } | ||
189 | + | ||
190 | + public static function tableName() | ||
191 | + { | ||
192 | + return '{{%comment_project}}'; | ||
193 | + } | ||
194 | + | ||
195 | + /** | ||
196 | + * @inheritdoc | ||
197 | + */ | ||
198 | + public function attributeLabels() | ||
199 | + { | ||
200 | + return [ | ||
201 | + 'text' => \Yii::t('app', 'ะขะตะบัั ะพัะฒะตัะฐ'), | ||
202 | + 'budget_from' => \Yii::t('app', 'ะพั'), | ||
203 | + 'budget_to' => \Yii::t('app', 'ะดะพ'), | ||
204 | + 'term_from' => \Yii::t('app', 'ะพั'), | ||
205 | + 'term_to' => \Yii::t('app', 'ะดะพ'), | ||
206 | + ]; | ||
207 | + } | ||
208 | + | ||
209 | + public function getGuestComment() | ||
210 | + { | ||
211 | + return $this->guestComment; | ||
212 | + } | ||
213 | + | ||
214 | + // public function setGuestComment($value) | ||
215 | + // { | ||
216 | + // $this->guestComment = $value; | ||
217 | + // } | ||
218 | + | ||
219 | + /** | ||
220 | + * @param string $model | ||
221 | + * @param integer $model_id | ||
222 | + * | ||
223 | + * @return ActiveQuery | ||
224 | + */ | ||
225 | + public static function getComments($model, $model_id) | ||
226 | + { | ||
227 | + /** | ||
228 | + * @var User $user | ||
229 | + */ | ||
230 | + $user = \Yii::$app->user->identity; | ||
231 | + if(!empty($user)) { | ||
232 | + $project = Project::findOne($model_id); | ||
233 | + if(!empty($project) && $user->id == $project->user_id) { | ||
234 | + return self::find() | ||
235 | + ->where([ | ||
236 | + 'comment_project.model' => $model, | ||
237 | + 'comment_project.model_id' => $model_id, | ||
238 | + 'comment_project.status' => [self::STATUS_ANONYMOUS, self::STATUS_ACTIVE, self::STATUS_PERSONAL], | ||
239 | + ]) | ||
240 | + ->with('currency', 'user', 'user.userInfo', 'user.companyInfo', 'user.comments'); | ||
241 | + } | ||
242 | + } | ||
243 | + $query = self::find() | ||
244 | + ->where([ | ||
245 | + 'comment_project.model' => $model, | ||
246 | + 'comment_project.model_id' => $model_id, | ||
247 | + ]) | ||
248 | + ->with('currency', 'user', 'user.userInfo', 'user.companyInfo', 'user.comments'); | ||
249 | + if(!empty($user)) { | ||
250 | + $query->andWhere(['or', ['comment_project.status' => self::STATUS_ACTIVE], ['comment_project.status' => self::STATUS_ANONYMOUS, 'comment_project.user_id' => $user->id]]); | ||
251 | + } else { | ||
252 | + $query->andWhere(['comment_project.status' => 1]); | ||
253 | + } | ||
254 | + return $query; | ||
255 | + } | ||
256 | + | ||
257 | + public function postComment() | ||
258 | + { | ||
259 | + if($this->checkCreate()) { | ||
260 | + if(!empty( \Yii::$app->request->post($this->formName())[ 'anonymous' ] )) { | ||
261 | + $this->status = self::STATUS_ANONYMOUS; | ||
262 | + } | ||
263 | + $this->file = UploadedFile::getInstances($this, 'file'); | ||
264 | + if(!empty( $this->file )) { | ||
265 | + $file_id = [ ]; | ||
266 | + if(is_array($this->file)) { | ||
267 | + foreach($this->file as $file) { | ||
268 | + if($file instanceof UploadedFile) { | ||
269 | + $file_model = new File(); | ||
270 | + $file_id[] = $file_model->saveFile($file); | ||
271 | + } | ||
272 | + } | ||
273 | + } else { | ||
274 | + if($this->file instanceof UploadedFile) { | ||
275 | + $file_model = new File(); | ||
276 | + $file_id[] = $file_model->saveFile($this->file); | ||
277 | + } | ||
278 | + } | ||
279 | + $this->files = json_encode($file_id); | ||
280 | + } | ||
281 | + if($this->insert()) { | ||
282 | + $this->clearSafe(); | ||
283 | + return true; | ||
284 | + } else { | ||
285 | + return false; | ||
286 | + } | ||
287 | + } else { | ||
288 | + $this->addError('comment_id', 'You can`t post comment here'); | ||
289 | + return false; | ||
290 | + } | ||
291 | + } | ||
292 | + | ||
293 | + public function updateComment() | ||
294 | + { | ||
295 | + if($this->checkUpdate()) { | ||
296 | + if(empty( $this->comment_id )) { | ||
297 | + $this->addError('comment_id', 'Comment ID not found'); | ||
298 | + return false; | ||
299 | + } else { | ||
300 | + if($this->update()) { | ||
301 | + $this->clearSafe(); | ||
302 | + return true; | ||
303 | + } else { | ||
304 | + return false; | ||
305 | + } | ||
306 | + } | ||
307 | + } else { | ||
308 | + $this->addError('comment_id', 'You can`t update this post'); | ||
309 | + return false; | ||
310 | + } | ||
311 | + } | ||
312 | + | ||
313 | + public function deleteComment() | ||
314 | + { | ||
315 | + if($this->checkDelete()) { | ||
316 | + if(empty( $this->comment_id )) { | ||
317 | + $this->addError('comment_id', 'Comment ID not found'); | ||
318 | + return false; | ||
319 | + } else { | ||
320 | + if($this->status == self::STATUS_DELETED) { | ||
321 | + return false; | ||
322 | + } | ||
323 | + $this->status = self::STATUS_DELETED; | ||
324 | + if($this->update()) { | ||
325 | + $this->clearSafe(); | ||
326 | + return true; | ||
327 | + } else { | ||
328 | + return false; | ||
329 | + } | ||
330 | + } | ||
331 | + } else { | ||
332 | + $this->addError('comment_id', 'You can`t delete this post'); | ||
333 | + return false; | ||
334 | + } | ||
335 | + } | ||
336 | + | ||
337 | + public function checkCreate() | ||
338 | + { | ||
339 | + if($this->getGuestComment()) { | ||
340 | + return true; | ||
341 | + } else { | ||
342 | + return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [ | ||
343 | + 'model' => $this->model, | ||
344 | + 'model_id' => $this->model_id, | ||
345 | + 'comment_model' => $this->className(), | ||
346 | + ]); | ||
347 | + } | ||
348 | + } | ||
349 | + | ||
350 | + public function checkUpdate() | ||
351 | + { | ||
352 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
353 | + return false; | ||
354 | + } else { | ||
355 | + return \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE, [ | ||
356 | + 'model' => $this->model, | ||
357 | + 'model_id' => $this->model_id, | ||
358 | + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::UPDATE_OWN, [ | ||
359 | + 'model' => $this->model, | ||
360 | + 'model_id' => $this->model_id, | ||
361 | + ]); | ||
362 | + } | ||
363 | + } | ||
364 | + | ||
365 | + public function checkDelete() | ||
366 | + { | ||
367 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
368 | + return false; | ||
369 | + } else { | ||
370 | + return \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [ | ||
371 | + 'model' => $this->model, | ||
372 | + 'model_id' => $this->model_id, | ||
373 | + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [ | ||
374 | + 'model' => $this->model, | ||
375 | + 'model_id' => $this->model_id, | ||
376 | + ]); | ||
377 | + } | ||
378 | + } | ||
379 | + | ||
380 | + protected function clearSafe($setNew = true) | ||
381 | + { | ||
382 | + $safe = $this->safeAttributes(); | ||
383 | + $count = count($safe); | ||
384 | + $values = array_fill(0, $count, NULL); | ||
385 | + $result = array_combine($safe, $values); | ||
386 | + $this->setAttributes($result); | ||
387 | + $this->setIsNewRecord($setNew); | ||
388 | + } | ||
389 | + | ||
390 | + public function getAuthor() | ||
391 | + { | ||
392 | + // if($this->user_id != NULL) { | ||
393 | + return $this->hasOne(\common\models\User::className(), [ 'id' => 'user_id' ]); | ||
394 | + // } else { | ||
395 | + // return ['firstname' => $this->user_name, 'email' => $this->user_email]; | ||
396 | + // } | ||
397 | + } | ||
398 | + | ||
399 | + /** | ||
400 | + * @return ActiveQuery | ||
401 | + */ | ||
402 | + public function getCurrency() | ||
403 | + { | ||
404 | + return $this->hasOne(Currency::className(), [ 'currency_id' => 'budget_currency' ]); | ||
405 | + } | ||
406 | + | ||
407 | + /** | ||
408 | + * @return File[] | ||
409 | + */ | ||
410 | + public function getFilesList() | ||
411 | + { | ||
412 | + $files = json_decode($this->files); | ||
413 | + if(!empty( $files )) { | ||
414 | + return File::findAll($files); | ||
415 | + } else { | ||
416 | + return [ ]; | ||
417 | + } | ||
418 | + } | ||
419 | + | ||
420 | + /** | ||
421 | + * @return ActiveRecord | ||
422 | + * @throws \TypeError | ||
423 | + */ | ||
424 | + public function getOwner() | ||
425 | + { | ||
426 | + $model = new $this->model(); | ||
427 | + if($model instanceof ActiveRecord) { | ||
428 | + return $model->findOne($this->model_id); | ||
429 | + } else { | ||
430 | + throw new \TypeError('Model must extends Active Record Class'); | ||
431 | + } | ||
432 | + } | ||
433 | + | ||
434 | + public function getProject() | ||
435 | + { | ||
436 | + return $this->hasOne(Project::className(), [ 'project_id' => 'model_id' ]); | ||
437 | + } | ||
438 | + | ||
439 | + /** | ||
440 | + * @return User | ||
441 | + */ | ||
442 | + public function getUser() | ||
443 | + { | ||
444 | + return $this->hasOne(User::className(), [ 'id' => 'user_id' ]); | ||
445 | + } | ||
446 | + | ||
447 | + public function changeState() | ||
448 | + { | ||
449 | + if($this->isAttributeChanged('state')) { | ||
450 | + if($this->save()) { | ||
451 | + return true; | ||
452 | + } else { | ||
453 | + return false; | ||
454 | + } | ||
455 | + } else { | ||
456 | + return true; | ||
457 | + } | ||
458 | + } | ||
459 | + | ||
460 | + } |
common/modules/comment/models/CommentProjectAnswer.php
0 โ 100755
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 | + ['comment_pid'], | ||
80 | + 'required', | ||
81 | + 'when' => function($model, $attribute) { | ||
82 | + /** | ||
83 | + * @var CommentProjectAnswer $model | ||
84 | + * @var string $attribute | ||
85 | + */ | ||
86 | + if(!empty(\Yii::$app->user->id) && $model->isNewRecord && !empty($model->model) && !empty($model->model_id)) { | ||
87 | + $project = Project::findOne($model->model_id); | ||
88 | + if(!empty($project) && $project->user_id == \Yii::$app->user->id) { | ||
89 | + return true; | ||
90 | + } | ||
91 | + } | ||
92 | + return false; | ||
93 | + } | ||
94 | + ], | ||
95 | + ]; | ||
96 | + } | ||
97 | + | ||
98 | + /** | ||
99 | + * @param string $model | ||
100 | + * @param integer $model_id | ||
101 | + * | ||
102 | + * @return ActiveQuery | ||
103 | + */ | ||
104 | + public static function getComments($model, $model_id) | ||
105 | + { | ||
106 | + $query = self::find() | ||
107 | + ->where([ | ||
108 | + 'comment.model' => $model, | ||
109 | + 'comment.model_id' => $model_id, | ||
110 | + 'comment.status' => 1, | ||
111 | + 'comment.comment_pid' => NULL, | ||
112 | + ]) | ||
113 | + ->with('parent'); | ||
114 | + $project = Project::findOne($model_id); | ||
115 | + $user = \Yii::$app->user; | ||
116 | + if(empty( $user ) || $project->user_id != $user->id) { | ||
117 | + $query->innerJoin([ 'child' => 'comment' ], 'comment.comment_id = child.comment_pid') | ||
118 | + ->andWhere([ | ||
119 | + 'not', | ||
120 | + [ 'child.comment_id' => NULL ], | ||
121 | + ]); | ||
122 | + } | ||
123 | + return $query; | ||
124 | + } | ||
125 | + | ||
126 | + public function beforeDelete() | ||
127 | + { | ||
128 | + if(!empty($this->child)) { | ||
129 | + $this->child->delete(); | ||
130 | + } | ||
131 | + return parent::beforeDelete(); // TODO: Change the autogenerated stub | ||
132 | + } | ||
133 | + | ||
134 | + public function checkCreate() | ||
135 | + { | ||
136 | + if($this->getGuestComment()) { | ||
137 | + return true; | ||
138 | + } else { | ||
139 | + return \Yii::$app->user->can(\common\modules\comment\Permissions::CREATE, [ | ||
140 | + 'model' => $this->model, | ||
141 | + 'model_id' => $this->model_id, | ||
142 | + 'comment_model' => $this, | ||
143 | + ]); | ||
144 | + } | ||
145 | + } | ||
146 | + | ||
147 | + public function checkUpdate() | ||
148 | + { | ||
149 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
150 | + return false; | ||
151 | + } else { | ||
152 | + if(!empty($this->comment_pid) && $this->user_id == \Yii::$app->user->id) { | ||
153 | + return true; | ||
154 | + } | ||
155 | + } | ||
156 | + return false; | ||
157 | + } | ||
158 | + | ||
159 | + public function checkDelete() | ||
160 | + { | ||
161 | + if($this->scenario == self::SCENARIO_GUEST) { | ||
162 | + return false; | ||
163 | + } else { | ||
164 | + return ( \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE, [ | ||
165 | + 'model' => $this->model, | ||
166 | + 'model_id' => $this->model_id, | ||
167 | + 'comment' => $this, | ||
168 | + ]) || \Yii::$app->user->can(\common\modules\comment\Permissions::DELETE_OWN, [ | ||
169 | + 'model' => $this->model, | ||
170 | + 'model_id' => $this->model_id, | ||
171 | + 'comment' => $this, | ||
172 | + ]) ); | ||
173 | + } | ||
174 | + } | ||
175 | + | ||
176 | + public function checkReply() | ||
177 | + { | ||
178 | + if($this->scenario != self::SCENARIO_GUEST) { | ||
179 | + if(!$this->isNewRecord && empty( $this->comment_pid )) { | ||
180 | + $project = Project::findOne($this->model_id); | ||
181 | + if($project->user_id == \Yii::$app->user->id && empty($this->child)) { | ||
182 | + return true; | ||
183 | + } | ||
184 | + } elseif($this->isNewRecord && !empty($this->comment_pid)) { | ||
185 | + $parent = self::findOne($this->comment_pid); | ||
186 | + if(!empty($parent) && $parent->checkReply()) { | ||
187 | + return true; | ||
188 | + } | ||
189 | + } | ||
190 | + } | ||
191 | + return false; | ||
192 | + } | ||
193 | + | ||
194 | + public function getChild() | ||
195 | + { | ||
196 | + return $this->hasOne($this->className(), [ 'comment_pid' => 'comment_id' ]); | ||
197 | + } | ||
198 | + | ||
199 | + } |
common/modules/comment/models/CommentProjectSearch.php
1 | -<?php | ||
2 | - namespace common\modules\comment\models; | ||
3 | - | ||
4 | - use common\models\Currency; | ||
5 | - use common\models\File; | ||
6 | - use common\models\User; | ||
7 | - use yii\data\ActiveDataProvider; | ||
8 | - use yii\db\ActiveQuery; | ||
9 | - use yii\db\ActiveRecord; | ||
10 | - use yii\web\UploadedFile; | ||
11 | - | ||
12 | - /** | ||
13 | - * Class Comment | ||
14 | - * @property bool $guestComment | ||
15 | - * @property integer $comment_id | ||
16 | - * @property string $text | ||
17 | - * @property int $user_id | ||
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 string $files | ||
25 | - * @property float $budget_from | ||
26 | - * @property float $budget_to | ||
27 | - * @property int $term_from | ||
28 | - * @property int $term_to | ||
29 | - * @property int $state | ||
30 | - * @property Currency $currency | ||
31 | - * @package common\modules\comment\models | ||
32 | - */ | ||
33 | - class CommentProjectSearch extends CommentProject | ||
34 | - { | ||
35 | - | ||
36 | - const SCENARIO_SEARCH = 'search'; | ||
37 | - | ||
38 | - public function rules() | ||
39 | - { | ||
40 | - return [ | ||
41 | - [ | ||
42 | - [ | ||
43 | - 'state', | ||
44 | - ], | ||
45 | - 'integer', | ||
46 | - 'max' => 5, | ||
47 | - 'min' => 1, | ||
48 | - ], | ||
49 | - [ | ||
50 | - [ | ||
51 | - 'state', | ||
52 | - ], | ||
53 | - 'default', | ||
54 | - 'value' => self::STATE_NEW, | ||
55 | - ], | ||
56 | - ]; | ||
57 | - } | ||
58 | - | ||
59 | - public function scenarios() | ||
60 | - { | ||
61 | - return array_merge(parent::scenarios(), [ | ||
62 | - self::SCENARIO_SEARCH => [ | ||
63 | - 'state', | ||
64 | - ], | ||
65 | - ]); | ||
66 | - } | ||
67 | - | ||
68 | - public function search($params) | ||
69 | - { | ||
70 | - $query = CommentProject::find() | ||
71 | - ->with('project') | ||
72 | - ->with('project.budgetCurrency') | ||
73 | - ->with('project.comments') | ||
74 | - ->where([ 'user_id' => \Yii::$app->user->getId() ]); | ||
75 | - | ||
76 | - $dataProvider = new ActiveDataProvider([ | ||
77 | - 'query' => $query, | ||
78 | - ]); | ||
79 | - | ||
80 | - $this->load($params); | ||
81 | - | ||
82 | - if(!$this->validate()) { | ||
83 | - $query->andWhere('0=1'); | ||
84 | - return $dataProvider; | ||
85 | - } | ||
86 | - | ||
87 | - $query->andWhere([ 'state' => $this->state ]); | ||
88 | - | ||
89 | - return $dataProvider; | ||
90 | - } | ||
91 | - | ||
92 | - } | 1 | +<?php |
2 | + namespace common\modules\comment\models; | ||
3 | + | ||
4 | + use common\models\Currency; | ||
5 | + use common\models\File; | ||
6 | + use common\models\User; | ||
7 | + use yii\data\ActiveDataProvider; | ||
8 | + use yii\db\ActiveQuery; | ||
9 | + use yii\db\ActiveRecord; | ||
10 | + use yii\web\UploadedFile; | ||
11 | + | ||
12 | + /** | ||
13 | + * Class Comment | ||
14 | + * @property bool $guestComment | ||
15 | + * @property integer $comment_id | ||
16 | + * @property string $text | ||
17 | + * @property int $user_id | ||
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 string $files | ||
25 | + * @property float $budget_from | ||
26 | + * @property float $budget_to | ||
27 | + * @property int $term_from | ||
28 | + * @property int $term_to | ||
29 | + * @property int $state | ||
30 | + * @property Currency $currency | ||
31 | + * @package common\modules\comment\models | ||
32 | + */ | ||
33 | + class CommentProjectSearch extends CommentProject | ||
34 | + { | ||
35 | + | ||
36 | + const SCENARIO_SEARCH = 'search'; | ||
37 | + | ||
38 | + public function rules() | ||
39 | + { | ||
40 | + return [ | ||
41 | + [ | ||
42 | + [ | ||
43 | + 'state', | ||
44 | + ], | ||
45 | + 'integer', | ||
46 | + 'max' => 5, | ||
47 | + 'min' => 1, | ||
48 | + ], | ||
49 | + [ | ||
50 | + [ | ||
51 | + 'state', | ||
52 | + ], | ||
53 | + 'default', | ||
54 | + 'value' => self::STATE_NEW, | ||
55 | + ], | ||
56 | + ]; | ||
57 | + } | ||
58 | + | ||
59 | + public function scenarios() | ||
60 | + { | ||
61 | + return array_merge(parent::scenarios(), [ | ||
62 | + self::SCENARIO_SEARCH => [ | ||
63 | + 'state', | ||
64 | + ], | ||
65 | + ]); | ||
66 | + } | ||
67 | + | ||
68 | + public function search($params) | ||
69 | + { | ||
70 | + $query = CommentProject::find() | ||
71 | + ->with('project') | ||
72 | + ->with('project.budgetCurrency') | ||
73 | + ->with('project.comments') | ||
74 | + ->where([ 'user_id' => \Yii::$app->user->getId() ]); | ||
75 | + | ||
76 | + $dataProvider = new ActiveDataProvider([ | ||
77 | + 'query' => $query, | ||
78 | + ]); | ||
79 | + | ||
80 | + $this->load($params); | ||
81 | + | ||
82 | + if(!$this->validate()) { | ||
83 | + $query->andWhere('0=1'); | ||
84 | + return $dataProvider; | ||
85 | + } | ||
86 | + | ||
87 | + $query->andWhere([ 'state' => $this->state ]); | ||
88 | + | ||
89 | + return $dataProvider; | ||
90 | + } | ||
91 | + | ||
92 | + } |
common/modules/comment/models/Rating.php
1 | -<?php | ||
2 | - | ||
3 | -namespace common\modules\comment\models; | ||
4 | - | ||
5 | -use Yii; | ||
6 | - | ||
7 | -/** | ||
8 | - * This is the model class for table "rating". | ||
9 | - * | ||
10 | - * @property integer $rating_id | ||
11 | - * @property string $date_add | ||
12 | - * @property string $date_update | ||
13 | - * @property integer $user_id | ||
14 | - * @property integer $value | ||
15 | - * @property string $model | ||
16 | - * @property integer $model_id | ||
17 | - * | ||
18 | - * @property \common\models\User $user | ||
19 | - */ | ||
20 | -class Rating extends \yii\db\ActiveRecord | ||
21 | -{ | ||
22 | - | ||
23 | - public $rating; | ||
24 | - /** | ||
25 | - * @inheritdoc | ||
26 | - */ | ||
27 | - public static function tableName() | ||
28 | - { | ||
29 | - return 'rating'; | ||
30 | - } | ||
31 | - | ||
32 | - /** | ||
33 | - * @inheritdoc | ||
34 | - */ | ||
35 | - public function rules() | ||
36 | - { | ||
37 | - return [ | ||
38 | - [['value'], 'integer'], | ||
39 | - ]; | ||
40 | - } | ||
41 | - | ||
42 | - /** | ||
43 | - * @inheritdoc | ||
44 | - */ | ||
45 | - public function attributeLabels() | ||
46 | - { | ||
47 | - return [ | ||
48 | - 'rating_id' => Yii::t('app', 'Rating ID'), | ||
49 | - 'date_add' => Yii::t('app', 'Date Add'), | ||
50 | - 'date_update' => Yii::t('app', 'Date Update'), | ||
51 | - 'user_id' => Yii::t('app', 'User ID'), | ||
52 | - 'entity' => Yii::t('app', 'Entity'), | ||
53 | - 'value' => Yii::t('app', 'Value'), | ||
54 | - ]; | ||
55 | - } | ||
56 | - | ||
57 | - /** | ||
58 | - * @return \yii\db\ActiveQuery | ||
59 | - */ | ||
60 | - public function getUser() | ||
61 | - { | ||
62 | - return $this->hasOne(\common\models\User::className(), ['id' => 'user_id']); | ||
63 | - } | ||
64 | -} | 1 | +<?php |
2 | + | ||
3 | +namespace common\modules\comment\models; | ||
4 | + | ||
5 | +use Yii; | ||
6 | + | ||
7 | +/** | ||
8 | + * This is the model class for table "rating". | ||
9 | + * | ||
10 | + * @property integer $rating_id | ||
11 | + * @property string $date_add | ||
12 | + * @property string $date_update | ||
13 | + * @property integer $user_id | ||
14 | + * @property integer $value | ||
15 | + * @property string $model | ||
16 | + * @property integer $model_id | ||
17 | + * | ||
18 | + * @property \common\models\User $user | ||
19 | + */ | ||
20 | +class Rating extends \yii\db\ActiveRecord | ||
21 | +{ | ||
22 | + | ||
23 | + public $rating; | ||
24 | + /** | ||
25 | + * @inheritdoc | ||
26 | + */ | ||
27 | + public static function tableName() | ||
28 | + { | ||
29 | + return 'rating'; | ||
30 | + } | ||
31 | + | ||
32 | + /** | ||
33 | + * @inheritdoc | ||
34 | + */ | ||
35 | + public function rules() | ||
36 | + { | ||
37 | + return [ | ||
38 | + [['value'], 'integer'], | ||
39 | + ]; | ||
40 | + } | ||
41 | + | ||
42 | + /** | ||
43 | + * @inheritdoc | ||
44 | + */ | ||
45 | + public function attributeLabels() | ||
46 | + { | ||
47 | + return [ | ||
48 | + 'rating_id' => Yii::t('app', 'Rating ID'), | ||
49 | + 'date_add' => Yii::t('app', 'Date Add'), | ||
50 | + 'date_update' => Yii::t('app', 'Date Update'), | ||
51 | + 'user_id' => Yii::t('app', 'User ID'), | ||
52 | + 'entity' => Yii::t('app', 'Entity'), | ||
53 | + 'value' => Yii::t('app', 'Value'), | ||
54 | + ]; | ||
55 | + } | ||
56 | + | ||
57 | + /** | ||
58 | + * @return \yii\db\ActiveQuery | ||
59 | + */ | ||
60 | + public function getUser() | ||
61 | + { | ||
62 | + return $this->hasOne(\common\models\User::className(), ['id' => 'user_id']); | ||
63 | + } | ||
64 | +} |
common/modules/comment/rbac/ArtboxCommentCreateRule.php
1 | -<?php | ||
2 | - | ||
3 | - namespace common\modules\comment\rbac; | ||
4 | - | ||
5 | - use yii\rbac\Rule; | ||
6 | - | ||
7 | - class ArtboxCommentCreateRule extends Rule | ||
8 | - { | ||
9 | - | ||
10 | - public $name = 'canCommentCreateArtbox'; | ||
11 | - | ||
12 | - public function execute($user, $item, $params) | ||
13 | - { | ||
14 | - if($params[ 'model' ] == \common\models\Project::className()) { | ||
15 | - return $this->checkProject($user, $item, $params); | ||
16 | - } | ||
17 | - return true; | ||
18 | - } | ||
19 | - | ||
20 | - public function checkProject($user, $item, $params) | ||
21 | - { | ||
22 | - $project = \common\models\Project::findOne($params['model_id']); | ||
23 | - if($project->user_id == $user) { | ||
24 | - return false; | ||
25 | - } | ||
26 | - $comment = \common\modules\comment\models\CommentProject::find() | ||
27 | - ->where([ 'model' => $params[ 'model' ], | ||
28 | - 'model_id' => $params[ 'model_id' ], | ||
29 | - 'user_id' => $user, | ||
30 | - ])->one(); | ||
31 | - if(empty($comment)) { | ||
32 | - return true; | ||
33 | - } else { | ||
34 | - return false; | ||
35 | - } | ||
36 | - } | ||
37 | - | 1 | +<?php |
2 | + | ||
3 | + namespace common\modules\comment\rbac; | ||
4 | + | ||
5 | + use common\modules\comment\models\CommentProject; | ||
6 | + use yii\rbac\Rule; | ||
7 | + | ||
8 | + class ArtboxCommentCreateRule extends Rule | ||
9 | + { | ||
10 | + | ||
11 | + public $name = 'canCommentCreateArtbox'; | ||
12 | + | ||
13 | + public function execute($user, $item, $params) | ||
14 | + { | ||
15 | + if($params[ 'model' ] == \common\models\Project::className() && !empty($params['comment_model']) && $params['comment_model'] == CommentProject::className()) { | ||
16 | + return $this->checkProject($user, $item, $params); | ||
17 | + } | ||
18 | + return true; | ||
19 | + } | ||
20 | + | ||
21 | + public function checkProject($user, $item, $params) | ||
22 | + { | ||
23 | + $project = \common\models\Project::findOne($params['model_id']); | ||
24 | + if($project->user_id == $user) { | ||
25 | + return false; | ||
26 | + } | ||
27 | + $comment = \common\modules\comment\models\CommentProject::find() | ||
28 | + ->where([ 'model' => $params[ 'model' ], | ||
29 | + 'model_id' => $params[ 'model_id' ], | ||
30 | + 'user_id' => $user, | ||
31 | + ])->one(); | ||
32 | + if(empty($comment)) { | ||
33 | + return true; | ||
34 | + } else { | ||
35 | + return false; | ||
36 | + } | ||
37 | + } | ||
38 | + | ||
38 | } | 39 | } |
39 | \ No newline at end of file | 40 | \ No newline at end of file |
common/modules/comment/rbac/ArtboxCommentDeleteOwnRule.php
1 | -<?php | ||
2 | - | ||
3 | - namespace common\modules\comment\rbac; | ||
4 | - | ||
5 | - use yii\rbac\Rule; | ||
6 | - | ||
7 | - class ArtboxCommentDeleteOwnRule extends Rule | ||
8 | - { | ||
9 | - | ||
10 | - public $name = 'canCommentDeleteOwnArtbox'; | ||
11 | - | ||
12 | - public function execute($user, $item, $params) | ||
13 | - { | ||
14 | - return true; | ||
15 | - } | ||
16 | - | 1 | +<?php |
2 | + | ||
3 | + namespace common\modules\comment\rbac; | ||
4 | + | ||
5 | + use yii\rbac\Rule; | ||
6 | + | ||
7 | + class ArtboxCommentDeleteOwnRule extends Rule | ||
8 | + { | ||
9 | + | ||
10 | + public $name = 'canCommentDeleteOwnArtbox'; | ||
11 | + | ||
12 | + public function execute($user, $item, $params) | ||
13 | + { | ||
14 | + if(!empty($params['comment'])) { | ||
15 | + if($params['comment']->user_id == \Yii::$app->user->id) { | ||
16 | + return true; | ||
17 | + } | ||
18 | + } | ||
19 | + return false; | ||
20 | + } | ||
21 | + | ||
17 | } | 22 | } |
18 | \ No newline at end of file | 23 | \ No newline at end of file |
common/modules/comment/rbac/ArtboxCommentDeleteRule.php
1 | -<?php | ||
2 | - | ||
3 | - namespace common\modules\comment\rbac; | ||
4 | - | ||
5 | - use yii\rbac\Rule; | ||
6 | - | ||
7 | - class ArtboxCommentDeleteRule extends Rule | ||
8 | - { | ||
9 | - | ||
10 | - public $name = 'canCommentDeleteArtbox'; | ||
11 | - | ||
12 | - public function execute($user, $item, $params) | ||
13 | - { | ||
14 | - return true; | ||
15 | - } | ||
16 | - | 1 | +<?php |
2 | + | ||
3 | + namespace common\modules\comment\rbac; | ||
4 | + | ||
5 | + use common\models\User; | ||
6 | + use yii\db\ActiveRecord; | ||
7 | + use yii\rbac\Rule; | ||
8 | + | ||
9 | + class ArtboxCommentDeleteRule extends Rule | ||
10 | + { | ||
11 | + | ||
12 | + public $name = 'canCommentDeleteArtbox'; | ||
13 | + | ||
14 | + public function execute($user, $item, $params) | ||
15 | + { | ||
16 | + /** | ||
17 | + * @var ActiveRecord $model | ||
18 | + */ | ||
19 | + if(!empty($params['model']) && !empty($params['model_id'])) { | ||
20 | + $model = new $params['model']; | ||
21 | + if($model instanceof ActiveRecord) { | ||
22 | + $model = $model::findOne($params['model_id']); | ||
23 | + if($model->hasAttribute('user_id') && $model->user_id == \Yii::$app->user->id) { | ||
24 | + return true; | ||
25 | + } elseif($model instanceof User && $model->id == \Yii::$app->user->id) { | ||
26 | + return true; | ||
27 | + } | ||
28 | + } | ||
29 | + } | ||
30 | + return false; | ||
31 | + } | ||
32 | + | ||
17 | } | 33 | } |
18 | \ No newline at end of file | 34 | \ No newline at end of file |
common/modules/comment/rbac/ArtboxCommentUpdateOwnRule.php
1 | -<?php | ||
2 | - | ||
3 | - namespace common\modules\comment\rbac; | ||
4 | - | ||
5 | - use yii\rbac\Rule; | ||
6 | - | ||
7 | - class ArtboxCommentUpdateOwnRule extends Rule | ||
8 | - { | ||
9 | - | ||
10 | - public $name = 'canCommentUpdateOwnArtbox'; | ||
11 | - | ||
12 | - public function execute($user, $item, $params) | ||
13 | - { | ||
14 | - return false; | ||
15 | - } | ||
16 | - | 1 | +<?php |
2 | + | ||
3 | + namespace common\modules\comment\rbac; | ||
4 | + | ||
5 | + use yii\rbac\Rule; | ||
6 | + | ||
7 | + class ArtboxCommentUpdateOwnRule extends Rule | ||
8 | + { | ||
9 | + | ||
10 | + public $name = 'canCommentUpdateOwnArtbox'; | ||
11 | + | ||
12 | + public function execute($user, $item, $params) | ||
13 | + { | ||
14 | + if($params['comment']->user_id == \Yii::$app->user->id) { | ||
15 | + return true; | ||
16 | + } | ||
17 | + return false; | ||
18 | + } | ||
19 | + | ||
17 | } | 20 | } |
18 | \ No newline at end of file | 21 | \ No newline at end of file |
common/modules/comment/rbac/ArtboxCommentUpdateRule.php
1 | -<?php | ||
2 | - | ||
3 | - namespace common\modules\comment\rbac; | ||
4 | - | ||
5 | - use yii\rbac\Rule; | ||
6 | - | ||
7 | - class ArtboxCommentUpdateRule extends Rule | ||
8 | - { | ||
9 | - | ||
10 | - public $name = 'canCommentUpdateArtbox'; | ||
11 | - | ||
12 | - public function execute($user, $item, $params) | ||
13 | - { | ||
14 | - return true; | ||
15 | - } | ||
16 | - | 1 | +<?php |
2 | + | ||
3 | + namespace common\modules\comment\rbac; | ||
4 | + | ||
5 | + use yii\rbac\Rule; | ||
6 | + | ||
7 | + class ArtboxCommentUpdateRule extends Rule | ||
8 | + { | ||
9 | + | ||
10 | + public $name = 'canCommentUpdateArtbox'; | ||
11 | + | ||
12 | + public function execute($user, $item, $params) | ||
13 | + { | ||
14 | + return false; | ||
15 | + } | ||
16 | + | ||
17 | } | 17 | } |
18 | \ No newline at end of file | 18 | \ No newline at end of file |
common/modules/comment/resources/comment.css
1 | -.artbox_comment_reply_author, .artbox_comment_update_reply { | ||
2 | - position: relative; | ||
3 | - width: 25%; | ||
4 | -} | ||
5 | -.artbox_comment_update_reply { | ||
6 | - width: 25%; | ||
7 | - float: none; | ||
8 | -} | ||
9 | -.artbox_comment_reply_author:after, .artbox_comment_update_reply:after { | ||
10 | - content: ''; | ||
11 | - background-image: url('delete-ico.png'); | ||
12 | - display: block; | ||
13 | - position: absolute; | ||
14 | - right: -13px; | ||
15 | - width: 13px; | ||
16 | - height: 13px; | ||
17 | - top: 0; | ||
18 | - cursor: pointer; | ||
19 | -} | ||
20 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +.artbox_comment_reply_author, .artbox_comment_update_reply { | ||
3 | + position: relative; | ||
4 | + width: 25%; | ||
5 | +} | ||
6 | +.artbox_comment_update_reply { | ||
7 | + width: 25%; | ||
8 | + float: none; | ||
9 | +} | ||
10 | +.artbox_comment_reply_author:after, .artbox_comment_update_reply:after { | ||
11 | + content: ''; | ||
12 | + background-image: url('delete-ico.png'); | ||
13 | + display: block; | ||
14 | + position: absolute; | ||
15 | + right: -13px; | ||
16 | + width: 13px; | ||
17 | + height: 13px; | ||
18 | + top: 0; | ||
19 | + cursor: pointer; | ||
20 | +} | ||
21 | +.removeable { | ||
22 | + color: #a94442; | ||
23 | + background-color: #f2dede; | ||
24 | + border-color: #ebccd1; | ||
25 | + border-radius: 4px; | ||
26 | + padding: 15px; | ||
27 | + padding-right: 35px; | ||
28 | + position: relative; | ||
29 | +} | ||
30 | +.removeable::after { | ||
31 | + content: ' '; | ||
32 | + display: block; | ||
33 | + position: absolute; | ||
34 | + right: 5px; | ||
35 | + top: 5px; | ||
36 | + width: 15px; | ||
37 | + height: 15px; | ||
38 | + background: url('delete-ico.png'); | ||
39 | + background-size: cover; | ||
40 | + cursor: pointer; | ||
41 | +} | ||
42 | + | ||
43 | +/* For default styling */ | ||
44 | +.new-portf-comments-wr { | ||
45 | + margin-top: 28px | ||
46 | +} | ||
47 | + | ||
48 | +.new-portf-comm-count { | ||
49 | + font-size: 18px | ||
50 | +} | ||
51 | + | ||
52 | +.input-blocks-comm { | ||
53 | + width: 230px; | ||
54 | + float: left; | ||
55 | + margin-left: 34px; | ||
56 | + position: relative; | ||
57 | +} | ||
58 | + | ||
59 | +.input-blocks-comm:first-child { | ||
60 | + margin-left: 0 | ||
61 | +} | ||
62 | + | ||
63 | +.new-portf-add-comm { | ||
64 | + padding: 24px 20px 30px 20px; | ||
65 | + box-sizing: border-box; | ||
66 | + margin-top: 10px; | ||
67 | + background: #f1f1f1; | ||
68 | +} | ||
69 | + | ||
70 | +.input-blocks-comm.area-comm { | ||
71 | + width: 680px; | ||
72 | + margin-left: 0; | ||
73 | + margin-top: 10px; | ||
74 | + position: relative; | ||
75 | +} | ||
76 | + | ||
77 | +.tender_questions_ .input-blocks-comm.area-comm { | ||
78 | + margin-top: 15px; | ||
79 | +} | ||
80 | + | ||
81 | +.custom-input-4 { | ||
82 | + width: 230px; | ||
83 | + height: 32px; | ||
84 | + border: 0; | ||
85 | + box-sizing: border-box; | ||
86 | + outline: none; | ||
87 | + color: #333; | ||
88 | + font-size: 13px; | ||
89 | + line-height: 29px; | ||
90 | + padding-left: 8px; | ||
91 | + margin-top: 5px; | ||
92 | +} | ||
93 | + | ||
94 | +.custom-area-4 { | ||
95 | + min-height: 142px; | ||
96 | + max-height: 142px; | ||
97 | + resize: none; | ||
98 | + width: 100%; | ||
99 | + max-width: 100%; | ||
100 | + border: 0; | ||
101 | + box-sizing: border-box; | ||
102 | + outline: none; | ||
103 | + color: #636363; | ||
104 | + font-size: 13px; | ||
105 | + padding-left: 8px; | ||
106 | + padding-top: 8px; | ||
107 | + margin-top: 5px; | ||
108 | +} | ||
109 | + | ||
110 | +.input-blocks-comm label { | ||
111 | + font-size: 13px; | ||
112 | + color: #454545; | ||
113 | + font-weight: 700; | ||
114 | +} | ||
115 | + | ||
116 | +.custom-area-4:focus, .custom-input-4:focus { | ||
117 | + box-shadow: 1px 2px 2px 0px rgba(215, 215, 215, 0.75) inset; | ||
118 | + transition: 0.1s; | ||
119 | + outline: none | ||
120 | +} | ||
121 | + | ||
122 | +.input-blocks-comm-button { | ||
123 | + text-align: right; | ||
124 | + margin-top: 16px | ||
125 | +} | ||
126 | + | ||
127 | +.input-blocks-comm-button button { | ||
128 | + background: #0072bc; | ||
129 | + color: #fff; | ||
130 | + font-size: 13px; | ||
131 | + height: 27px; | ||
132 | + outline: none; | ||
133 | + cursor: pointer; | ||
134 | + border-radius: 4px; | ||
135 | + padding: 0 17px; | ||
136 | + border: 1px solid #0072bc; | ||
137 | +} | ||
138 | + | ||
139 | +.input-blocks-comm-button button:hover { | ||
140 | + background: none; | ||
141 | + color: #0072bc; | ||
142 | + transition: 0.2s; | ||
143 | +} | ||
144 | + | ||
145 | +.input-blocks-comm-button button:focus, .input-blocks-comm-button button:active { | ||
146 | + background: #035b94; | ||
147 | + color: #fff | ||
148 | +} | ||
149 | + | ||
150 | +.new-portf-comm-read-wr { | ||
151 | + margin-top: 29px | ||
152 | +} | ||
153 | + | ||
154 | +.new-portf-comm-read { | ||
155 | + width: 100%; | ||
156 | + float: left; | ||
157 | + padding-bottom: 13px; | ||
158 | + border-bottom: 1px solid #dcdcdc; | ||
159 | + margin-top: 30px; | ||
160 | +} | ||
161 | + | ||
162 | +.new-portf-comm-read:first-child { | ||
163 | + /*margin-top: 0*/ | ||
164 | +} | ||
165 | + | ||
166 | +.new-prof-wrapper-read { | ||
167 | + float: left; | ||
168 | + margin-left: 13px; | ||
169 | +} | ||
170 | + | ||
171 | +.new-portf-comm-read-title a { | ||
172 | + font-size: 13px; | ||
173 | + text-decoration: none; | ||
174 | + color: #0072bc; | ||
175 | +} | ||
176 | + | ||
177 | +.new-portf-comm-read-title a:hover { | ||
178 | + text-decoration: underline | ||
179 | +} | ||
180 | + | ||
181 | +.new-portf-comm-read-title { | ||
182 | + margin-top: -5px; | ||
183 | +} | ||
184 | + | ||
185 | +.new-portf-comm-read-rating { | ||
186 | + height: 30px; | ||
187 | + box-sizing: border-box; | ||
188 | + padding-top: 1px | ||
189 | +} | ||
190 | + | ||
191 | +.new-portf-comm-read-rating .rating { | ||
192 | + margin-top: 8px | ||
193 | +} | ||
194 | + | ||
195 | +.new-portf-comm-read-rating .vote-stars, .new-portf-comm-read-rating .vote-active, .new-portfolio-rating .vote-stars, .new-portfolio-rating .vote-active { | ||
196 | + cursor: pointer !important; | ||
197 | +} | ||
198 | + | ||
199 | +.new-portf-answer { | ||
200 | + width: 100%; | ||
201 | + float: left; | ||
202 | + font-size: 13px; | ||
203 | + line-height: 20px; | ||
204 | + margin-top: 10px; | ||
205 | +} | ||
206 | + | ||
207 | +.new-portf-answer p { | ||
208 | + width: 100%; | ||
209 | + float: left; | ||
210 | + font-size: 13px; | ||
211 | + line-height: 20px; | ||
212 | +} | ||
213 | + | ||
214 | +.new-portf-answer p:first-child { | ||
215 | + margin-top: 0 | ||
216 | +} | ||
217 | +.style { | ||
218 | + width: 100%; | ||
219 | + float: left; | ||
220 | +} | ||
221 | + | ||
222 | +/***proektant_comments***/ | ||
223 | +ul.proektant-comments { | ||
224 | + margin-top: 15px | ||
225 | +} | ||
226 | + | ||
227 | +.proektant-comments li { | ||
228 | + width: 100%; | ||
229 | + float: left; | ||
230 | + list-style: none; | ||
231 | + border-bottom: 1px solid #dcdcdc; | ||
232 | + padding-bottom: 20px; | ||
233 | + margin-top: 27px; | ||
234 | +} | ||
235 | + | ||
236 | +.proektant-comments li:first-child { | ||
237 | + margin-top: 0 | ||
238 | +} | ||
239 | + | ||
240 | +.proektant-comments li > div { | ||
241 | + float: left; | ||
242 | + width: 100%; | ||
243 | + font-size: 13px | ||
244 | +} | ||
245 | + | ||
246 | +.comments-name { | ||
247 | + font-weight: 700 | ||
248 | +} | ||
249 | + | ||
250 | +.comments-project-link a { | ||
251 | + color: #0073bc; | ||
252 | + text-decoration: underline; | ||
253 | + | ||
254 | +} | ||
255 | + | ||
256 | +.comments-status span { | ||
257 | + color: #0072bc; | ||
258 | + border-bottom: 1px dashed #0072bc; | ||
259 | +} | ||
260 | + | ||
261 | +.comments-status, .comments-date, .proektant-comments .rating { | ||
262 | + margin-top: 3px | ||
263 | +} | ||
264 | + | ||
265 | +.comments-content { | ||
266 | + line-height: 18px; | ||
267 | + margin-top: 11px | ||
268 | +} | ||
269 | + | ||
270 | +.comments-project-link { | ||
271 | + margin-top: 19px | ||
272 | +} |
common/modules/comment/resources/comment.js
1 | -$(function() { | ||
2 | - | ||
3 | - $(document).on('click', '.artbox_comment_delete', function() { | ||
4 | - var container = $(this).parents('.artbox_comment_container'); | ||
5 | - var comment_id = $(container).data('comment_id'); | ||
6 | - var form_name = $(container).data('form_name'); | ||
7 | - if(confirm("ะฃะฒะตัะตะฝั, ััะพ ั ะพัะธัะต ัะดะฐะปะธัั ะบะพะผะผะตะฝัะฐัะธะน?")) { | ||
8 | - $.post( | ||
9 | - '/artbox-comment/delete', | ||
10 | - { | ||
11 | - Comment: { | ||
12 | - comment_id: comment_id | ||
13 | - } | ||
14 | - }, | ||
15 | - function(data, textStatus, jqXHR) { | ||
16 | - if(!data.error) { | ||
17 | - $(container).after('<p class="removeable">'+data.text+'</p>'); | ||
18 | - $(container).remove(); | ||
19 | - } else { | ||
20 | - $(container).prepend('<p class="removeable error_message">'+data.error+'</p>') | ||
21 | - } | ||
22 | - } | ||
23 | - ); | ||
24 | - } | ||
25 | - }); | ||
26 | - | ||
27 | - $(document).on('click', '.artbox_comment_reply', function() { | ||
28 | - var container = $(this).parents('.artbox_comment_container').first(); | ||
29 | - var comment_id = $(container).data('comment_id'); | ||
30 | - var form_name = $(container).data('form_name'); | ||
31 | - var author = $(container).find('.artbox_comment_author').first().text(); | ||
32 | - var comment_form = $('.artbox_comment_form').first(); | ||
33 | - var offset = $(comment_form).offset(); | ||
34 | - var reply_block = $(comment_form).find('.artbox_comment_reply_block').first(); | ||
35 | - $(reply_block).empty(); | ||
36 | - $(reply_block).append('<input type="hidden" name="'+form_name+'[comment_pid]" value="'+comment_id+'">'); | ||
37 | - $(reply_block).append('<p class="artbox_comment_reply_author">'+author+'</p>'); | ||
38 | - $('html, body').animate({ | ||
39 | - scrollTop: offset.top - 50, | ||
40 | - }); | ||
41 | - }); | ||
42 | - | ||
43 | - $(document).on('click', '.artbox_comment_reply_author', function() { | ||
44 | - $(this).parents('.artbox_comment_reply_block').first().empty(); | ||
45 | - }); | ||
46 | - | ||
47 | - $(document).on('click', '.artbox_comment_update', function() { | ||
48 | - $(this).removeClass('artbox_comment_update'); | ||
49 | - $(this).text('ะกะพั ัะฐะฝะธัั'); | ||
50 | - $(this).addClass('artbox_comment_update_submit'); | ||
51 | - var container = $(this).parents('.artbox_comment_container').first(); | ||
52 | - var comment_id = $(container).data('comment_id'); | ||
53 | - var form_name = $(container).data('form_name'); | ||
54 | - var text = $(container).find('.artbox_comment_text'); | ||
55 | - var object = {}; | ||
56 | - object[form_name] = {comment_id: comment_id}; | ||
57 | - $.post( | ||
58 | - '/artbox-comment/form', | ||
59 | - object, | ||
60 | - function(data, textStatus, jqXHR) { | ||
61 | - $(text).hide(); | ||
62 | - $(text).after( | ||
63 | - '<div class="artbox_comment_text_edit new-portf-answer">' | ||
64 | - + data | ||
65 | - + '</div>' | ||
66 | - ); | ||
67 | - } | ||
68 | - ); | ||
69 | - }); | ||
70 | - | ||
71 | - $(document).on('click', '.artbox_comment_update_reply', function() { | ||
72 | - $(this).remove(); | ||
73 | - }); | ||
74 | - | ||
75 | - $(document).on('click', '.artbox_comment_update_submit', function(e) { | ||
76 | - e.preventDefault(); | ||
77 | - var container = $(this).parents('.artbox_comment_container').first(); | ||
78 | - var edit = $(container).find('.artbox_comment_text_edit').first(); | ||
79 | - $.post( | ||
80 | - '/artbox-comment/update', | ||
81 | - $(edit).find('form').serialize(), | ||
82 | - function(data) { | ||
83 | - if(!data.error) { | ||
84 | - location.reload(true); | ||
85 | - } | ||
86 | - } | ||
87 | - ) | ||
88 | - }); | ||
89 | -}); | ||
90 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +$(function() { | ||
3 | + | ||
4 | + function addRemoveBlocks(data) | ||
5 | + { | ||
6 | + $('#overlay, .succses_comm').remove(); | ||
7 | + $('body').append('<div id="overlay" style="top:0; left:0;"></div>').append('<div class="succses_comm"><div class="closed-form"></div><div class="succses_comm-txt">'+data.text+'</div></div>'); | ||
8 | + $('#overlay').fadeIn( | ||
9 | + 400, function() | ||
10 | + { | ||
11 | + $('.succses_comm').css({display : 'block'}).animate({opacity : 1, top : '50%'}, 200); | ||
12 | + } | ||
13 | + ); | ||
14 | + function closeSuccsescomm() { | ||
15 | + $('.succses_comm') | ||
16 | + .animate( | ||
17 | + {opacity : 0, top : '30%'}, 200, function() | ||
18 | + { | ||
19 | + $(this).css('display', 'none') | ||
20 | + $('#overlay').fadeOut( | ||
21 | + 400, function() | ||
22 | + { | ||
23 | + $('#overlay, .succses_comm').remove() | ||
24 | + } | ||
25 | + ) | ||
26 | + } | ||
27 | + ) | ||
28 | + } | ||
29 | + $('body').on('click', '.closed-form, #overlay', function() { | ||
30 | + closeSuccsescomm() | ||
31 | + } | ||
32 | + ); | ||
33 | + | ||
34 | + setTimeout(closeSuccsescomm, 4000) | ||
35 | + } | ||
36 | + | ||
37 | + $(document).on('click', '.artbox_comment_container .removeable', function(e) { | ||
38 | + e.preventDefault(); | ||
39 | + $(this).parent().remove(); | ||
40 | +// var container = $(this).parents('.artbox_comment_container'); | ||
41 | +// $(container).remove(); | ||
42 | + }); | ||
43 | + | ||
44 | + $(document).on( | ||
45 | + 'click', '.artbox_comment_delete', function(e) | ||
46 | + { | ||
47 | + e.preventDefault(); | ||
48 | + var container = $(this).parents('.artbox_comment_container'); | ||
49 | + var comment_id = $(container).data('key'); | ||
50 | + var form_name = $(container).data('form'); | ||
51 | + if(confirm("ะฃะฒะตัะตะฝั, ััะพ ั ะพัะธัะต ัะดะฐะปะธัั ะบะพะผะผะตะฝัะฐัะธะน?")) | ||
52 | + { | ||
53 | + $.post( | ||
54 | + '/artbox-comment/delete', { | ||
55 | + Comment : { | ||
56 | + comment_id : comment_id | ||
57 | + } | ||
58 | + }, function(data, textStatus, jqXHR) | ||
59 | + { | ||
60 | + if(!data.error) | ||
61 | + { | ||
62 | + { | ||
63 | + $(container).remove(); | ||
64 | + addRemoveBlocks(data) | ||
65 | + // $(container).append('<p class="removeable">' + data.text + '</p>'); | ||
66 | + } | ||
67 | + } else | ||
68 | + { | ||
69 | + $(container).prepend('<p class="removeable error_message">' + data.error + '</p>') | ||
70 | + } | ||
71 | + } | ||
72 | + ); | ||
73 | + } | ||
74 | + } | ||
75 | + ); | ||
76 | + | ||
77 | + $(document).on( | ||
78 | + 'click', '.artbox_comment_reply', function(e) | ||
79 | + { | ||
80 | + e.preventDefault(); | ||
81 | + var container = $(this).parents('.artbox_comment_container').first(); | ||
82 | + var comment_id = $(container).data('key'); | ||
83 | + var form_name = $(container).data('form'); | ||
84 | + var author = $(container).find('.artbox_comment_author').first().text(); | ||
85 | + var comment_form = $(container).parents('.artbox_comment_widget').find('.artbox_comment_form').first(); | ||
86 | + var offset = $(comment_form).offset(); | ||
87 | + var reply_block = $(comment_form).find('.artbox_comment_reply_block').first(); | ||
88 | + $(reply_block).empty(); | ||
89 | + $(reply_block).append('<input type="hidden" name="' + form_name + '[comment_pid]" value="' + comment_id + '">'); | ||
90 | + $(reply_block).append('<p class="artbox_comment_reply_author">' + author + '</p>'); | ||
91 | + $('html, body').animate( | ||
92 | + { | ||
93 | + scrollTop : offset.top - 50, | ||
94 | + } | ||
95 | + ); | ||
96 | + } | ||
97 | + ); | ||
98 | + | ||
99 | + $(document).on( | ||
100 | + 'click', '.artbox_comment_reply_author', function() | ||
101 | + { | ||
102 | + $(this).parents('.artbox_comment_reply_block').first().empty(); | ||
103 | + } | ||
104 | + ); | ||
105 | + | ||
106 | + $(document).on( | ||
107 | + 'click', '.artbox_comment_update', function(e) | ||
108 | + { | ||
109 | + e.preventDefault(); | ||
110 | + var container = $(this).parents('.artbox_comment_container').first(); | ||
111 | + var comment_id = $(container).data('key'); | ||
112 | + var form_name = $(container).data('form'); | ||
113 | + var object = {}; | ||
114 | + object[form_name] = {comment_id : comment_id}; | ||
115 | + $.post( | ||
116 | + '/artbox-comment/form', object, function(data, textStatus, jqXHR) | ||
117 | + { | ||
118 | + $(container).empty(); | ||
119 | + $(container).append(data.result.form); | ||
120 | + } | ||
121 | + ); | ||
122 | + } | ||
123 | + ); | ||
124 | + | ||
125 | + // @TODO What is this | ||
126 | + $(document).on( | ||
127 | + 'click', '.artbox_comment_update_reply', function() | ||
128 | + { | ||
129 | + $(this).remove(); | ||
130 | + } | ||
131 | + ); | ||
132 | + | ||
133 | + $(document).on( | ||
134 | + 'click', '.artbox_comment_update_submit', function(e) | ||
135 | + { | ||
136 | + e.preventDefault(); | ||
137 | + var container = $(this).parents('.artbox_comment_container').first(); | ||
138 | + $.post( | ||
139 | + '/artbox-comment/update', $(container).find('form').serialize(), function(data) | ||
140 | + { | ||
141 | + $(container).empty(); | ||
142 | + if(!data.error) | ||
143 | + { | ||
144 | + $(container).append('<p>'+data.result.text+'</p>'); | ||
145 | + $(container).append(data.result.html); | ||
146 | + } else { | ||
147 | + $(container).append(data.form); | ||
148 | + } | ||
149 | + } | ||
150 | + ) | ||
151 | + } | ||
152 | + ); | ||
153 | + | ||
154 | + $(document).on( | ||
155 | + 'click', '.artbox_comment_update_answer', function(e) | ||
156 | + { | ||
157 | + e.preventDefault(); | ||
158 | + var container = $(this).parents('.artbox_comment_container').first(); | ||
159 | + var comment_id = $(container).data('key'); | ||
160 | + var form_name = $(container).data('form'); | ||
161 | + var object = {}; | ||
162 | + object[form_name] = {comment_id : comment_id}; | ||
163 | + $.post( | ||
164 | + '/artbox-comment/form-answer', object, function(data, textStatus, jqXHR) | ||
165 | + { | ||
166 | + $(container).empty(); | ||
167 | + $(container).append(data.result.form); | ||
168 | + } | ||
169 | + ); | ||
170 | + } | ||
171 | + ); | ||
172 | + | ||
173 | + $(document).on( | ||
174 | + 'click', '.artbox_comment_update_answer_submit', function(e) | ||
175 | + { | ||
176 | + e.preventDefault(); | ||
177 | + var container = $(this).parents('.artbox_comment_container').first(); | ||
178 | + $.post( | ||
179 | + '/artbox-comment/update-answer', $(container).find('form').serialize(), function(data) | ||
180 | + { | ||
181 | + $(container).empty(); | ||
182 | + if(!data.error) | ||
183 | + { | ||
184 | + $(container).append('<p>'+data.result.text+'</p>'); | ||
185 | + $(container).append(data.result.html); | ||
186 | + } else { | ||
187 | + $(container).append(data.form); | ||
188 | + } | ||
189 | + } | ||
190 | + ) | ||
191 | + } | ||
192 | + ); | ||
193 | + | ||
194 | + $(document).on( | ||
195 | + 'click', '.artbox_comment_delete_answer', function(e) | ||
196 | + { | ||
197 | + e.preventDefault(); | ||
198 | + var container = $(this).parents('.artbox_comment_container'); | ||
199 | + var comment_id = $(container).data('key'); | ||
200 | + var form_name = $(container).data('form'); | ||
201 | + if(confirm("ะฃะฒะตัะตะฝั, ััะพ ั ะพัะธัะต ัะดะฐะปะธัั ะฒะพะฟัะพั?")) | ||
202 | + { | ||
203 | + $.post( | ||
204 | + '/artbox-comment/delete-answer', { | ||
205 | + CommentProjectAnswer : { | ||
206 | + comment_id : comment_id | ||
207 | + } | ||
208 | + }, function(data, textStatus, jqXHR) | ||
209 | + { | ||
210 | + if(!data.error) | ||
211 | + { | ||
212 | + $(container).remove(); | ||
213 | + addRemoveBlocks(data) | ||
214 | + } else | ||
215 | + { | ||
216 | + $(container).prepend('<p class="removeable error_message">' + data.error + '</p>') | ||
217 | + } | ||
218 | + } | ||
219 | + ); | ||
220 | + } | ||
221 | + } | ||
222 | + ); | ||
223 | + | ||
224 | + $(document).on('click', '.artbox_comment_reply_answer', function(e) { | ||
225 | + e.preventDefault(); | ||
226 | + var widget = $(this).parents('.artbox_comment_widget'); | ||
227 | + var form = $(widget).find('.artbox_comment_form'); | ||
228 | + $(form).removeClass('hidden'); | ||
229 | + $(widget).find('.artbox_comment_answer_label').text('ะัะฒะตั'); | ||
230 | + }); | ||
231 | + | ||
232 | + $(document).on('click', '.artbox_comment_reply_answer_block', function(e) { | ||
233 | + var form = $(this).parents('.artbox_comment_form'); | ||
234 | + $(form).addClass('hidden'); | ||
235 | + $(form).find('.artbox_comment_answer_label').text('ะะพะฟัะพั'); | ||
236 | + }); | ||
237 | + | ||
238 | +}); |
common/modules/comment/views/comment_form.php
1 | -<?php | ||
2 | - /** | ||
3 | - * @var \common\modules\comment\models\Comment $model | ||
4 | - */ | ||
5 | - use yii\widgets\ActiveForm; | ||
6 | - | ||
7 | - $form = ActiveForm::begin(); | ||
8 | - | ||
9 | -?> | ||
10 | -<?php | ||
11 | - echo $form->field($model, 'comment_id') | ||
12 | - ->label(false) | ||
13 | - ->hiddenInput(); | ||
14 | - if(!empty( $model->parent )) { | ||
15 | - ?> | ||
16 | - <div class="artbox_comment_update_reply"> | ||
17 | - <?php | ||
18 | - echo "<span>"; | ||
19 | - if(!empty( $model->parent->author )) { | ||
20 | - echo $model->parent->author->firstname . ' ' . $model->parent->author->lastname; | ||
21 | - } else { | ||
22 | - echo $model->parent->user_name; | ||
23 | - } | ||
24 | - echo "</span>"; | ||
25 | - echo $form->field($model, 'comment_pid') | ||
26 | - ->label(false) | ||
27 | - ->hiddenInput(); | ||
28 | - ?> | ||
29 | - </div> | ||
30 | - <?php | ||
31 | - } | ||
32 | - echo $form->field($model, 'text') | ||
33 | - ->label(false) | ||
34 | - ->textarea(); | ||
35 | -?> | ||
36 | -<?php | ||
37 | - $form->end(); | 1 | +<?php |
2 | + /** | ||
3 | + * @var \common\modules\comment\models\Comment $model | ||
4 | + */ | ||
5 | + use yii\widgets\ActiveForm; | ||
6 | + | ||
7 | + $form = ActiveForm::begin(); | ||
8 | + | ||
9 | +?> | ||
10 | +<?php | ||
11 | + echo $form->field($model, 'comment_id') | ||
12 | + ->label(false) | ||
13 | + ->hiddenInput(); | ||
14 | + if(!empty( $model->parent )) { | ||
15 | + ?> | ||
16 | + <div class="artbox_comment_update_reply"> | ||
17 | + <?php | ||
18 | + echo "<span>"; | ||
19 | + if(!empty( $model->parent->author )) { | ||
20 | + echo $model->parent->author->firstname . ' ' . $model->parent->author->lastname; | ||
21 | + } else { | ||
22 | + echo $model->parent->user_name; | ||
23 | + } | ||
24 | + echo "</span>"; | ||
25 | + echo $form->field($model, 'comment_pid') | ||
26 | + ->label(false) | ||
27 | + ->hiddenInput(); | ||
28 | + ?> | ||
29 | + </div> | ||
30 | + <?php | ||
31 | + } | ||
32 | + echo $form->field($model, 'text') | ||
33 | + ->label(false) | ||
34 | + ->textarea(); | ||
35 | +?> | ||
36 | +<?php | ||
37 | + $form->end(); | ||
38 | ?> | 38 | ?> |
39 | \ No newline at end of file | 39 | \ No newline at end of file |
common/modules/comment/widgets/CommentWidget.php
1 | -<?php | ||
2 | - namespace common\modules\comment\widgets; | ||
3 | - | ||
4 | - use \yii\helpers\ArrayHelper; | ||
5 | - use \yii\helpers\Html; | ||
6 | - | ||
7 | - class CommentWidget extends \yii\base\Widget | ||
8 | - { | ||
9 | - | ||
10 | - /** | ||
11 | - * @var null|\yii\web\View | ||
12 | - */ | ||
13 | - public $context = NULL; | ||
14 | - | ||
15 | - /** | ||
16 | - * @var array Parts of widgets that can be rendered | ||
17 | - */ | ||
18 | - public $parts = [ ]; | ||
19 | - | ||
20 | - public $rating_class = NULL; | ||
21 | - | ||
22 | - public $rating_options = [ ]; | ||
23 | - | ||
24 | - /** | ||
25 | - * @var string|\common\modules\comment\models\Comment | ||
26 | - */ | ||
27 | - public $comment_class; | ||
28 | - | ||
29 | - /** | ||
30 | - * @var array | ||
31 | - */ | ||
32 | - public $class_options = [ ]; | ||
33 | - | ||
34 | - /** | ||
35 | - * @var bool Wheather to display comment list | ||
36 | - */ | ||
37 | - public $display_comment_list = true; | ||
38 | - | ||
39 | - /** | ||
40 | - * @var bool Whether to display comment form | ||
41 | - */ | ||
42 | - public $display_comment_form = true; | ||
43 | - | ||
44 | - /** | ||
45 | - * @var bool Whether to display success text | ||
46 | - */ | ||
47 | - public $display_comment_success = true; | ||
48 | - | ||
49 | - /** | ||
50 | - * @var bool Whether to allow one user post multiple comments | ||
51 | - */ | ||
52 | - public $allow_multiple = true; | ||
53 | - | ||
54 | - /** | ||
55 | - * @var array Options sent to list part | ||
56 | - */ | ||
57 | - public $list_options = [ | ||
58 | - 'tag' => 'div', | ||
59 | - 'view' => 'list-comment', | ||
60 | - 'class' => 'test-class', | ||
61 | - ]; | ||
62 | - | ||
63 | - /** | ||
64 | - * @var array Options sent to success part | ||
65 | - */ | ||
66 | - public $success_options = [ | ||
67 | - 'tag' => 'div', | ||
68 | - 'content' => NULL, | ||
69 | - 'class' => 'test-class-success', | ||
70 | - ]; | ||
71 | - | ||
72 | - /** | ||
73 | - * @var array Options sent to form part | ||
74 | - */ | ||
75 | - public $form_options = [ | ||
76 | - 'tag' => 'div', | ||
77 | - 'view' => 'form-comment', | ||
78 | - 'class' => 'test-class-form', | ||
79 | - ]; | ||
80 | - | ||
81 | - /** | ||
82 | - * @var bool Indicates whether any successful action happened | ||
83 | - */ | ||
84 | - protected $isSuccess = false; | ||
85 | - | ||
86 | - public $success_text = 'Comment successfully added'; | ||
87 | - | ||
88 | - /** | ||
89 | - * @var string $model Model, to which comments attached | ||
90 | - */ | ||
91 | - public $model; | ||
92 | - | ||
93 | - /** | ||
94 | - * @var integer $model_id Model id, to which comments attached | ||
95 | - */ | ||
96 | - public $model_id; | ||
97 | - | ||
98 | - /** | ||
99 | - * @var string Template of the widget. You may use <code>{success}, {form}, {list}</code> | ||
100 | - * to render particular parts. You are also able to use common HTML here. | ||
101 | - */ | ||
102 | - public $template = "{success}\n{form}\n{list}"; | ||
103 | - | ||
104 | - /** | ||
105 | - * @var array Widget options | ||
106 | - */ | ||
107 | - public $options = [ ]; | ||
108 | - | ||
109 | - /** | ||
110 | - * @var \yii\data\DataProviderInterface Data provider of comments | ||
111 | - */ | ||
112 | - public $dataProvider; | ||
113 | - | ||
114 | - /** | ||
115 | - * @inheritdoc | ||
116 | - */ | ||
117 | - public function init() | ||
118 | - { | ||
119 | - parent::init(); | ||
120 | - \common\modules\comment\assets\CommentAsset::register($this->view); | ||
121 | - if(is_string($this->comment_class)) { | ||
122 | - $this->comment_class = new $this->comment_class($this->class_options); | ||
123 | - } else { | ||
124 | - throw new \yii\base\InvalidConfigException(__CLASS__ . '->comment_class must be defined as object full class name string.'); | ||
125 | - } | ||
126 | - if(!empty( $this->rating_class ) && is_string($this->rating_class)) { | ||
127 | - $this->rating_class = new $this->rating_class($this->rating_options); | ||
128 | - } elseif(!empty( $this->rating_class )) { | ||
129 | - throw new \yii\base\InvalidConfigException(__CLASS__ . '->rating_class must be defined as object full class name string.'); | ||
130 | - } | ||
131 | - $this->comment_class->model = $this->model; | ||
132 | - $this->comment_class->model_id = $this->model_id; | ||
133 | - $this->createDataProvider(); | ||
134 | - $this->process(); | ||
135 | - ob_start(); | ||
136 | - } | ||
137 | - | ||
138 | - /** | ||
139 | - * @inheritdoc | ||
140 | - * @return string | ||
141 | - */ | ||
142 | - public function run() | ||
143 | - { | ||
144 | - $content = ob_get_clean(); | ||
145 | - $this->createParts(); | ||
146 | - return $this->renderWidget(); | ||
147 | - } | ||
148 | - | ||
149 | - public function createParts() | ||
150 | - { | ||
151 | - if($this->display_comment_success && $this->isSuccess) { | ||
152 | - $tag = ArrayHelper::remove($this->success_options, 'tag', 'div'); | ||
153 | - if(is_callable($this->success_options[ 'content' ])) { | ||
154 | - $result = call_user_func(ArrayHelper::remove($this->success_options, 'content'), $this->success_text); | ||
155 | - } elseif($this->success_options[ 'content' ] != NULL) { | ||
156 | - $result = Html::encode(ArrayHelper::remove($this->success_options, 'content', $this->success_text)); | ||
157 | - } else { | ||
158 | - $result = Html::encode($this->success_text); | ||
159 | - } | ||
160 | - $this->parts[ 'success' ] = Html::tag($tag, $result, $this->success_options); | ||
161 | - unset( $tag, $result ); | ||
162 | - } | ||
163 | - | ||
164 | - if($this->display_comment_list) { | ||
165 | - $tag = ArrayHelper::remove($this->list_options, 'tag', 'div'); | ||
166 | - $view = ArrayHelper::remove($this->list_options, 'view'); | ||
167 | - $this->parts[ 'list' ] = Html::tag($tag, $this->renderItems($view), $this->list_options); | ||
168 | - } | ||
169 | - | ||
170 | - if($this->display_comment_form && $this->comment_class->checkCreate()) { | ||
171 | - $tag = ArrayHelper::remove($this->form_options, 'tag', 'div'); | ||
172 | - $view = ArrayHelper::remove($this->form_options, 'view'); | ||
173 | - $this->parts[ 'form' ] = Html::tag($tag, $this->renderForm($view), $this->form_options); | ||
174 | - } | ||
175 | - } | ||
176 | - | ||
177 | - public function createDataProvider() | ||
178 | - { | ||
179 | - $this->dataProvider = new \yii\data\ActiveDataProvider([ | ||
180 | - 'query' => $this->comment_class->getComments($this->model, $this->model_id), | ||
181 | - 'pagination' => [ | ||
182 | - 'pageSize' => 10, | ||
183 | - ], | ||
184 | - ]); | ||
185 | - } | ||
186 | - | ||
187 | - public function renderItems($view) | ||
188 | - { | ||
189 | - if(empty( $view )) { | ||
190 | - throw new \yii\base\InvalidConfigException("list_options[view] must be set"); | ||
191 | - } | ||
192 | - return $this->render($view, [ 'dataProvider' => $this->dataProvider ]); | ||
193 | - } | ||
194 | - | ||
195 | - public function renderForm($view) | ||
196 | - { | ||
197 | - if(empty( $view )) { | ||
198 | - throw new \yii\base\InvalidConfigException("form_options[view] must be set"); | ||
199 | - } | ||
200 | - if($this->comment_class->guestComment || !empty(\Yii::$app->user->identity)) { | ||
201 | - return $this->render($view, [ | ||
202 | - 'model' => $this->comment_class, | ||
203 | - 'rating' => $this->rating_class, | ||
204 | - 'user' => \Yii::$app->user->identity, | ||
205 | - 'dataProvider' => $this->dataProvider, | ||
206 | - ]); | ||
207 | - } else { | ||
208 | - return ''; | ||
209 | - } | ||
210 | - } | ||
211 | - | ||
212 | - public function renderWidget() | ||
213 | - { | ||
214 | - $template = $this->template; | ||
215 | - $parts = $this->parts; | ||
216 | - $options = $this->options; | ||
217 | - $template = preg_replace('/{success}/', ArrayHelper::remove($parts, 'success', ''), $template); | ||
218 | - $template = preg_replace('/{list}/', ArrayHelper::remove($parts, 'list', ''), $template); | ||
219 | - $template = preg_replace('/{form}/', ArrayHelper::remove($parts, 'form', ''), $template); | ||
220 | - $tag = ArrayHelper::remove($options, 'tag', 'div'); | ||
221 | - return Html::tag($tag, $template, $options); | ||
222 | - } | ||
223 | - | ||
224 | - public function process() | ||
225 | - { | ||
226 | - $data = \Yii::$app->request->post(); | ||
227 | - if($this->comment_class->load($data) && $this->comment_class->postComment()) { | ||
228 | - if(is_object($this->rating_class)) { | ||
229 | - $this->comment_class->checkRating(); | ||
230 | - if($this->comment_class->rating->load($data) && $this->comment_class->rating->save()) { | ||
231 | - $this->isSuccess = true; | ||
232 | - } | ||
233 | - } | ||
234 | - } | ||
235 | - } | 1 | +<?php |
2 | + namespace common\modules\comment\widgets; | ||
3 | + | ||
4 | + use yii\data\Sort; | ||
5 | + use \yii\helpers\ArrayHelper; | ||
6 | + use \yii\helpers\Html; | ||
7 | + | ||
8 | + class CommentWidget extends \yii\base\Widget | ||
9 | + { | ||
10 | + | ||
11 | + /** | ||
12 | + * 'comment_container' - apply to container of one comment. Must have data-key and data-form | ||
13 | + * 'comment_delete' - apply to comment delete link | ||
14 | + * 'comment_reply' - apply to comment reply link | ||
15 | + * 'comment_author' - apply to comment author text wrapper | ||
16 | + * 'widget_container' - apply to comment widget | ||
17 | + * 'form_container' - apply to comment form wrapper | ||
18 | + * 'reply_block' - apply to reply block of comment form | ||
19 | + * 'reply_author' - apply to reply author text block inside of reply block of comment form | ||
20 | + * 'comment_update' - apply to comment update link | ||
21 | + * 'comment_update_submit' - apply to submit button of comment update form | ||
22 | + */ | ||
23 | + static $baseClass = [ | ||
24 | + 'comment_container' => 'artbox_comment_container', | ||
25 | + 'comment_delete' => 'artbox_comment_delete', | ||
26 | + 'comment_reply' => 'artbox_comment_reply', | ||
27 | + 'comment_author' => 'artbox_comment_author', | ||
28 | + 'widget_container' => 'artbox_comment_widget', | ||
29 | + 'form_container' => 'artbox_comment_form', | ||
30 | + 'reply_block' => 'artbox_comment_reply_block', | ||
31 | + 'reply_author' => 'artbox_comment_reply_author', | ||
32 | + 'comment_update' => 'artbox_comment_update', | ||
33 | + 'comment_update_submit' => 'artbox_comment_update_submit', | ||
34 | + ]; | ||
35 | + | ||
36 | + /** | ||
37 | + * @var null|\yii\web\View | ||
38 | + */ | ||
39 | + public $context = NULL; | ||
40 | + | ||
41 | + /** | ||
42 | + * @var array Parts of widgets that can be rendered | ||
43 | + */ | ||
44 | + public $parts = [ ]; | ||
45 | + | ||
46 | + public $rating_class = NULL; | ||
47 | + | ||
48 | + public $rating_options = [ ]; | ||
49 | + | ||
50 | + /** | ||
51 | + * @var string|\common\modules\comment\models\Comment | ||
52 | + */ | ||
53 | + public $comment_class; | ||
54 | + | ||
55 | + /** | ||
56 | + * @var array | ||
57 | + */ | ||
58 | + public $class_options = [ ]; | ||
59 | + | ||
60 | + public $provider_options = [ ]; | ||
61 | + | ||
62 | + /** | ||
63 | + * @var bool Wheather to display comment list | ||
64 | + */ | ||
65 | + public $display_comment_list = true; | ||
66 | + | ||
67 | + /** | ||
68 | + * @var bool Whether to display comment form | ||
69 | + */ | ||
70 | + public $display_comment_form = true; | ||
71 | + | ||
72 | + /** | ||
73 | + * @var bool Whether to display success text | ||
74 | + */ | ||
75 | + public $display_comment_success = true; | ||
76 | + | ||
77 | + /** | ||
78 | + * @var bool Whether to allow one user post multiple comments | ||
79 | + */ | ||
80 | + public $allow_multiple = true; | ||
81 | + | ||
82 | + public $allow_reply = true; | ||
83 | + | ||
84 | + /** | ||
85 | + * @var array Options sent to list part | ||
86 | + */ | ||
87 | + public $list_options = [ | ||
88 | + 'tag' => 'div', | ||
89 | + 'view' => 'list-comment', | ||
90 | + 'class' => 'test-class', | ||
91 | + ]; | ||
92 | + | ||
93 | + /** | ||
94 | + * @var array Options sent to success part | ||
95 | + */ | ||
96 | + public $success_options = [ | ||
97 | + 'tag' => 'div', | ||
98 | + 'content' => NULL, | ||
99 | + 'class' => 'test-class-success', | ||
100 | + ]; | ||
101 | + | ||
102 | + /** | ||
103 | + * @var array Options sent to form part | ||
104 | + */ | ||
105 | + public $form_options = [ | ||
106 | + 'tag' => 'div', | ||
107 | + 'view' => 'form-comment', | ||
108 | + 'class' => 'test-class-form', | ||
109 | + ]; | ||
110 | + | ||
111 | + /** | ||
112 | + * @var bool Indicates whether any successful action happened | ||
113 | + */ | ||
114 | + protected $isSuccess = false; | ||
115 | + | ||
116 | + public $success_text = 'Comment successfully added'; | ||
117 | + | ||
118 | + /** | ||
119 | + * @var string $model Model, to which comments attached | ||
120 | + */ | ||
121 | + public $model; | ||
122 | + | ||
123 | + /** | ||
124 | + * @var integer $model_id Model id, to which comments attached | ||
125 | + */ | ||
126 | + public $model_id; | ||
127 | + | ||
128 | + /** | ||
129 | + * @var string Template of the widget. You may use <code>{success}, {form}, {list}</code> | ||
130 | + * to render particular parts. You are also able to use common HTML here. | ||
131 | + */ | ||
132 | + public $template = "{success}\n{form}\n{list}"; | ||
133 | + | ||
134 | + /** | ||
135 | + * @var array Widget options | ||
136 | + */ | ||
137 | + public $options = [ ]; | ||
138 | + | ||
139 | + /** | ||
140 | + * @var \yii\data\DataProviderInterface Data provider of comments | ||
141 | + */ | ||
142 | + public $dataProvider; | ||
143 | + | ||
144 | + /** | ||
145 | + * @inheritdoc | ||
146 | + */ | ||
147 | + public function init() | ||
148 | + { | ||
149 | + parent::init(); | ||
150 | + \common\modules\comment\assets\CommentAsset::register($this->view); | ||
151 | + if(is_string($this->comment_class)) { | ||
152 | + $this->comment_class = new $this->comment_class($this->class_options); | ||
153 | + } else { | ||
154 | + throw new \yii\base\InvalidConfigException(__CLASS__ . '->comment_class must be defined as object full class name string.'); | ||
155 | + } | ||
156 | + if(!empty( $this->rating_class ) && is_string($this->rating_class)) { | ||
157 | + $this->rating_class = new $this->rating_class($this->rating_options); | ||
158 | + } elseif(!empty( $this->rating_class )) { | ||
159 | + throw new \yii\base\InvalidConfigException(__CLASS__ . '->rating_class must be defined as object full class name string.'); | ||
160 | + } | ||
161 | + $this->comment_class->model = $this->model; | ||
162 | + $this->comment_class->model_id = $this->model_id; | ||
163 | + $this->createDataProvider(); | ||
164 | + $this->process(); | ||
165 | + ob_start(); | ||
166 | + } | ||
167 | + | ||
168 | + /** | ||
169 | + * @inheritdoc | ||
170 | + * @return string | ||
171 | + */ | ||
172 | + public function run() | ||
173 | + { | ||
174 | + $content = ob_get_clean(); | ||
175 | + $this->createParts(); | ||
176 | + return $this->renderWidget(); | ||
177 | + } | ||
178 | + | ||
179 | + public function createParts() | ||
180 | + { | ||
181 | + if($this->display_comment_success && $this->isSuccess) { | ||
182 | + $tag = ArrayHelper::remove($this->success_options, 'tag', 'div'); | ||
183 | + if(is_callable($this->success_options[ 'content' ])) { | ||
184 | + $result = call_user_func(ArrayHelper::remove($this->success_options, 'content'), $this->success_text); | ||
185 | + } elseif($this->success_options[ 'content' ] != NULL) { | ||
186 | + $result = Html::encode(ArrayHelper::remove($this->success_options, 'content', $this->success_text)); | ||
187 | + } else { | ||
188 | + $result = Html::encode($this->success_text); | ||
189 | + } | ||
190 | + $this->parts[ 'success' ] = Html::tag($tag, $result, $this->success_options); | ||
191 | + unset( $tag, $result ); | ||
192 | + } | ||
193 | + | ||
194 | + if($this->display_comment_list) { | ||
195 | + $tag = ArrayHelper::remove($this->list_options, 'tag', 'div'); | ||
196 | + $view = ArrayHelper::remove($this->list_options, 'view'); | ||
197 | + $this->parts[ 'list' ] = Html::tag($tag, $this->renderItems($view), $this->list_options); | ||
198 | + } | ||
199 | + | ||
200 | + if($this->display_comment_form && $this->comment_class->checkCreate()) { | ||
201 | + $tag = ArrayHelper::remove($this->form_options, 'tag', 'div'); | ||
202 | + $view = ArrayHelper::remove($this->form_options, 'view'); | ||
203 | + if(!empty( $this->form_options[ 'class' ] )) { | ||
204 | + $this->form_options[ 'class' ] .= ' ' . self::$baseClass[ 'form_container' ]; | ||
205 | + } else { | ||
206 | + $this->form_options[ 'class' ] = self::$baseClass[ 'form_container' ]; | ||
207 | + } | ||
208 | + $this->parts[ 'form' ] = Html::tag($tag, $this->renderForm($view), $this->form_options); | ||
209 | + } | ||
210 | + } | ||
211 | + | ||
212 | + public function createDataProvider() | ||
213 | + { | ||
214 | + $this->dataProvider = new \yii\data\ActiveDataProvider([ | ||
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([ | ||
217 | + 'defaultOrder' => [ | ||
218 | + 'date_add' => SORT_DESC, | ||
219 | + ], | ||
220 | + ])), | ||
221 | + 'pagination' => ArrayHelper::remove($this->provider_options, 'pagination', [ | ||
222 | + 'pageSize' => 10, | ||
223 | + ]), | ||
224 | + ]); | ||
225 | + } | ||
226 | + | ||
227 | + public function renderItems($view) | ||
228 | + { | ||
229 | + if(empty( $view )) { | ||
230 | + throw new \yii\base\InvalidConfigException("list_options[view] must be set"); | ||
231 | + } | ||
232 | + return $this->render($view, [ | ||
233 | + 'dataProvider' => $this->dataProvider, | ||
234 | + 'commentClass' => $this->comment_class, | ||
235 | + ]); | ||
236 | + } | ||
237 | + | ||
238 | + public function renderForm($view) | ||
239 | + { | ||
240 | + if(empty( $view )) { | ||
241 | + throw new \yii\base\InvalidConfigException("form_options[view] must be set"); | ||
242 | + } | ||
243 | + if($this->comment_class->guestComment || !empty( \Yii::$app->user->identity )) { | ||
244 | + return $this->render($view, [ | ||
245 | + 'model' => $this->comment_class, | ||
246 | + 'rating' => $this->rating_class, | ||
247 | + 'user' => \Yii::$app->user->identity, | ||
248 | + 'dataProvider' => $this->dataProvider, | ||
249 | + ]); | ||
250 | + } else { | ||
251 | + return ''; | ||
252 | + } | ||
253 | + } | ||
254 | + | ||
255 | + public function renderWidget() | ||
256 | + { | ||
257 | + $template = $this->template; | ||
258 | + $parts = $this->parts; | ||
259 | + $options = $this->options; | ||
260 | + $template = preg_replace('/{success}/', ArrayHelper::remove($parts, 'success', ''), $template); | ||
261 | + $template = preg_replace('/{list}/', ArrayHelper::remove($parts, 'list', ''), $template); | ||
262 | + $template = preg_replace('/{form}/', ArrayHelper::remove($parts, 'form', ''), $template); | ||
263 | + $tag = ArrayHelper::remove($options, 'tag', 'div'); | ||
264 | + if(!empty( $options[ 'class' ] )) { | ||
265 | + $options[ 'class' ] .= ' ' . self::$baseClass[ 'widget_container' ]; | ||
266 | + } else { | ||
267 | + $options[ 'class' ] = self::$baseClass[ 'widget_container' ]; | ||
268 | + } | ||
269 | + return Html::tag($tag, $template, $options); | ||
270 | + } | ||
271 | + | ||
272 | + public function process() | ||
273 | + { | ||
274 | + $data = \Yii::$app->request->post(); | ||
275 | + if($this->comment_class->load($data) && $this->comment_class->postComment()) { | ||
276 | + if(is_object($this->rating_class)) { | ||
277 | + $this->comment_class->checkRating(); | ||
278 | + if($this->comment_class->rating->load($data) && $this->comment_class->rating->save()) { | ||
279 | + $this->isSuccess = true; | ||
280 | + \Yii::$app->response->redirect(''); | ||
281 | + } | ||
282 | + } else { | ||
283 | + $this->isSuccess = true; | ||
284 | + } | ||
285 | + } | ||
286 | + } | ||
287 | + | ||
236 | } | 288 | } |
237 | \ No newline at end of file | 289 | \ No newline at end of file |
common/modules/comment/widgets/views/_project_comment_view.php
1 | -<?php | ||
2 | - use common\models\User; | ||
3 | - use yii\helpers\Html; | ||
4 | - | ||
5 | - /** | ||
6 | - * @var \common\modules\comment\models\CommentProject $model Current comment model | ||
7 | - * @var integer $key ID of current comment | ||
8 | - * @var integer $index index of current element according | ||
9 | - * to current page, starting from 0 | ||
10 | - * @var \yii\widgets\ListView $widget current ListView instance | ||
11 | - * @var User $user | ||
12 | - */ | ||
13 | - $user = $model->user; | ||
14 | -?> | ||
15 | -<div class="performer-vacancy-sidebar-left-wr"> | ||
16 | - <div class="performer-vacancy-sidebar-left"> | ||
17 | - <div class="performer-vacancy-sidebar-img style"> | ||
18 | - <?= Html::img($user->userInfo->image) ?> | ||
19 | - </div> | ||
20 | - <div class="performer-vacancy-sidebar-all style"> | ||
21 | - <div class="performer-vacancy-sidebar-soc style"> | ||
22 | - <ul> | ||
23 | - <?php | ||
24 | - if(!empty( $user->userInfo->social_fb )) { | ||
25 | - echo '<li>' . Html::a(Html::img('/images/ico-fb.png'), $user->userInfo->social_fb, [ 'target' => '_blank' ]) . '</li>'; | ||
26 | - } | ||
27 | - ?> | ||
28 | - <?php | ||
29 | - if(!empty( $user->userInfo->social_t )) { | ||
30 | - echo '<li>' . Html::a(Html::img('/images/ico-tw.png'), $user->userInfo->social_t, [ 'target' => '_blank' ]) . '</li>'; | ||
31 | - } | ||
32 | - ?> | ||
33 | - <?php | ||
34 | - if(!empty( $user->userInfo->social_in )) { | ||
35 | - echo '<li>' . Html::a(Html::img('/images/ico-in.png'), $user->userInfo->social_in, [ 'target' => '_blank' ]) . '</li>'; | ||
36 | - } | ||
37 | - ?> | ||
38 | - <?php | ||
39 | - if(!empty( $user->userInfo->social_vk )) { | ||
40 | - echo '<li>' . Html::a(Html::img('/images/ico-vk.png'), $user->userInfo->social_vk, [ 'target' => '_blank' ]) . '</li>'; | ||
41 | - } | ||
42 | - ?> | ||
43 | - </ul> | ||
44 | - </div> | ||
45 | - <div class="performer-vacancy-sidebar-views style"> | ||
46 | - <ul class="style"> | ||
47 | - <li><img src="/images/sidebar-ico/ico-1.png" alt=""> | ||
48 | - <div class="sidebarvievstxt"><?= $user->userInfo->view_count ?></div> | ||
49 | - </li> | ||
50 | - <li><img src="/images/sidebar-ico/ico-9.png" alt=""> | ||
51 | - <div class="sidebarvievstxt"> | ||
52 | - <span class="sidebar-views-txt">ะกัะฐััั: </span><?= ( empty( $user->userInfo->busy ) ? 'ะกะฒะพะฑะพะดะตะฝ' : 'ะะฐะฝัั' ) ?> | ||
53 | - </div> | ||
54 | - </li> | ||
55 | - <li><img src="/images/sidebar-ico/ico-2.png" alt=""> | ||
56 | - <div class="sidebarvievstxt"> | ||
57 | - <span class="sidebar-views-txt">ะะฐ ัะฐะนัะต: </span><?= $user->liveTime ?> | ||
58 | - </div> | ||
59 | - </li> | ||
60 | - <li><img src="/images/sidebar-ico/ico-3.png" alt=""> | ||
61 | - <div class="sidebarvievstxt"><span class="sidebar-views-txt">ะะพัะปะตะดะฝะธะน ะฒะธะทะธั:<br></span><?= $user->lastVisit ?> | ||
62 | - </div> | ||
63 | - </li> | ||
64 | - </ul> | ||
65 | - <?= Html::a('ะะพัะผะพััะตัั ะฟัะพัะธะปั', $user->link, [ 'class' => 'tender-see-profile style' ]) ?> | ||
66 | - </div> | ||
67 | - </div> | ||
68 | - </div> | ||
69 | -</div> | ||
70 | -<div class="tender-offer-proj-block-right-wr"> | ||
71 | - <div class="tender-offer-proj-block-right"> | ||
72 | - <div class="tender-offer-proj-min-blocks"> | ||
73 | - <span><?= $model->budget_from . '-' . $model->budget_to . ' ' . $model->currency->label ?></span> | ||
74 | - </div> | ||
75 | - <div class="tender-offer-proj-min-blocks"> | ||
76 | - <span><?= $model->term_from . '-' . $model->term_to ?> ะะะฏ</span></div> | ||
77 | - </div> | ||
78 | - <div class="tender-offer-proj-block-left"> | ||
79 | - <div class="search-worker-blocks-title-wr"> | ||
80 | - <div class="search-worker-blocks-title-title"><?= $user->name ?></div> | ||
81 | - <div class="rating-new"> | ||
82 | - <!--ะพัะตะฝะบะฐ--> | ||
83 | - <input type="hidden" class="val" value="<?= $user->userInfo->rating ?>"/> | ||
84 | - </div> | ||
85 | - <?= Html::a(count($user->comments) . ' ะพัะทัะฒะพะฒ', $user->getLink('review'), [ 'class' => 'link-to-comm' ]) ?> | ||
86 | - </div> | ||
87 | - <div class="tender-offer-proj-txt"> | ||
88 | - <?= $model->text ?> | ||
89 | - </div> | ||
90 | - <ul class="download-list-files"> | ||
91 | - <?php | ||
92 | - foreach($model->getFilesList() as $file) { | ||
93 | - ?> | ||
94 | - <li> | ||
95 | - <span></span> | ||
96 | - <?= Html::a($file->name, $file->dir, [ 'class' => 'download-link-file' ]) ?> | ||
97 | - <?= Html::a('ะกะบะฐัะฐัั', $file->dir, [ | ||
98 | - 'class' => 'download-link', | ||
99 | - 'download' => 'download', | ||
100 | - ]) ?> | ||
101 | - </li> | ||
102 | - <?php | ||
103 | - } | ||
104 | - ?> | ||
105 | - </ul> | ||
106 | - </div> | ||
107 | - <div class="tender-more-buttons-wr"> | ||
108 | - <?= Html::a('ะะพัััะพะปะธะพ', $user->getLink('portfolio'), [ 'class' => 'get-project-new' ]) ?> | ||
109 | - <?= Html::a('ะะพะฝัะฐะบัั', $user->link, [ 'class' => 'get-list-new' ]) ?> | ||
110 | - </div> | ||
111 | - <?php | ||
112 | - if(\Yii::$app->user->getId() == $model->owner->user_id) { | ||
113 | - ?> | ||
114 | - <div class="project_owner_control" style="clear:both"> | ||
115 | - <span>ะัะผะตัะธัั ะบะฐะบ: </span> | ||
116 | - <?php | ||
117 | - echo Html::a('ะฝะพะฒัะน', [ '#' ], [ | ||
118 | - 'data-project-id' => $model->owner->project_id, | ||
119 | - 'data-comment-id' => $model->comment_id, | ||
120 | - 'class' => 'artbox_project_make_new', | ||
121 | - ]); | ||
122 | - echo Html::a('ะบะฐะฝะดะธะดะฐั', [ '#' ], [ | ||
123 | - 'data-project-id' => $model->owner->project_id, | ||
124 | - 'data-comment-id' => $model->comment_id, | ||
125 | - 'class' => 'artbox_project_make_candidate', | ||
126 | - ]); | ||
127 | - echo Html::a('ะธัะฟะพะปะฝะธัะตะปั', [ '#' ], [ | ||
128 | - 'data-project-id' => $model->owner->project_id, | ||
129 | - 'data-comment-id' => $model->comment_id, | ||
130 | - 'class' => 'artbox_project_make_performer', | ||
131 | - ]); | ||
132 | - echo Html::a('ะพัะบะฐะทะฐัั', [ '#' ], [ | ||
133 | - 'data-project-id' => $model->owner->project_id, | ||
134 | - 'data-comment-id' => $model->comment_id, | ||
135 | - 'class' => 'artbox_project_make_deny', | ||
136 | - ]); | ||
137 | - ?> | ||
138 | - </div> | ||
139 | - <?php | ||
140 | - } | ||
141 | - ?> | ||
142 | - | ||
143 | -</div> | 1 | +<?php |
2 | + use common\models\User; | ||
3 | + use kartik\rating\StarRating; | ||
4 | + use yii\helpers\Html; | ||
5 | + | ||
6 | + /** | ||
7 | + * @var \common\modules\comment\models\CommentProject $model Current comment model | ||
8 | + * @var integer $key ID of current comment | ||
9 | + * @var integer $index index of current element according | ||
10 | + * to current page, starting from 0 | ||
11 | + * @var \yii\widgets\ListView $widget current ListView instance | ||
12 | + * @var User $user | ||
13 | + */ | ||
14 | + $user = $model->user; | ||
15 | +?> | ||
16 | +<div class="performer-vacancy-sidebar-left-wr"> | ||
17 | + <div class="performer-vacancy-sidebar-left"> | ||
18 | + <div class="performer-vacancy-sidebar-img style"> | ||
19 | + <?php | ||
20 | + if(!empty( $user->userInfo->image )) { | ||
21 | + echo Html::img($user->userInfo->image); | ||
22 | + } else { | ||
23 | + echo Html::img('/images/avatar-bg.png'); | ||
24 | + } | ||
25 | + ?> | ||
26 | + </div> | ||
27 | + <div class="performer-vacancy-sidebar-all style"> | ||
28 | + <div class="performer-vacancy-sidebar-soc style"> | ||
29 | + <ul> | ||
30 | + <?php | ||
31 | + if(!empty( $user->userInfo->social_fb )) { | ||
32 | + echo '<li>' . Html::a(Html::img('/images/ico-fb.png'), $user->userInfo->social_fb, [ 'target' => '_blank' ]) . '</li>'; | ||
33 | + } | ||
34 | + ?> | ||
35 | + <?php | ||
36 | + if(!empty( $user->userInfo->social_t )) { | ||
37 | + echo '<li>' . Html::a(Html::img('/images/ico-tw.png'), $user->userInfo->social_t, [ 'target' => '_blank' ]) . '</li>'; | ||
38 | + } | ||
39 | + ?> | ||
40 | + <?php | ||
41 | + if(!empty( $user->userInfo->social_in )) { | ||
42 | + echo '<li>' . Html::a(Html::img('/images/ico-in.png'), $user->userInfo->social_in, [ 'target' => '_blank' ]) . '</li>'; | ||
43 | + } | ||
44 | + ?> | ||
45 | + <?php | ||
46 | + if(!empty( $user->userInfo->social_vk )) { | ||
47 | + echo '<li>' . Html::a(Html::img('/images/ico-vk.png'), $user->userInfo->social_vk, [ 'target' => '_blank' ]) . '</li>'; | ||
48 | + } | ||
49 | + ?> | ||
50 | + </ul> | ||
51 | + </div> | ||
52 | + <div class="performer-vacancy-sidebar-views style"> | ||
53 | + <ul class="style"> | ||
54 | + <li><img src="/images/sidebar-ico/ico-1.png" alt=""> | ||
55 | + <div class="sidebarvievstxt"><?= $user->userInfo->view_count ?></div> | ||
56 | + </li> | ||
57 | + <li><img src="/images/sidebar-ico/ico-9.png" alt=""> | ||
58 | + <div class="sidebarvievstxt"> | ||
59 | + <span class="sidebar-views-txt">ะกัะฐััั: </span><?= ( empty( $user->userInfo->busy ) ? 'ะกะฒะพะฑะพะดะตะฝ' : 'ะะฐะฝัั' ) ?> | ||
60 | + </div> | ||
61 | + </li> | ||
62 | + <li><img src="/images/sidebar-ico/ico-2.png" alt=""> | ||
63 | + <div class="sidebarvievstxt"> | ||
64 | + <span class="sidebar-views-txt">ะะฐ ัะฐะนัะต: </span><?= $user->liveTime ?> | ||
65 | + </div> | ||
66 | + </li> | ||
67 | + <li><img src="/images/sidebar-ico/ico-3.png" alt=""> | ||
68 | + <div class="sidebarvievstxt"><span class="sidebar-views-txt">ะะพัะปะตะดะฝะธะน ะฒะธะทะธั:<br></span><?= $user->lastVisit ?> | ||
69 | + </div> | ||
70 | + </li> | ||
71 | + </ul> | ||
72 | + <?= Html::a('ะะพัะผะพััะตัั ะฟัะพัะธะปั', $user->link, [ 'class' => 'tender-see-profile style', | ||
73 | + 'target' => '_blank', | ||
74 | + ]) ?> | ||
75 | + </div> | ||
76 | + </div> | ||
77 | + </div> | ||
78 | +</div> | ||
79 | +<div class="tender-offer-proj-block-right-wr"> | ||
80 | + <div class="tender-offer-proj-block-right"> | ||
81 | + <div class="tender-offer-proj-min-blocks"> | ||
82 | + <span><?= $model->budget_from . '-' . $model->budget_to . ' ' . $model->currency->label ?></span> | ||
83 | + </div> | ||
84 | + <div class="tender-offer-proj-min-blocks"> | ||
85 | + <span><?= $model->term_from . '-' . $model->term_to ?> ะะะฏ</span></div> | ||
86 | + </div> | ||
87 | + <div class="tender-offer-proj-block-left"> | ||
88 | + <div class="search-worker-blocks-title-wr"> | ||
89 | + <div class="search-worker-blocks-title-title"><?= $user->name ?></div> | ||
90 | + <?php | ||
91 | + echo StarRating::widget([ | ||
92 | + 'name' => 'rating_review_comment', | ||
93 | + 'value' => $user->userInfo->rating, | ||
94 | + 'pluginOptions' => [ | ||
95 | + 'displayOnly' => true, | ||
96 | + 'size' => 'xxs', | ||
97 | + 'min' => 0, | ||
98 | + 'max' => 10, | ||
99 | + 'stars' => 10, | ||
100 | + ], | ||
101 | + ]); | ||
102 | + ?> | ||
103 | + <?= Html::a(count($user->comments) . ' ะผะฝะตะฝะธะน', $user->getLink('review'), [ 'class' => 'link-to-comm' ]) ?> | ||
104 | + </div> | ||
105 | + <div class="tender-offer-proj-txt"> | ||
106 | + <?= $model->text ?> | ||
107 | + </div> | ||
108 | + <ul class="download-list-files"> | ||
109 | + <?php | ||
110 | + foreach($model->getFilesList() as $file) { | ||
111 | + ?> | ||
112 | + <li> | ||
113 | + <span></span> | ||
114 | + <?= Html::a($file->name, $file->dir, [ | ||
115 | + 'class' => 'download-link-file', | ||
116 | + 'download' => 'download', | ||
117 | + ]) ?> | ||
118 | + <?= Html::a('ะกะบะฐัะฐัั', $file->dir, [ | ||
119 | + 'class' => 'download-link', | ||
120 | + 'download' => 'download', | ||
121 | + ]) ?> | ||
122 | + </li> | ||
123 | + <?php | ||
124 | + } | ||
125 | + ?> | ||
126 | + </ul> | ||
127 | + </div> | ||
128 | + <div class="tender-more-buttons-wr"> | ||
129 | + <?= Html::a('ะะพัััะพะปะธะพ', $user->getLink('portfolio'), [ 'class' => 'get-project-new' ]) ?> | ||
130 | + <?= Html::a('ะะพะฝัะฐะบัั', $user->link, [ 'class' => 'get-list-new' ]) ?> | ||
131 | + | ||
132 | + <?php | ||
133 | + if($model->status == $model::STATUS_ANONYMOUS) { | ||
134 | + echo Html::tag('div', 'ะะฝะพะฝะธะผะฝะพะต ะฟัะตะดะปะพะถะตะฝะธะต', [ 'class' => 'project_status' ]); | ||
135 | + } | ||
136 | + if(\Yii::$app->user->getId() == $model->owner->user_id) { | ||
137 | + ?> | ||
138 | + <div class="project_owner_state"> | ||
139 | + <p> | ||
140 | + <?php | ||
141 | + switch($model->state) { | ||
142 | + case 1: | ||
143 | + echo 'ะัะตะดะปะพะถะตะฝะธะต ะฝะต ัะฐััะผะพััะตะฝะพ'; | ||
144 | + break; | ||
145 | + case 2: | ||
146 | + echo 'ะัะฟะพะปะฝะธัะตะปั ะฟะพััะฐะฒะปะตะฝ ะฝะฐ ัะฐััะผะพััะตะฝะธะต'; | ||
147 | + break; | ||
148 | + case 3: | ||
149 | + echo 'ะัะฟะพะปะฝะธัะตะปั ะฝะฐะทะฝะฐัะตะฝ ะธัะฟะพะปะฝะธัะตะปะตะผ'; | ||
150 | + break; | ||
151 | + case 4: | ||
152 | + echo 'ะั ะพัะบะฐะทะฐะปะธ ะดะฐะฝะฝะพะผั ะธัะฟะพะปะฝะธัะตะปั'; | ||
153 | + break; | ||
154 | + case 5: | ||
155 | + echo 'ะัะฟะพะปะฝะธัะตะปั ะพัะบะฐะทะฐะปัั ะพั ะดะฐะฝะฝะพะณะพ ะฟัะตะดะปะพะถะตะฝะธั'; | ||
156 | + break; | ||
157 | + } | ||
158 | + ?> | ||
159 | + </p> | ||
160 | + </div> | ||
161 | + <?php | ||
162 | + if($model->state != $model::STATE_TRASH) { | ||
163 | + ?> | ||
164 | + <div class="project_owner_control"> | ||
165 | + <span>ะัะผะตัะธัั ะบะฐะบ: </span> | ||
166 | + <p class="new_mark_"></p> | ||
167 | + <div> | ||
168 | + <?php | ||
169 | + echo Html::a('ะฝะพะฒัะน', [ '#' ], [ | ||
170 | + 'data-project-id' => $model->owner->project_id, | ||
171 | + 'data-comment-id' => $model->comment_id, | ||
172 | + 'class' => 'artbox_project_make_new' . ( ( $model->state == $model::STATE_NEW ) ? ' active' : '' ), | ||
173 | + ]); | ||
174 | + echo Html::a('ะบะฐะฝะดะธะดะฐั', [ '#' ], [ | ||
175 | + 'data-project-id' => $model->owner->project_id, | ||
176 | + 'data-comment-id' => $model->comment_id, | ||
177 | + 'class' => 'artbox_project_make_candidate' . ( ( $model->state == $model::STATE_CANDIDATE ) ? ' active' : '' ), | ||
178 | + ]); | ||
179 | + echo Html::a('ะธัะฟะพะปะฝะธัะตะปั', [ '#' ], [ | ||
180 | + 'data-project-id' => $model->owner->project_id, | ||
181 | + 'data-comment-id' => $model->comment_id, | ||
182 | + 'class' => 'artbox_project_make_performer' . ( ( $model->state == $model::STATE_PERFORMER ) ? ' active' : '' ), | ||
183 | + ]); | ||
184 | + echo Html::a('ะพัะบะฐะทะฐัั', [ '#' ], [ | ||
185 | + 'data-project-id' => $model->owner->project_id, | ||
186 | + 'data-comment-id' => $model->comment_id, | ||
187 | + 'class' => 'artbox_project_make_deny' . ( ( $model->state == $model::STATE_DENY ) ? ' active' : '' ), | ||
188 | + ]); | ||
189 | + ?> | ||
190 | + </div> | ||
191 | + </div> | ||
192 | + <?php | ||
193 | + } | ||
194 | + } | ||
195 | + ?> | ||
196 | + </div> | ||
197 | + | ||
198 | + | ||
199 | +</div> |
common/modules/comment/widgets/views/_question_comment_view.php
0 โ 100755
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 | + if(empty( $model->comment_pid )) { | ||
18 | + $model->buildButtons([ | ||
19 | + 'reply', | ||
20 | + 'delete', | ||
21 | + ]); | ||
22 | + } | ||
23 | +?> | ||
24 | + <div class="<?= ( ( !empty( $model->child ) ) ? 'has-child' : '' ) ?>"> | ||
25 | + <div class="header-cabinet-foto" style="background: none;"><?= Html::img(( !empty( $model->user ) && !empty( $model->user->userInfo->image ) ) ? $model->user->minImg($model->user->userInfo->image, 48, 48) : '/images/ico-profile.png') ?></div> | ||
26 | + <div style="width: 500px; float: left; margin-left: 12px;"> | ||
27 | + <div class="comments-name style <?= CommentWidget::$baseClass[ 'comment_author' ] ?>"> | ||
28 | + <a href="/"><?= $model->getAuthor(' (ะะพััั)') ?></a> | ||
29 | + | ||
30 | + </div> | ||
31 | + | ||
32 | + <?php | ||
33 | + /* == STATUS PRO == | ||
34 | + ?> | ||
35 | + <div class="comments-status"><span>Pro</span></div> | ||
36 | + <?php | ||
37 | + */ | ||
38 | + ?> | ||
39 | + <div class="blog-post-date style"> | ||
40 | + <span></span> | ||
41 | + <p><?= \Yii::$app->formatter->asDate($model->date_add, 'php:d.m.Y') ?></p> | ||
42 | + </div> | ||
43 | + <!-- <div class="comments-date style">--><? //= \Yii::$app->formatter->asDate($model->date_add, 'php:d.m.Y') ?><!--</div>--> | ||
44 | + </div> | ||
45 | + <div class="comments-content"> | ||
46 | + <div class="style" style="font-weight: 700;">ะะพะฟัะพั</div> | ||
47 | + <div class="style" style="margin-top: 2px"><?= $model->text ?></div> | ||
48 | + </div> | ||
49 | + <?php | ||
50 | + if(!empty( $model->child )) { | ||
51 | + echo Html::tag('div', $this->render('@common/modules/comment/widgets/views/_question_comment_view', [ | ||
52 | + 'model' => $model->child, | ||
53 | + 'key' => $key, | ||
54 | + 'index' => $index, | ||
55 | + 'widget' => $widget, | ||
56 | + ]), [ | ||
57 | + 'class' => CommentWidget::$baseClass[ 'comment_container' ], | ||
58 | + 'data' => [ | ||
59 | + 'key' => $model->child->comment_id, | ||
60 | + 'form' => $model->formName(), | ||
61 | + ], | ||
62 | + ]); | ||
63 | + } | ||
64 | + ?> | ||
65 | + <?php | ||
66 | + if(array_filter($model->buttons)) { | ||
67 | + ?> | ||
68 | + <div class="buutons_comm style" style="margin-top: 15px"> | ||
69 | + <?php | ||
70 | + if(!empty( $model->buttons[ 'delete' ] )) { | ||
71 | + echo Html::a(( $model->user_id != NULL && $model->user_id == \Yii::$app->user->id ) ? 'ะฃะดะฐะปะธัั' : 'ะะพะถะฐะปะพะฒะฐัััั ', $model->buttons[ 'delete' ], [ 'class' => 'artbox_comment_delete_answer' ]); | ||
72 | + } | ||
73 | + if(!empty( $model->buttons[ 'update' ] )) { | ||
74 | + echo Html::a('ะ ะตะดะฐะบัะธัะพะฒะฐัั', $model->buttons[ 'update' ], [ 'class' => 'artbox_comment_update_answer' ]); | ||
75 | + } | ||
76 | + if(!empty( $model->buttons[ 'reply' ] )) { | ||
77 | + echo Html::a('ะัะฒะตัะธัั', $model->buttons[ 'reply' ], [ 'class' => CommentWidget::$baseClass[ 'comment_reply' ] . ' artbox_comment_reply_answer' ]); | ||
78 | + } | ||
79 | + ?> | ||
80 | + </div> | ||
81 | + <?php | ||
82 | + } | ||
83 | + ?> | ||
84 | + </div> | ||
85 | +<?php | ||
86 | + /* == PROJECT INFO == | ||
87 | + ?> | ||
88 | + <div class="comments-project-link">ะัะพะตะบั: <a href="#">ะ ะตะผะพะฝั ัะฟะฐะปัะฝะธ</a></div> | ||
89 | + <?php | ||
90 | + */ | ||
91 | +?> | ||
0 | \ No newline at end of file | 92 | \ No newline at end of file |
common/modules/comment/widgets/views/_review_comment_view.php
1 | -<?php | ||
2 | - use common\models\User; | ||
3 | - use yii\helpers\Html; | ||
4 | - | ||
5 | - /** | ||
6 | - * @var \common\modules\comment\models\Comment $model Current comment model | ||
7 | - * @var integer $key ID of current comment | ||
8 | - * @var integer $index index of current element according | ||
9 | - * to current page, starting from 0 | ||
10 | - * @var \yii\widgets\ListView $widget current ListView instance | ||
11 | - * @var User $user | ||
12 | - */ | ||
13 | - $user = $model->user; | ||
14 | -?> | ||
15 | - <div class="comments-name"> | ||
16 | - <?php | ||
17 | - if(!empty($user)) { | ||
18 | - echo $user->name; | ||
19 | - } else { | ||
20 | - echo $model->user_name; | ||
21 | - } | ||
22 | - ?> | ||
23 | - </div> | ||
24 | -<?php | ||
25 | - /* == STATUS PRO == | ||
26 | - ?> | ||
27 | - <div class="comments-status"><span>Pro</span></div> | ||
28 | - <?php | ||
29 | - */ | ||
30 | -?> | ||
31 | - <div class="comments-date"><?= \Yii::$app->formatter->asDate($model->date_add, 'php:d.m.Y') ?></div> | ||
32 | -<?php | ||
33 | - if(!empty( $model->rating )) { | ||
34 | - ?> | ||
35 | - <div class="rating"> | ||
36 | - <!--ะพัะตะฝะบะฐ--> | ||
37 | - <input type="hidden" class="val" value="<?= $model->rating->value ?>"/> | ||
38 | - </div> | ||
39 | - <?php | ||
40 | - } | ||
41 | -?> | ||
42 | - <div class="comments-content"> | ||
43 | - <?= $model->text ?> | ||
44 | - </div> | ||
45 | -<?php | ||
46 | - /* == PROJECT INFO == | ||
47 | - ?> | ||
48 | - <div class="comments-project-link">ะัะพะตะบั: <a href="#">ะ ะตะผะพะฝั ัะฟะฐะปัะฝะธ</a></div> | ||
49 | - <?php | ||
50 | - */ | 1 | +<?php |
2 | + use common\models\User; | ||
3 | + use common\modules\comment\widgets\CommentWidget; | ||
4 | + use kartik\rating\StarRating; | ||
5 | + use yii\helpers\Html; | ||
6 | + use yii\web\View; | ||
7 | + | ||
8 | + /** | ||
9 | + * @var View $this | ||
10 | + * @var \common\modules\comment\models\Comment $model Current comment model | ||
11 | + * @var integer $key ID of current comment | ||
12 | + * @var integer $index index of current element according | ||
13 | + * to current page, starting from 0 | ||
14 | + * @var \yii\widgets\ListView $widget current ListView instance | ||
15 | + * @var User $user | ||
16 | + */ | ||
17 | + $user = $model->user; | ||
18 | + $model->buildButtons([ 'delete' ]); | ||
19 | +?> | ||
20 | + <div class="comments-name <?= CommentWidget::$baseClass[ 'comment_author' ] ?>"> | ||
21 | + <?= $model->getAuthor(' (ะะพััั)') ?> | ||
22 | + </div> | ||
23 | +<?php | ||
24 | + /* == STATUS PRO == | ||
25 | + ?> | ||
26 | + <div class="comments-status"><span>Pro</span></div> | ||
27 | + <?php | ||
28 | + */ | ||
29 | +?> | ||
30 | + <div class="comments-date"><?= \Yii::$app->formatter->asDate($model->date_add, 'php:d.m.Y') ?></div> | ||
31 | +<?php | ||
32 | + if(!empty( $model->rating )) { | ||
33 | + echo StarRating::widget([ | ||
34 | + 'name' => 'rating_review_comment', | ||
35 | + 'value' => $model->rating->value, | ||
36 | + 'pluginOptions' => [ | ||
37 | + 'size' => 'xxs', | ||
38 | + 'displayOnly' => true, | ||
39 | + 'min' => 0, | ||
40 | + 'max' => 5, | ||
41 | + 'stars' => 5, | ||
42 | + ], | ||
43 | + ]); | ||
44 | + } | ||
45 | +?> | ||
46 | + <div class="comments-content"> | ||
47 | + <?= $model->text ?> | ||
48 | + </div> | ||
49 | + <div> | ||
50 | + <?php | ||
51 | + if(!empty( $model->buttons[ 'delete' ] )) { | ||
52 | + echo Html::a(( $model->user_id != NULL && $model->user_id == \Yii::$app->user->id ) ? 'ะฃะดะฐะปะธัั' : 'ะะพะถะฐะปะพะฒะฐัััั ', $model->buttons[ 'delete' ], [ 'class' => CommentWidget::$baseClass[ 'comment_delete' ] ]); | ||
53 | + } | ||
54 | + if(!empty( $model->buttons[ 'update' ] )) { | ||
55 | + echo Html::a('ะ ะตะดะฐะบัะธัะพะฒะฐัั', $model->buttons[ 'update' ], [ 'class' => CommentWidget::$baseClass[ 'comment_update' ] ]); | ||
56 | + } | ||
57 | + if(!empty( $model->buttons[ 'reply' ] )) { | ||
58 | + echo Html::a('ะัะฒะตัะธัั', $model->buttons[ 'reply' ], [ 'class' => CommentWidget::$baseClass[ 'comment_reply' ] ]); | ||
59 | + } | ||
60 | + ?> | ||
61 | + </div> | ||
62 | +<?php | ||
63 | + /* == PROJECT INFO == | ||
64 | + ?> | ||
65 | + <div class="comments-project-link">ะัะพะตะบั: <a href="#">ะ ะตะผะพะฝั ัะฟะฐะปัะฝะธ</a></div> | ||
66 | + <?php | ||
67 | + */ | ||
51 | ?> | 68 | ?> |
52 | \ No newline at end of file | 69 | \ No newline at end of file |
common/modules/comment/widgets/views/form-comment-answer.php
0 โ 100755
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 common\models\Project; | ||
9 | + use yii\widgets\ActiveForm; | ||
10 | + use yii\helpers\Html; | ||
11 | + | ||
12 | +?> | ||
13 | +<?php | ||
14 | + if(!empty( $model->model_id )) { | ||
15 | + $project = Project::findOne($model->model_id); | ||
16 | + } | ||
17 | + if(!empty( $project ) && $project->user_id != \Yii::$app->user->id) { | ||
18 | + ?> | ||
19 | + <div class="tender-add-answer-title fix_tender_answer">ะะฐะดะฐัั ะฒะพะฟัะพั</div> | ||
20 | + <?php | ||
21 | + } | ||
22 | +?> | ||
23 | +<div class="new-portf-add-comm style tender_questions_" style="padding-top: 16px"> | ||
24 | + | ||
25 | + <?php | ||
26 | + if(!empty( \Yii::$app->user->id )) { ?> | ||
27 | + <div class="form-ico-ded-wr" style="width: 100%"> | ||
28 | + <div class="header-cabinet-foto"> | ||
29 | + <img src="<?php echo \Yii::$app->user->identity->userInfo->image; ?>" alt=""> | ||
30 | + </div> | ||
31 | + <div class="form-value-ded-name"><?php echo \Yii::$app->user->identity->name; ?></div> | ||
32 | + </div> | ||
33 | + | ||
34 | + | ||
35 | + <?php | ||
36 | + } | ||
37 | + $form = ActiveForm::begin(['options' => ['data' => ['pjax' => true]]]); | ||
38 | + if(!$model->isNewRecord) { | ||
39 | + echo $form->field($model, 'comment_id') | ||
40 | + ->hiddenInput() | ||
41 | + ->label(false) | ||
42 | + ->error(false); | ||
43 | + } | ||
44 | + if(!empty( $model->comment_pid )) { | ||
45 | + echo $form->field($model, 'comment_pid') | ||
46 | + ->hiddenInput() | ||
47 | + ->label(false) | ||
48 | + ->error(false); | ||
49 | + } | ||
50 | + if($model->scenario == $model::SCENARIO_GUEST) { | ||
51 | + echo $form->field($model, 'user_name', [ | ||
52 | + 'options' => [ | ||
53 | + 'class' => 'input-blocks-comm', | ||
54 | + ], | ||
55 | + 'inputOptions' => [ | ||
56 | + 'class' => 'custom-input-4', | ||
57 | + ], | ||
58 | + ]) | ||
59 | + ->textInput(); | ||
60 | + echo $form->field($model, 'user_email', [ | ||
61 | + 'options' => [ | ||
62 | + 'class' => 'input-blocks-comm', | ||
63 | + ], | ||
64 | + 'inputOptions' => [ | ||
65 | + 'class' => 'custom-input-4', | ||
66 | + ], | ||
67 | + ]) | ||
68 | + ->textInput(); | ||
69 | + } | ||
70 | + | ||
71 | + ?> | ||
72 | + <div class="artbox_comment_reply_block artbox_comment_reply_answer_block"></div> | ||
73 | + <?php | ||
74 | + | ||
75 | + echo $form->field($model, 'text', [ | ||
76 | + 'options' => [ | ||
77 | + 'class' => 'input-blocks-comm area-comm tender_com_fix_', | ||
78 | + ], | ||
79 | + 'inputOptions' => [ | ||
80 | + 'class' => 'custom-area-4', | ||
81 | + ], | ||
82 | + ]) | ||
83 | + ->label($model->isNewRecord ? 'ะะพะฟัะพั' : 'ะัะฒะตั', [ 'class' => 'artbox_comment_answer_label' ]) | ||
84 | + ->textarea(); | ||
85 | + ?> | ||
86 | + <div class="input-blocks-comm-button style"> | ||
87 | + <?php | ||
88 | + if($model->isNewRecord) { | ||
89 | + echo Html::submitButton('ะะฐะดะฐัั ะฒะพะฟัะพั'); | ||
90 | + } else { | ||
91 | + echo Html::submitButton('ะะฑะฝะพะฒะธัั ะฒะพะฟัะพั', [ 'class' => 'artbox_comment_update_answer_submit' ]); | ||
92 | + } | ||
93 | + ?> | ||
94 | + </div> | ||
95 | + <?php | ||
96 | + $form->end(); | ||
97 | + ?> | ||
98 | +</div> | ||
0 | \ No newline at end of file | 99 | \ No newline at end of file |
common/modules/comment/widgets/views/form-comment-review.php
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="workplace-title style"> | ||
13 | - <p></p>ะะฝะตะฝะธั ะพ ะฟะพะปัะทะพะฒะฐัะตะปะต: <?= $dataProvider->totalCount ?></p></div> | ||
14 | -<div class="new-portf-add-comm style"> | ||
15 | - <?php | ||
16 | - $form = ActiveForm::begin(); | ||
17 | - echo $form->field($rating, 'value') | ||
18 | - ->label(false) | ||
19 | - ->radioList([ | ||
20 | - 1 => 1, | ||
21 | - 2 => 2, | ||
22 | - 3 => 3, | ||
23 | - 4 => 4, | ||
24 | - 5 => 5, | ||
25 | - ]); | ||
26 | - if($model->scenario == $model::SCENARIO_GUEST) { | ||
27 | - echo $form->field($model, 'user_name', [ | ||
28 | - 'options' => [ | ||
29 | - 'class' => 'input-blocks-comm', | ||
30 | - ], | ||
31 | - 'inputOptions' => [ | ||
32 | - 'class' => 'custom-input-4', | ||
33 | - ], | ||
34 | - ]) | ||
35 | - ->textInput(); | ||
36 | - echo $form->field($model, 'user_email', [ | ||
37 | - 'options' => [ | ||
38 | - 'class' => 'input-blocks-comm', | ||
39 | - ], | ||
40 | - 'inputOptions' => [ | ||
41 | - 'class' => 'custom-input-4', | ||
42 | - ], | ||
43 | - ]) | ||
44 | - ->textInput(); | ||
45 | - } | ||
46 | - | ||
47 | - ?> | ||
48 | - <div class="artbox_comment_reply_block"></div> | ||
49 | - <?php | ||
50 | - echo $form->field($model, 'text', [ | ||
51 | - 'options' => [ | ||
52 | - 'class' => 'input-blocks-comm area-comm', | ||
53 | - ], | ||
54 | - 'inputOptions' => [ | ||
55 | - 'class' => 'custom-area-4', | ||
56 | - ], | ||
57 | - ]) | ||
58 | - ->textarea(); | ||
59 | - ?> | ||
60 | - <div class="input-blocks-comm-button style"> | ||
61 | - <?= Html::submitButton('ะะพะฑะฐะฒะธัั ะบะพะผะผะตะฝัะฐัะธะน') ?> | ||
62 | - </div> | ||
63 | - <?php | ||
64 | - $form->end(); | ||
65 | - ?> | 1 | +<?php |
2 | + /** | ||
3 | + * @var View $this | ||
4 | + * @var \common\modules\comment\models\Comment $model | ||
5 | + * @var \common\models\User $user | ||
6 | + * @var \yii\data\ActiveDataProvider $dataProvider | ||
7 | + * @var null|\common\modules\comment\models\Rating $rating | ||
8 | + */ | ||
9 | + use common\modules\comment\widgets\CommentWidget; | ||
10 | + use kartik\rating\StarRating; | ||
11 | + use yii\web\View; | ||
12 | + use yii\widgets\ActiveForm; | ||
13 | + use yii\helpers\Html; | ||
14 | + | ||
15 | +?> | ||
16 | +<div class="new-portf-add-comm style"> | ||
17 | + <?php | ||
18 | + $form = ActiveForm::begin(); | ||
19 | + if(!$model->isNewRecord) { | ||
20 | + echo $form->field($model, 'comment_id') | ||
21 | + ->hiddenInput() | ||
22 | + ->label(false) | ||
23 | + ->error(false); | ||
24 | + } | ||
25 | + echo $form->field(( !empty( $model->rating ) ? $model->rating : $rating ), 'value') | ||
26 | + ->label(false) | ||
27 | + ->widget(StarRating::className(), [ | ||
28 | + 'pluginOptions' => [ | ||
29 | + 'size' => 'xxs', | ||
30 | + 'step' => 1, | ||
31 | + 'value' => 2, | ||
32 | + 'showCaption' => false, | ||
33 | + 'stars' => 5, | ||
34 | + 'min' => 0, | ||
35 | + 'max' => 5, | ||
36 | + ], | ||
37 | + ]); | ||
38 | + if($model->scenario == $model::SCENARIO_GUEST) { | ||
39 | + echo $form->field($model, 'user_name', [ | ||
40 | + 'options' => [ | ||
41 | + 'class' => 'input-blocks-comm', | ||
42 | + ], | ||
43 | + 'inputOptions' => [ | ||
44 | + 'class' => 'custom-input-4', | ||
45 | + ], | ||
46 | + ]) | ||
47 | + ->textInput(); | ||
48 | + echo $form->field($model, 'user_email', [ | ||
49 | + 'options' => [ | ||
50 | + 'class' => 'input-blocks-comm', | ||
51 | + ], | ||
52 | + 'inputOptions' => [ | ||
53 | + 'class' => 'custom-input-4', | ||
54 | + ], | ||
55 | + ]) | ||
56 | + ->textInput(); | ||
57 | + } | ||
58 | + if(!empty( $model->comment_pid )) { | ||
59 | + echo Html::tag('div', Html::activeHiddenInput($model, 'comment_pid') . Html::tag('p', $model->parent->author, [ 'class' => 'artbox_comment_reply_author' ]), [ 'class' => CommentWidget::$baseClass[ 'reply_block' ] ]); | ||
60 | + } else { | ||
61 | + echo Html::tag('div', '', [ 'class' => CommentWidget::$baseClass[ 'reply_block' ] . ' test_class' ]); | ||
62 | + } | ||
63 | + echo $form->field($model, 'text', [ | ||
64 | + 'options' => [ | ||
65 | + 'class' => 'input-blocks-comm area-comm', | ||
66 | + ], | ||
67 | + 'inputOptions' => [ | ||
68 | + 'class' => 'custom-area-4', | ||
69 | + ], | ||
70 | + ]) | ||
71 | + ->textarea(); | ||
72 | + ?> | ||
73 | + <div class="input-blocks-comm-button style"> | ||
74 | + <?php | ||
75 | + if($model->isNewRecord) { | ||
76 | + echo Html::submitButton('ะะพะฑะฐะฒะธัั ะบะพะผะผะตะฝัะฐัะธะน'); | ||
77 | + } else { | ||
78 | + echo Html::submitButton('ะะฑะฝะพะฒะธัั ะบะพะผะผะตะฝัะฐัะธะน', [ 'class' => CommentWidget::$baseClass[ 'comment_update_submit' ] ]); | ||
79 | + } | ||
80 | + ?> | ||
81 | + </div> | ||
82 | + <?php | ||
83 | + $form->end(); | ||
84 | + ?> | ||
66 | </div> | 85 | </div> |
67 | \ No newline at end of file | 86 | \ No newline at end of file |
common/modules/comment/widgets/views/form-comment.php
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 | - | ||
19 | - echo $form->field($rating, 'value') | ||
20 | - ->label(false) | ||
21 | - ->radioList([ | ||
22 | - 1 => 1, | ||
23 | - 2 => 2, | ||
24 | - 3 => 3, | ||
25 | - 4 => 4, | ||
26 | - 5 => 5, | ||
27 | - ]); | ||
28 | - | ||
29 | - if($model->scenario == $model::SCENARIO_GUEST) { | ||
30 | - echo $form->field($model, 'user_name', [ | ||
31 | - 'options' => [ | ||
32 | - 'class' => 'input-blocks-comm', | ||
33 | - ], | ||
34 | - 'inputOptions' => [ | ||
35 | - 'class' => 'custom-input-4', | ||
36 | - ], | ||
37 | - ]) | ||
38 | - ->textInput(); | ||
39 | - echo $form->field($model, 'user_email', [ | ||
40 | - 'options' => [ | ||
41 | - 'class' => 'input-blocks-comm', | ||
42 | - ], | ||
43 | - 'inputOptions' => [ | ||
44 | - 'class' => 'custom-input-4', | ||
45 | - ], | ||
46 | - ]) | ||
47 | - ->textInput(); | ||
48 | - } | ||
49 | - | ||
50 | - ?> | ||
51 | - <div class="artbox_comment_reply_block"></div> | ||
52 | - <?php | ||
53 | - | ||
54 | - echo $form->field($model, 'text', [ | ||
55 | - 'options' => [ | ||
56 | - 'class' => 'input-blocks-comm area-comm', | ||
57 | - ], | ||
58 | - 'inputOptions' => [ | ||
59 | - 'class' => 'custom-area-4', | ||
60 | - ], | ||
61 | - ]) | ||
62 | - ->textarea(); | ||
63 | - ?> | ||
64 | - <div class="input-blocks-comm-button style"> | ||
65 | - <?= Html::submitButton('ะะพะฑะฐะฒะธัั ะบะพะผะผะตะฝัะฐัะธะน') ?> | ||
66 | - </div> | ||
67 | - <?php | ||
68 | - $form->end(); | ||
69 | - ?> | 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 kartik\rating\StarRating; | ||
9 | + use yii\widgets\ActiveForm; | ||
10 | + use yii\helpers\Html; | ||
11 | + | ||
12 | +?> | ||
13 | +<div class="new-portf-comm-count">ะะพะผะผะตะฝัะฐัะธะธ: <?= $dataProvider->totalCount ?></div> | ||
14 | + | ||
15 | +<div class="new-portf-add-comm style"> | ||
16 | + | ||
17 | + <?php | ||
18 | + $form = ActiveForm::begin(); | ||
19 | + if($rating) { | ||
20 | + echo $form->field(( !empty( $model->rating ) ? $model->rating : $rating ), 'value') | ||
21 | + ->label(false) | ||
22 | + ->widget(StarRating::className(), [ | ||
23 | + 'pluginOptions' => [ | ||
24 | + 'size' => 'xxs', | ||
25 | + 'step' => 1, | ||
26 | + 'value' => 2, | ||
27 | + 'showCaption' => false, | ||
28 | + 'min' => 0, | ||
29 | + 'max' => 10, | ||
30 | + 'stars' => 10, | ||
31 | + ], | ||
32 | + ]); | ||
33 | + } | ||
34 | + | ||
35 | + if($model->scenario == $model::SCENARIO_GUEST) { | ||
36 | + echo $form->field($model, 'user_name', [ | ||
37 | + 'options' => [ | ||
38 | + 'class' => 'input-blocks-comm fix_marg_', | ||
39 | + ], | ||
40 | + 'inputOptions' => [ | ||
41 | + 'class' => 'custom-input-4', | ||
42 | + ], | ||
43 | + ]) | ||
44 | + ->textInput(); | ||
45 | + echo $form->field($model, 'user_email', [ | ||
46 | + 'options' => [ | ||
47 | + 'class' => 'input-blocks-comm', | ||
48 | + ], | ||
49 | + 'inputOptions' => [ | ||
50 | + 'class' => 'custom-input-4', | ||
51 | + ], | ||
52 | + ]) | ||
53 | + ->textInput() | ||
54 | + ->hint('ะะฐั email ะฝะต ะฑัะดะตั ะดะพัััะฟะตะฝ ะบ ะฟัะพัะผะพััั.'); | ||
55 | + } | ||
56 | + | ||
57 | + ?> | ||
58 | + <div class="artbox_comment_reply_block"></div> | ||
59 | + <?php | ||
60 | + | ||
61 | + echo $form->field($model, 'text', [ | ||
62 | + 'options' => [ | ||
63 | + 'class' => 'input-blocks-comm area-comm', | ||
64 | + ], | ||
65 | + 'inputOptions' => [ | ||
66 | + 'class' => 'custom-area-4', | ||
67 | + ], | ||
68 | + ]) | ||
69 | + ->textarea(); | ||
70 | + ?> | ||
71 | + <div class="input-blocks-comm-button style"> | ||
72 | + <?= Html::submitButton('ะะพะฑะฐะฒะธัั ะบะพะผะผะตะฝัะฐัะธะน') ?> | ||
73 | + </div> | ||
74 | + <?php | ||
75 | + $form->end(); | ||
76 | + ?> | ||
70 | </div> | 77 | </div> |
71 | \ No newline at end of file | 78 | \ No newline at end of file |
common/modules/comment/widgets/views/form-project-comment.php
1 | -<?php | ||
2 | - /** | ||
3 | - * @var \common\modules\comment\models\CommentProject $model | ||
4 | - * @var \common\models\User $user | ||
5 | - * @var \yii\data\ActiveDataProvider $dataProvider | ||
6 | - */ | ||
7 | - use common\models\Currency; | ||
8 | - use yii\widgets\ActiveForm; | ||
9 | - use yii\helpers\Html; | ||
10 | - | ||
11 | - $currencies = Currency::getCurrencyDropdown(); | ||
12 | -?> | ||
13 | - | ||
14 | -<div class="new-portf-add-comm style"> | ||
15 | - <div class="box-wr"> | ||
16 | - <div class="box-all"> | ||
17 | - <div class="tender-add-answer-title"><?= Yii::t('app', 'add_answer') ?></div> | ||
18 | - <div class="form-tender-answer style"> | ||
19 | - <?php | ||
20 | - $form = ActiveForm::begin([ 'options' => [ 'class' => 'resformsfile MultiFile-intercepted', 'enctype' => 'multipart/form-data' ] ]); | ||
21 | - ?> | ||
22 | - <div class="form-value-wr style"> | ||
23 | - <div class="form-ico-ded-wr"> | ||
24 | - <div class="header-cabinet-foto"> | ||
25 | - <?= Html::img(($user->userInfo->image)?:'') ?> | ||
26 | - </div> | ||
27 | - <div class="form-value-ded-name"> | ||
28 | - <?= $user->name ?> | ||
29 | - </div> | ||
30 | - </div> | ||
31 | - <div class="form-value-price-wr"> | ||
32 | - <div class="form-value-price-title">ะกัะพะธะผะพััั</div> | ||
33 | - <div class="form-price-wr"> | ||
34 | - <?= $form->field($model, 'budget_from', [ | ||
35 | - 'template' => "{input}\n{error}", | ||
36 | - 'options' => [ 'tag' => 'span' ], | ||
37 | - ]) | ||
38 | - ->input('number', [ 'placeholder' => $model->getAttributeLabel('budget_from') ]) ?> | ||
39 | - <?= $form->field($model, 'budget_to', [ | ||
40 | - 'template' => "{input}\n{error}", | ||
41 | - 'options' => [ 'tag' => 'span' ], | ||
42 | - ]) | ||
43 | - ->input('number', [ 'placeholder' => $model->getAttributeLabel('budget_to') ]) ?> | ||
44 | - <?= $form->field($model, 'budget_currency', [ | ||
45 | - 'template' => "{input}<div class='select-after'></div>\n{error}", | ||
46 | - 'options' => [ 'class' => 'blocks-check-list-wrapp check-valuta' ], | ||
47 | - ]) | ||
48 | - ->dropDownList($currencies) ?> | ||
49 | - </div> | ||
50 | - </div> | ||
51 | - <div class="form-value-price-wr" style="float: right"> | ||
52 | - <div class="form-value-price-title"> | ||
53 | - ะกัะพะบะธ(<span style="font-weight: normal">ะฒ ะดะฝัั </span>) | ||
54 | - </div> | ||
55 | - <div class="form-price-wr"> | ||
56 | - <?= $form->field($model, 'term_from', [ | ||
57 | - 'template' => "{input}\n{error}", | ||
58 | - 'options' => [ 'tag' => 'span' ], | ||
59 | - ]) | ||
60 | - ->input('number', [ 'placeholder' => $model->getAttributeLabel('term_from') ]) ?> | ||
61 | - <?= $form->field($model, 'term_to', [ | ||
62 | - 'template' => "{input}\n{error}", | ||
63 | - 'options' => [ 'tag' => 'span' ], | ||
64 | - ]) | ||
65 | - ->input('number', [ 'placeholder' => $model->getAttributeLabel('term_to') ]) ?> | ||
66 | - </div> | ||
67 | - </div> | ||
68 | - </div> | ||
69 | - <?= $form->field($model, 'text', [ | ||
70 | - 'template' => "{input}\n{error}", | ||
71 | - 'options' => [ 'class' => 'form-tender-txt style' ], | ||
72 | - ]) | ||
73 | - ->textarea([ 'placeholder' => $model->getAttributeLabel('text') ]) ?> | ||
74 | - <div class="tender-file-wr"> | ||
75 | - <?= $form->field($model, 'file[]') | ||
76 | - ->fileInput([ 'class' => 'multi' ]) | ||
77 | - ->label(false) ?> | ||
78 | - <a href="#" class="addfilemulti">ะัะธะบัะตะฟะธัั ัะฐะนะป</a> | ||
79 | - <div class="max-size">ะะฐะบัะธะผะฐะปัะฝัะน ัะฐะทะผะตั<br/>ัะฐะนะปะฐ 5 ะะ</div> | ||
80 | - </div> | ||
81 | - <div class="tender-form-buttons-wr"> | ||
82 | - <?php | ||
83 | - echo Html::submitInput('ะะพะดะฐัั ะทะฐัะฒะบั', [ 'class' => 'get-project-new' ]); | ||
84 | - echo Html::submitInput('ะพัะฒะตัะธัั ะฐะฝะพะฝะธะผะฝะพ', [ | ||
85 | - 'class' => 'get-list-new', | ||
86 | - 'name' => 'CommentProject[anonymous]', | ||
87 | - ]); | ||
88 | - echo Html::a('ะัะธััะธัั', [ | ||
89 | - 'tender/view', | ||
90 | - 'tender_id' => \Yii::$app->request->get('tender_id'), | ||
91 | - '#' => 'w1', | ||
92 | - ]); | ||
93 | - ?> | ||
94 | - </div> | ||
95 | - <?php | ||
96 | - $form->end(); | ||
97 | - ?> | ||
98 | - </div> | ||
99 | - </div> | ||
100 | - </div> | 1 | +<?php |
2 | + /** | ||
3 | + * @var \common\modules\comment\models\CommentProject $model | ||
4 | + * @var \common\models\User $user | ||
5 | + * @var \yii\data\ActiveDataProvider $dataProvider | ||
6 | + */ | ||
7 | + use common\models\Currency; | ||
8 | + use yii\widgets\ActiveForm; | ||
9 | + use yii\helpers\Html; | ||
10 | + | ||
11 | + $currencies = Currency::getCurrencyDropdown(); | ||
12 | +?> | ||
13 | +<div class="tender-add-answer-title fix_tender_answer"><?= Yii::t('app', 'add_answer') ?></div> | ||
14 | +<div class="new-portf-add-comm style fix-portf_"> | ||
15 | + | ||
16 | + | ||
17 | + | ||
18 | + <div class="form-tender-answer _fix_errors_tender style"> | ||
19 | + <?php | ||
20 | + $form = ActiveForm::begin([ 'options' => [ 'class' => 'resformsfile MultiFile-intercepted', 'enctype' => 'multipart/form-data', 'data' => ['pjax' => true] ] ]); | ||
21 | + ?> | ||
22 | + <div class="form-value-wr style"> | ||
23 | + <div class="form-ico-ded-wr"> | ||
24 | + <div class="header-cabinet-foto"> | ||
25 | + <?= Html::img(($user->userInfo->image)?:'') ?> | ||
26 | + </div> | ||
27 | + <div class="form-value-ded-name"> | ||
28 | + <?= $user->name ?> | ||
29 | + </div> | ||
30 | + </div> | ||
31 | + <div class="form-value-price-wr"> | ||
32 | + <div class="form-value-price-title">ะกัะพะธะผะพััั</div> | ||
33 | + <div class="form-price-wr"> | ||
34 | + <?= $form->field($model, 'budget_from', [ | ||
35 | + 'template' => "{input}\n{error}", | ||
36 | + 'options' => [ 'tag' => 'span' ], | ||
37 | + ]) | ||
38 | + ->input('number', [ 'placeholder' => $model->getAttributeLabel('budget_from') ]) ?> | ||
39 | + <?= $form->field($model, 'budget_to', [ | ||
40 | + 'template' => "{input}\n{error}", | ||
41 | + 'options' => [ 'tag' => 'span' ], | ||
42 | + ]) | ||
43 | + ->input('number', [ 'placeholder' => $model->getAttributeLabel('budget_to') ]) ?> | ||
44 | + <?= $form->field($model, 'budget_currency', [ | ||
45 | + 'template' => "{input}<div class='select-after'></div>\n{error}", | ||
46 | + 'options' => [ 'class' => 'blocks-check-list-wrapp check-valuta' ], | ||
47 | + ]) | ||
48 | + ->dropDownList($currencies) ?> | ||
49 | + </div> | ||
50 | + </div> | ||
51 | + <div class="form-value-price-wr" style="float: right"> | ||
52 | + <div class="form-value-price-title"> | ||
53 | + ะกัะพะบะธ(<span style="font-weight: normal">ะฒ ะดะฝัั </span>) | ||
54 | + </div> | ||
55 | + <div class="form-price-wr"> | ||
56 | + <?= $form->field($model, 'term_from', [ | ||
57 | + 'template' => "{input}\n{error}", | ||
58 | + 'options' => [ 'tag' => 'span' ], | ||
59 | + ]) | ||
60 | + ->input('number', [ 'placeholder' => $model->getAttributeLabel('term_from') ]) ?> | ||
61 | + <?= $form->field($model, 'term_to', [ | ||
62 | + 'template' => "{input}\n{error}", | ||
63 | + 'options' => [ 'tag' => 'span' ], | ||
64 | + ]) | ||
65 | + ->input('number', [ 'placeholder' => $model->getAttributeLabel('term_to') ]) ?> | ||
66 | + </div> | ||
67 | + </div> | ||
68 | + </div> | ||
69 | + <?= $form->field($model, 'text', [ | ||
70 | + 'template' => "{input}\n{error}", | ||
71 | + 'options' => [ 'class' => 'form-tender-txt style' ], | ||
72 | + ]) | ||
73 | + ->textarea([ 'placeholder' => $model->getAttributeLabel('text') ]) ?> | ||
74 | + <div class="tender-file-wr"> | ||
75 | + <?= $form->field($model, 'file[]') | ||
76 | + ->fileInput([ 'class' => 'multi' ]) | ||
77 | + ->label(false) ?> | ||
78 | + <a href="#" class="addfilemulti">ะัะธะบัะตะฟะธัั ัะฐะนะป</a> | ||
79 | + <div class="max-size">ะะฐะบัะธะผะฐะปัะฝัะน ัะฐะทะผะตั<br/>ัะฐะนะปะฐ 5 ะะ</div> | ||
80 | + </div> | ||
81 | + <div class="tender-form-buttons-wr"> | ||
82 | + <?php | ||
83 | + echo Html::submitInput('ะะพะดะฐัั ะทะฐัะฒะบั', [ 'class' => 'get-project-new' ]); | ||
84 | + echo Html::submitInput('ะพัะฒะตัะธัั ะฐะฝะพะฝะธะผะฝะพ', [ | ||
85 | + 'class' => 'get-list-new', | ||
86 | + 'name' => 'CommentProject[anonymous]', | ||
87 | + ]); | ||
88 | + echo Html::a('ะัะธััะธัั', [ | ||
89 | + 'tender/view', | ||
90 | + 'tender_id' => \Yii::$app->request->get('tender_id'), | ||
91 | + '#' => 'w1', | ||
92 | + ]); | ||
93 | + ?> | ||
94 | + </div> | ||
95 | + <?php | ||
96 | + $form->end(); | ||
97 | + ?> | ||
98 | + </div> | ||
99 | + | ||
100 | + | ||
101 | </div> | 101 | </div> |
102 | \ No newline at end of file | 102 | \ No newline at end of file |
common/modules/comment/widgets/views/list-comment-question.php
0 โ 100755
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 | + | ||
9 | + | ||
10 | + if(!empty( $dataProvider )) { | ||
11 | + ?> | ||
12 | + <div class="tender-offer-proj-title-all">ะะพะฟัะพัะพะฒ: (<?= $dataProvider->totalCount ?>)</div> | ||
13 | + <?php | ||
14 | + } | ||
15 | + | ||
16 | + | ||
17 | + echo \yii\widgets\ListView::widget([ | ||
18 | + 'dataProvider' => $dataProvider, | ||
19 | + 'itemView' => '_question_comment_view', | ||
20 | + 'options' => [ | ||
21 | + 'tag' => 'ul', | ||
22 | + 'class' => 'proektant-comments tender_list_comm_ style', | ||
23 | + ], | ||
24 | + 'itemOptions' => [ | ||
25 | + 'tag' => 'li', | ||
26 | + 'class' => CommentWidget::$baseClass[ 'comment_container' ], | ||
27 | + 'data' => [ | ||
28 | + 'form' => $commentClass->formName(), | ||
29 | + ], | ||
30 | + ], | ||
31 | + 'layout' => "{items}\n{pager}", | ||
32 | + ]); | ||
0 | \ No newline at end of file | 33 | \ No newline at end of file |
common/modules/comment/widgets/views/list-comment-review.php
1 | -<?php | ||
2 | - /** | ||
3 | - * @var \yii\data\DataProviderInterface $dataProvider | ||
4 | - */ | ||
5 | -echo \yii\widgets\ListView::widget([ | ||
6 | - 'dataProvider' => $dataProvider, | ||
7 | - 'itemView' => '_review_comment_view', | ||
8 | - 'options' => [ | ||
9 | - 'tag' => 'ul', | ||
10 | - 'class' => 'proektant-comments style' | ||
11 | - ], | ||
12 | - 'itemOptions' => [ | ||
13 | - 'tag' => 'li', | ||
14 | - ], | ||
15 | - 'layout' => "{items}\n{pager}", | ||
16 | -]); | ||
17 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +<?php | ||
3 | + /** | ||
4 | + * @var \yii\data\DataProviderInterface $dataProvider | ||
5 | + * @var Comment $commentClass | ||
6 | + */ | ||
7 | + use common\modules\comment\models\Comment; | ||
8 | + use common\modules\comment\widgets\CommentWidget; | ||
9 | + echo \yii\widgets\ListView::widget([ | ||
10 | + 'dataProvider' => $dataProvider, | ||
11 | + 'itemView' => '_review_comment_view', | ||
12 | + 'options' => [ | ||
13 | + 'tag' => 'ul', | ||
14 | + 'class' => 'proektant-comments style', | ||
15 | + ], | ||
16 | + 'itemOptions' => [ | ||
17 | + 'tag' => 'li', | ||
18 | + 'class' => CommentWidget::$baseClass[ 'comment_container' ], | ||
19 | + 'data' => [ | ||
20 | + 'form' => $commentClass->formName(), | ||
21 | + ], | ||
22 | + ], | ||
23 | + 'layout' => "{items}\n<div class='navi-buttons-wr style'>{pager}</div>", | ||
24 | + ]); | ||
18 | \ No newline at end of file | 25 | \ No newline at end of file |
common/modules/comment/widgets/views/list-comment.php
1 | -<?php | ||
2 | - /** | ||
3 | - * @var \yii\data\DataProviderInterface $dataProvider | ||
4 | - */ | ||
5 | -echo \yii\widgets\ListView::widget([ | ||
6 | - 'dataProvider' => $dataProvider, | ||
7 | - 'itemView' => 'project_comment_view', | ||
8 | - 'itemOptions' => [ | ||
9 | - 'tag' => false, | ||
10 | - ], | ||
11 | - 'summary' => '', | 1 | +<?php |
2 | + /** | ||
3 | + * @var \yii\data\DataProviderInterface $dataProvider | ||
4 | + */ | ||
5 | +echo \yii\widgets\ListView::widget([ | ||
6 | + 'dataProvider' => $dataProvider, | ||
7 | + 'itemView' => 'project_comment_view', | ||
8 | + 'itemOptions' => [ | ||
9 | + 'tag' => false, | ||
10 | + ], | ||
11 | + 'summary' => '', | ||
12 | ]); | 12 | ]); |
13 | \ No newline at end of file | 13 | \ No newline at end of file |
common/modules/comment/widgets/views/list-project-comment.php
1 | -<?php | ||
2 | - /** | ||
3 | - * @var \yii\data\DataProviderInterface $dataProvider | ||
4 | - */ | ||
5 | -?> | ||
6 | -<div class="box-wr"> | ||
7 | - <div class="box-all"> | ||
8 | - <div class="tender-offer-proj-title-all style">ะัะตะดะปะพะถะตะฝะธั ะฟัะพะตะบัะฐะฝัะพะฒ (<?=$dataProvider->getTotalCount()?>)</div> | ||
9 | - <div class="tender-offer-proj-blocks-wr style"> | ||
10 | - <?php | ||
11 | - echo \yii\widgets\ListView::widget([ | ||
12 | - 'dataProvider' => $dataProvider, | ||
13 | - 'itemView' => '_project_comment_view', | ||
14 | - 'itemOptions' => [ | ||
15 | - 'class' => 'tender-offer-proj-blocks style', | ||
16 | - ], | ||
17 | - 'summary' => '', | ||
18 | - ]); | ||
19 | - ?> | ||
20 | - </div> | ||
21 | - </div> | 1 | +<?php |
2 | + /** | ||
3 | + * @var \yii\data\DataProviderInterface $dataProvider | ||
4 | + */ | ||
5 | +?> | ||
6 | +<div class="box-wr"> | ||
7 | + <div class="box-all"> | ||
8 | + <div class="tender-offer-proj-title-all style">ะัะตะดะปะพะถะตะฝะธั ะฟัะพะตะบัะฐะฝัะพะฒ (<?=$dataProvider->getTotalCount()?>)</div> | ||
9 | + <div class="tender-offer-proj-blocks-wr style"> | ||
10 | + <?php | ||
11 | + echo \yii\widgets\ListView::widget([ | ||
12 | + 'dataProvider' => $dataProvider, | ||
13 | + 'itemView' => '_project_comment_view', | ||
14 | + 'itemOptions' => [ | ||
15 | + 'class' => 'tender-offer-proj-blocks style', | ||
16 | + ], | ||
17 | + 'summary' => '', | ||
18 | + ]); | ||
19 | + ?> | ||
20 | + </div> | ||
21 | + </div> | ||
22 | </div> | 22 | </div> |
23 | \ No newline at end of file | 23 | \ No newline at end of file |
common/modules/comment/widgets/views/project_comment_view.php
1 | -<?php | ||
2 | - use common\models\User; | ||
3 | - use yii\helpers\Html; | ||
4 | - | ||
5 | - /** | ||
6 | - * @var \common\modules\comment\models\Comment $model Current comment model | ||
7 | - * @var integer $key ID of current comment | ||
8 | - * @var integer $index index of current element according to | ||
9 | - * current page, starting from 0 | ||
10 | - * @var \yii\widgets\ListView $widget current ListView instance | ||
11 | - * @var User $user | ||
12 | - */ | ||
13 | - $user = NULL; | ||
14 | - if(!empty( $model->user_id )) { | ||
15 | - $user = User::find() | ||
16 | - ->where([ 'id' => $model->user_id ]) | ||
17 | - ->with('userInfo') | ||
18 | - ->one(); | ||
19 | - } | ||
20 | -?> | ||
21 | -<div class="new-portf-comm-read artbox_comment_container" data-comment_id="<?= $model->comment_id ?>" data-form_name="<?= $model->formName() ?>"> | ||
22 | - <div class="style"> | ||
23 | - <div class="header-cabinet-foto"> | ||
24 | - <?php | ||
25 | - if(!empty( $user ) && !empty( $user->userInfo->image )) { | ||
26 | - echo "<img src='{$user->userInfo->image}' alt=''>"; | ||
27 | - } else { | ||
28 | - echo "<img src='/images/ded-ico.png' alt=''>"; | ||
29 | - } | ||
30 | - ?> | ||
31 | - </div> | ||
32 | - <div class="new-prof-wrapper-read"> | ||
33 | - <div class="new-portf-comm-read-title"> | ||
34 | - <?php | ||
35 | - if(!empty( $user )) { | ||
36 | - echo Html::a('<span class="artbox_comment_author">' . $user->firstname . ' ' . $user->lastname . '</span>', [ | ||
37 | - 'performer/common', | ||
38 | - 'performer_id' => $user->id, | ||
39 | - ]); | ||
40 | - } else { | ||
41 | - echo '<span class="artbox_comment_author">' . $model->user_name . '</span>' . '(ะะพััั)'; | ||
42 | - } | ||
43 | - ?> | ||
44 | - </div> | ||
45 | - <div class="new-portf-comm-read-rating"> | ||
46 | - <?php | ||
47 | - if($rating = $model->hasRating()) { | ||
48 | - ?> | ||
49 | - <div class="rating"> | ||
50 | - <!--ะพัะตะฝะบะฐ--> | ||
51 | - <input type="hidden" class="val" value="<?= $rating->value ?>"/> | ||
52 | - <!--ะบะพะปะธัะตััะฒะพ ะณะพะปะพัะพะฒ--> | ||
53 | - <input type="hidden" class="votes" value="1"/> | ||
54 | - </div> | ||
55 | - <?php | ||
56 | - } | ||
57 | - ?> | ||
58 | - </div> | ||
59 | - <div class="blog-post-date"> | ||
60 | - <span></span> | ||
61 | - <p><?= date('d.m.Y', strtotime($model->date_add)) ?></p> | ||
62 | - </div> | ||
63 | - </div> | ||
64 | - | ||
65 | - <div class="new-portf-answer artbox_comment_text"> | ||
66 | - <?= Html::encode($model->text) ?> | ||
67 | - </div> | ||
68 | - <div style="clear:both"></div> | ||
69 | - <?php | ||
70 | - /* | ||
71 | - ?> | ||
72 | - <div class="action_panel"> | ||
73 | - <ul> | ||
74 | - <li style="display:inline-block" class="artbox_comment_reply">ะัะฒะตัะธัั</li> | ||
75 | - <li style="display:inline-block" class="artbox_comment_update">ะ ะตะดะฐะบัะธัะพะฒะฐัั</li> | ||
76 | - <li style="display:inline-block" class="artbox_comment_delete">ะฃะดะฐะปะธัั</li> | ||
77 | - </ul> | ||
78 | - </div> | ||
79 | - <?php | ||
80 | - */ | ||
81 | - ?> | ||
82 | - </div> | ||
83 | - <div class="style"></div> | 1 | +<?php |
2 | + use common\models\User; | ||
3 | + use common\modules\comment\widgets\CommentWidget; | ||
4 | + use kartik\rating\StarRating; | ||
5 | + use yii\helpers\Html; | ||
6 | + | ||
7 | + /** | ||
8 | + * @var \common\modules\comment\models\Comment $model Current comment model | ||
9 | + * @var integer $key ID of current comment | ||
10 | + * @var integer $index index of current element according to | ||
11 | + * current page, starting from 0 | ||
12 | + * @var \yii\widgets\ListView $widget current ListView instance | ||
13 | + * @var User $user | ||
14 | + */ | ||
15 | + $user = NULL; | ||
16 | + if(!empty( $model->user_id )) { | ||
17 | + $user = User::find() | ||
18 | + ->where([ 'id' => $model->user_id ]) | ||
19 | + ->with('userInfo') | ||
20 | + ->one(); | ||
21 | + } | ||
22 | + $model->buildButtons([ 'delete' ]); | ||
23 | +?> | ||
24 | +<div class="new-portf-comm-read artbox_comment_container" data-key="<?= $model->comment_id ?>" data-form="<?= $model->formName() ?>"> | ||
25 | + <div class="style"> | ||
26 | + <div class="header-cabinet-foto"> | ||
27 | + <?php | ||
28 | + if(!empty( $user ) && !empty( $user->userInfo->image )) { | ||
29 | + echo "<img src='{$user->userInfo->image}' alt=''>"; | ||
30 | + } else { | ||
31 | + echo "<img src='/images/ico-profile.png' alt=''>"; | ||
32 | + } | ||
33 | + ?> | ||
34 | + </div> | ||
35 | + <div style="width: 500px; float: left; margin-left: 12px;"> | ||
36 | + <div class="comments-name style artbox_comment_author"> | ||
37 | + <?php | ||
38 | + if(!empty( $user )) { | ||
39 | + echo Html::a('<span class="artbox_comment_author">' . $user->firstname . ' ' . $user->lastname . '</span>', [ | ||
40 | + 'performer/common', | ||
41 | + 'performer_id' => $user->id, | ||
42 | + ]); | ||
43 | + } else { | ||
44 | + echo '<span class="artbox_comment_author">' . $model->user_name . '</span>' . '(ะะพััั)'; | ||
45 | + } | ||
46 | + ?> | ||
47 | + </div> | ||
48 | + <div class="new-portf-comm-read-rating"> | ||
49 | + <?php | ||
50 | + if($rating = $model->hasRating()) { | ||
51 | + echo StarRating::widget([ | ||
52 | + 'name' => 'rating_project_comment', | ||
53 | + 'value' => $rating->value, | ||
54 | + 'pluginOptions' => [ | ||
55 | + 'displayOnly' => true, | ||
56 | + 'size' => 'xxs', | ||
57 | + 'min' => 0, | ||
58 | + 'max' => 10, | ||
59 | + 'stars' => 10, | ||
60 | + ], | ||
61 | + ]); | ||
62 | + } | ||
63 | + ?> | ||
64 | + </div> | ||
65 | + <div class="blog-post-date style"> | ||
66 | + <span></span> | ||
67 | + <p><?= date('d.m.Y', strtotime($model->date_add)) ?></p> | ||
68 | + </div> | ||
69 | + </div> | ||
70 | + | ||
71 | + <div class="new-portf-answer artbox_comment_text"> | ||
72 | + <?= Html::encode($model->text) ?> | ||
73 | + </div> | ||
74 | + <div style="clear:both"></div> | ||
75 | + <div> | ||
76 | + <?php | ||
77 | + if(!empty( $model->buttons[ 'delete' ] )) { | ||
78 | + echo Html::a(( $model->user_id != NULL && $model->user_id == \Yii::$app->user->id ) ? 'ะฃะดะฐะปะธัั' : 'ะะพะถะฐะปะพะฒะฐัััั ', $model->buttons[ 'delete' ], [ 'class' => CommentWidget::$baseClass[ 'comment_delete' ] ]); | ||
79 | + } | ||
80 | + if(!empty( $model->buttons[ 'update' ] )) { | ||
81 | + echo Html::a('ะ ะตะดะฐะบัะธัะพะฒะฐัั', $model->buttons[ 'update' ], [ 'class' => CommentWidget::$baseClass[ 'comment_update' ] ]); | ||
82 | + } | ||
83 | + if(!empty( $model->buttons[ 'reply' ] )) { | ||
84 | + echo Html::a('ะัะฒะตัะธัั', $model->buttons[ 'reply' ], [ 'class' => CommentWidget::$baseClass[ 'comment_reply' ] ]); | ||
85 | + } | ||
86 | + ?> | ||
87 | + </div> | ||
88 | + <?php | ||
89 | + /* | ||
90 | + ?> | ||
91 | + <div class="action_panel"> | ||
92 | + <ul> | ||
93 | + <li style="display:inline-block" class="artbox_comment_reply">ะัะฒะตัะธัั</li> | ||
94 | + <li style="display:inline-block" class="artbox_comment_update">ะ ะตะดะฐะบัะธัะพะฒะฐัั</li> | ||
95 | + <li style="display:inline-block" class="artbox_comment_delete">ะฃะดะฐะปะธัั</li> | ||
96 | + </ul> | ||
97 | + </div> | ||
98 | + <?php | ||
99 | + */ | ||
100 | + ?> | ||
101 | + </div> | ||
102 | + <div class="style"></div> | ||
84 | </div> | 103 | </div> |
85 | \ No newline at end of file | 104 | \ No newline at end of file |
common/modules/product/models/Product.php
@@ -3,6 +3,8 @@ | @@ -3,6 +3,8 @@ | ||
3 | namespace common\modules\product\models; | 3 | namespace common\modules\product\models; |
4 | 4 | ||
5 | use common\behaviors\Slug; | 5 | use common\behaviors\Slug; |
6 | +use common\models\ProductToRating; | ||
7 | +use common\modules\comment\models\Comment; | ||
6 | use common\modules\product\behaviors\FilterBehavior; | 8 | use common\modules\product\behaviors\FilterBehavior; |
7 | use common\modules\rubrication\models\TaxGroup; | 9 | use common\modules\rubrication\models\TaxGroup; |
8 | use common\modules\rubrication\models\TaxOption; | 10 | use common\modules\rubrication\models\TaxOption; |
@@ -28,6 +30,7 @@ use yii\web\UploadedFile; | @@ -28,6 +30,7 @@ use yii\web\UploadedFile; | ||
28 | * @property boolean $is_top | 30 | * @property boolean $is_top |
29 | * @property boolean $is_new | 31 | * @property boolean $is_new |
30 | * @property boolean $akciya | 32 | * @property boolean $akciya |
33 | + * @property ProductToRating $averageRating | ||
31 | * @property array $properties | 34 | * @property array $properties |
32 | * @property ProductVariant $enabledVariant | 35 | * @property ProductVariant $enabledVariant |
33 | * @property array $enabledVariants | 36 | * @property array $enabledVariants |
@@ -378,4 +381,33 @@ class Product extends \yii\db\ActiveRecord | @@ -378,4 +381,33 @@ class Product extends \yii\db\ActiveRecord | ||
378 | } | 381 | } |
379 | return $op; | 382 | return $op; |
380 | } | 383 | } |
384 | + | ||
385 | + public function recalculateRating() { | ||
386 | + /** | ||
387 | + * @var ProductToRating $averageRating | ||
388 | + */ | ||
389 | + $average = $this->getComments()->joinWith('rating')->select(['average' => 'avg(rating.value)::float'])->scalar(); | ||
390 | + if(!$average) { | ||
391 | + $average = 0; | ||
392 | + } | ||
393 | + $averageRating = $this->averageRating; | ||
394 | + if(!empty($averageRating)) { | ||
395 | + $averageRating->value = $average; | ||
396 | + } else { | ||
397 | + $averageRating = new ProductToRating(['product_id' => $this->product_id, 'value' => $average]); | ||
398 | + } | ||
399 | + if($averageRating->save()) { | ||
400 | + return true; | ||
401 | + } else { | ||
402 | + return false; | ||
403 | + } | ||
404 | + } | ||
405 | + | ||
406 | + public function getComments() { | ||
407 | + return $this->hasMany(Comment::className(), ['model_id' => 'product_id'])->where(['comment.model' => self::className()]); | ||
408 | + } | ||
409 | + | ||
410 | + public function getAverageRating() { | ||
411 | + return $this->hasOne(ProductToRating::className(), ['product_id' => 'product_id']); | ||
412 | + } | ||
381 | } | 413 | } |
composer.json
@@ -44,7 +44,8 @@ | @@ -44,7 +44,8 @@ | ||
44 | "yurkinx/yii2-image": "dev-master", | 44 | "yurkinx/yii2-image": "dev-master", |
45 | "cics/yii2-video-embed-widget": "dev-master", | 45 | "cics/yii2-video-embed-widget": "dev-master", |
46 | "sersid/yii2-owl-carousel-asset": "*", | 46 | "sersid/yii2-owl-carousel-asset": "*", |
47 | - "wbraganca/yii2-dynamicform": "dev-master" | 47 | + "wbraganca/yii2-dynamicform": "dev-master", |
48 | + "kartik-v/yii2-widget-rating": "*" | ||
48 | }, | 49 | }, |
49 | "require-dev": { | 50 | "require-dev": { |
50 | "yiisoft/yii2-codeception": "*", | 51 | "yiisoft/yii2-codeception": "*", |
console/migrations/m160721_152001_create_product_to_rating.php
0 โ 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\db\Migration; | ||
4 | + | ||
5 | +class m160721_152001_create_product_to_rating extends Migration | ||
6 | +{ | ||
7 | + public function up() | ||
8 | + { | ||
9 | + $this->createTable('product_to_rating', [ | ||
10 | + 'product_to_rating_id' => $this->primaryKey(), | ||
11 | + 'product_id' => $this->integer()->notNull(), | ||
12 | + 'value' => $this->float()->defaultValue(0), | ||
13 | + ]); | ||
14 | + | ||
15 | + $this->addForeignKey('product_to_rating_product', 'product_to_rating', 'product_id', 'product', 'product_id', 'CASCADE', 'CASCADE'); | ||
16 | + } | ||
17 | + | ||
18 | + public function down() | ||
19 | + { | ||
20 | + $this->dropForeignKey('product_to_rating_product', 'product_to_rating'); | ||
21 | + $this->dropTable('product_to_rating'); | ||
22 | + } | ||
23 | +} |
frontend/controllers/CatalogController.php
@@ -115,6 +115,15 @@ class CatalogController extends \yii\web\Controller | @@ -115,6 +115,15 @@ class CatalogController extends \yii\web\Controller | ||
115 | } | 115 | } |
116 | 116 | ||
117 | $priceLimits = $productModel->priceLimits($category, $params); | 117 | $priceLimits = $productModel->priceLimits($category, $params); |
118 | + | ||
119 | + /* | ||
120 | + * Greedy search for comments and rating | ||
121 | + */ | ||
122 | + $query = $productProvider->query; | ||
123 | + $query->with(['comments', 'averageRating']); | ||
124 | + /* | ||
125 | + * End of greedy search for rating and comments | ||
126 | + */ | ||
118 | 127 | ||
119 | return $this->render( | 128 | return $this->render( |
120 | 'products', | 129 | 'products', |
frontend/views/catalog/product.php
1 | <?php | 1 | <?php |
2 | -use yii\widgets\Breadcrumbs; | 2 | + use common\modules\comment\models\Comment; |
3 | + use common\modules\comment\models\Rating; | ||
4 | + use common\modules\comment\widgets\CommentWidget; | ||
5 | + use kartik\rating\StarRating; | ||
6 | + use yii\widgets\Breadcrumbs; | ||
3 | use yii\web\View; | 7 | use yii\web\View; |
4 | use yii\helpers\Url; | 8 | use yii\helpers\Url; |
5 | use frontend\widgets\Seo; | 9 | use frontend\widgets\Seo; |
6 | - | 10 | + |
7 | $this->params['seo']['key'] = $product->category->categoryName->value; | 11 | $this->params['seo']['key'] = $product->category->categoryName->value; |
8 | $this->params['seo']['fields']['name'] = $product->fullname; | 12 | $this->params['seo']['fields']['name'] = $product->fullname; |
9 | $this->params['seo']['h1'] = !empty(Seo::widget([ 'row'=>'h1'])) ? Seo::widget([ 'row'=>'h1']) : $product->fullname; | 13 | $this->params['seo']['h1'] = !empty(Seo::widget([ 'row'=>'h1'])) ? Seo::widget([ 'row'=>'h1']) : $product->fullname; |
@@ -86,8 +90,7 @@ $this->registerJs (" | @@ -86,8 +90,7 @@ $this->registerJs (" | ||
86 | }); | 90 | }); |
87 | ", View::POS_READY, 'Shadowbox'); | 91 | ", View::POS_READY, 'Shadowbox'); |
88 | ?> | 92 | ?> |
89 | - | ||
90 | - | 93 | + |
91 | <nav class="bread-crumbs"> | 94 | <nav class="bread-crumbs"> |
92 | <?= Breadcrumbs::widget ([ | 95 | <?= Breadcrumbs::widget ([ |
93 | 'links' => $this->params['breadcrumbs'], | 96 | 'links' => $this->params['breadcrumbs'], |
@@ -152,6 +155,33 @@ $this->registerJs (" | @@ -152,6 +155,33 @@ $this->registerJs (" | ||
152 | <?php endif?> | 155 | <?php endif?> |
153 | </ul> | 156 | </ul> |
154 | </div> | 157 | </div> |
158 | + <div class="artbox_comment_description"> | ||
159 | + <?php | ||
160 | + if(!empty($product->averageRating)) { | ||
161 | + echo StarRating::widget([ | ||
162 | + 'name' => 'rating_product', | ||
163 | + 'value' => $product->averageRating->value, | ||
164 | + 'pluginOptions' => [ | ||
165 | + 'displayOnly' => true, | ||
166 | + 'size' => 'xxs', | ||
167 | + 'min' => 0, | ||
168 | + 'max' => 5, | ||
169 | + 'stars' => 5, | ||
170 | + ], | ||
171 | + ]); | ||
172 | + } | ||
173 | + ?> | ||
174 | + <p><a href="#artbox-comment"> | ||
175 | + <?php | ||
176 | + $comment_count = count($product->comments); | ||
177 | + if($comment_count) { | ||
178 | + echo "ะัะทัะฒะพะฒ: ".$comment_count; | ||
179 | + } else { | ||
180 | + echo "ะััะฐะฒัั ะพัะทัะฒ"; | ||
181 | + } | ||
182 | + ?> | ||
183 | + </a></p> | ||
184 | + </div> | ||
155 | <br> | 185 | <br> |
156 | <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,gplus,twitter" data-size="s"></div> | 186 | <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,gplus,twitter" data-size="s"></div> |
157 | </div> | 187 | </div> |
@@ -216,7 +246,34 @@ $this->registerJs (" | @@ -216,7 +246,34 @@ $this->registerJs (" | ||
216 | </ul> | 246 | </ul> |
217 | </div> | 247 | </div> |
218 | <div class="both"></div> | 248 | <div class="both"></div> |
219 | - | 249 | + <div class="comment-wrapper"> |
250 | + <?php | ||
251 | + echo CommentWidget::widget([ | ||
252 | + 'comment_class' => Comment::className(), | ||
253 | + 'rating_class' => Rating::className(), | ||
254 | + 'success_text' => 'ะะพะผะผะตะฝัะฐัะธะน ััะฟะตัะฝะพ ะดะพะฑะฐะฒะปะตะฝ', | ||
255 | + 'class_options' => [ | ||
256 | + 'scenario' => \Yii::$app->user->isGuest?Comment::SCENARIO_GUEST:Comment::SCENARIO_USER, | ||
257 | + 'status' => Comment::STATUS_ACTIVE, | ||
258 | + 'user_id' => \Yii::$app->user->isGuest?NULL:\Yii::$app->user->id, | ||
259 | + ], | ||
260 | + 'model' => $product->className(), | ||
261 | + 'model_id' => $product->product_id, | ||
262 | + 'list_options' => [ | ||
263 | + 'view' => 'list-comment-review', | ||
264 | + ], | ||
265 | + 'form_options' => [ | ||
266 | + 'view' => 'form-comment-review', | ||
267 | + 'tag' => 'span', | ||
268 | + ], | ||
269 | + 'options' => [ | ||
270 | + 'class' => 'proektant-comments-wr style', | ||
271 | + 'id' => 'artbox-comment', | ||
272 | + ], | ||
273 | + ]); | ||
274 | + ?> | ||
275 | + </div> | ||
276 | + | ||
220 | <?= \common\modules\product\widgets\similarProducts::widget(['product' => $product])?> | 277 | <?= \common\modules\product\widgets\similarProducts::widget(['product' => $product])?> |
221 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'promo'])?> | 278 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'promo'])?> |
222 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'new'])?> | 279 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'new'])?> |
frontend/views/catalog/product_item.php
1 | <?php | 1 | <?php |
2 | -/** @var \common\modules\product\models\Product $product */ | ||
3 | -use yii\helpers\Url; | 2 | + /** @var \common\modules\product\models\Product $product */ |
3 | + use kartik\rating\StarRating; | ||
4 | + use yii\helpers\Html; | ||
5 | + use yii\helpers\Url; | ||
6 | + | ||
4 | ?> | 7 | ?> |
5 | <li class="item" itemscope itemtype="http://schema.org/Product"> | 8 | <li class="item" itemscope itemtype="http://schema.org/Product"> |
6 | <div class="boxitem"> | 9 | <div class="boxitem"> |
7 | <div class="pixbox"> | 10 | <div class="pixbox"> |
8 | - <a href="<?= Url::to(['catalog/product', 'product' => $product,'#' => 'm' .$product->enabledVariants[0]->product_variant_id]) ?>"> | ||
9 | - <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariants[0]->imageUrl, 'list',['alt' => $product->category->categoryName->value . ' ' . | ||
10 | - $product->fullname, 'title' => $product->category->categoryName->value . ' ' . | ||
11 | - $product->fullname])?> | 11 | + <a href="<?= Url::to([ |
12 | + 'catalog/product', | ||
13 | + 'product' => $product, | ||
14 | + '#' => 'm' . $product->enabledVariants[ 0 ]->product_variant_id, | ||
15 | + ]) ?>"> | ||
16 | + <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariants[ 0 ]->imageUrl, 'list', [ | ||
17 | + 'alt' => $product->category->categoryName->value . ' ' . $product->fullname, | ||
18 | + 'title' => $product->category->categoryName->value . ' ' . $product->fullname, | ||
19 | + ]) ?> | ||
12 | </a> | 20 | </a> |
13 | </div> | 21 | </div> |
14 | - <?php if(!empty($product->is_top) || !empty($product->is_new) || !empty($product->akciya)) :?> | 22 | + <?php if(!empty( $product->is_top ) || !empty( $product->is_new ) || !empty( $product->akciya )) : ?> |
15 | <ul class="product-special"> | 23 | <ul class="product-special"> |
16 | - <?php if(!empty($product->is_top)) :?> | ||
17 | - <li class="top"><div>top</div></li> | ||
18 | - <?php endif?> | ||
19 | - <?php if(!empty($product->is_new)) :?> | ||
20 | - <li class="new"><div>new</div></li> | ||
21 | - <?php endif?> | ||
22 | - <?php if(!empty($product->akciya)) :?> | ||
23 | - <li class="promo"><div>promo</div></li> | ||
24 | - <?php endif?> | 24 | + <?php if(!empty( $product->is_top )) : ?> |
25 | + <li class="top"> | ||
26 | + <div>top</div> | ||
27 | + </li> | ||
28 | + <?php endif ?> | ||
29 | + <?php if(!empty( $product->is_new )) : ?> | ||
30 | + <li class="new"> | ||
31 | + <div>new</div> | ||
32 | + </li> | ||
33 | + <?php endif ?> | ||
34 | + <?php if(!empty( $product->akciya )) : ?> | ||
35 | + <li class="promo"> | ||
36 | + <div>promo</div> | ||
37 | + </li> | ||
38 | + <?php endif ?> | ||
25 | </ul> | 39 | </ul> |
26 | - <?php endif?> | 40 | + <?php endif ?> |
41 | + <div class="comment_display_block"> | ||
42 | + <?php | ||
43 | + if(!empty( $product->averageRating )) { | ||
44 | + echo StarRating::widget([ | ||
45 | + 'name' => 'rating_product', | ||
46 | + 'value' => $product->averageRating->value, | ||
47 | + 'pluginOptions' => [ | ||
48 | + 'displayOnly' => true, | ||
49 | + 'size' => 'xxs', | ||
50 | + 'min' => 0, | ||
51 | + 'max' => 5, | ||
52 | + 'stars' => 5, | ||
53 | + ], | ||
54 | + ]); | ||
55 | + } | ||
56 | + ?> | ||
57 | + <p> | ||
58 | + <?php | ||
59 | + $comment_count = count($product->comments); | ||
60 | + echo Html::a(($comment_count?'ะัะทัะฒะพะฒ: ' . count($product->comments):"ะััะฐะฒะธัั ะพัะทัะฒ"), ['catalog/product', 'product' => $product, '#' => 'artbox-comment']) | ||
61 | + ?> | ||
62 | + </p> | ||
63 | + </div> | ||
27 | <div itemprop="name"><a href="<?= Url::to([ | 64 | <div itemprop="name"><a href="<?= Url::to([ |
28 | - 'catalog/product', | ||
29 | - 'product' => $product, | ||
30 | - '#' => 'm' .$product->enabledVariants[0]->product_variant_id]) | ||
31 | - ?>" | ||
32 | - class="name"><?= $product->fullname ?> | ||
33 | - </a></div> | ||
34 | - | 65 | + 'catalog/product', |
66 | + 'product' => $product, | ||
67 | + '#' => 'm' . $product->enabledVariants[ 0 ]->product_variant_id, | ||
68 | + ]) ?>" | ||
69 | + class="name"><?= $product->fullname ?> | ||
70 | + </a></div> | ||
71 | + | ||
35 | <?php | 72 | <?php |
36 | - | ||
37 | - echo '<div class="cost-block" itemprop="offers" itemscope itemtype="http://schema.org/Offer">'; | ||
38 | - echo '<p class="cost">'; | ||
39 | - // ะตััั ัะบะธะดะบะฐ | ||
40 | - if ($product->enabledVariants[0]->price_old != 0 && $product->enabledVariants[0]->price_old != $product->enabledVariants[0]->price) | ||
41 | - { | ||
42 | - echo '<strike><span id=\'old_cost\' itemprop="price">'.$product->enabledVariants[0]->price_old.'</span> ะณัะฝ.</strike> '; | ||
43 | - } | ||
44 | - | ||
45 | - echo $product->enabledVariants[0]->price.' <span>ะณัะฝ.</span></p>'; | ||
46 | - echo '<meta itemprop="priceCurrency" content = "UAH">'; | ||
47 | - echo '</div>'; | ||
48 | - | 73 | + |
74 | + echo '<div class="cost-block" itemprop="offers" itemscope itemtype="http://schema.org/Offer">'; | ||
75 | + echo '<p class="cost">'; | ||
76 | + // ะตััั ัะบะธะดะบะฐ | ||
77 | + if($product->enabledVariants[ 0 ]->price_old != 0 && $product->enabledVariants[ 0 ]->price_old != $product->enabledVariants[ 0 ]->price) { | ||
78 | + echo '<strike><span id=\'old_cost\' itemprop="price">' . $product->enabledVariants[ 0 ]->price_old . '</span> ะณัะฝ.</strike> '; | ||
79 | + } | ||
80 | + | ||
81 | + echo $product->enabledVariants[ 0 ]->price . ' <span>ะณัะฝ.</span></p>'; | ||
82 | + echo '<meta itemprop="priceCurrency" content = "UAH">'; | ||
83 | + echo '</div>'; | ||
84 | + | ||
49 | ?> | 85 | ?> |
50 | </div> | 86 | </div> |
51 | <a href="<?= Url::to([ | 87 | <a href="<?= Url::to([ |
52 | 'catalog/product', | 88 | 'catalog/product', |
53 | 'product' => $product, | 89 | 'product' => $product, |
54 | - '#' => 'm' .$product->enabledVariants[0]->product_variant_id]) | ||
55 | - ?>" class="link_buy">ะัะฟะธัั</a> | ||
56 | - | 90 | + '#' => 'm' . $product->enabledVariants[ 0 ]->product_variant_id, |
91 | + ]) ?>" class="link_buy">ะัะฟะธัั</a> | ||
92 | + | ||
57 | <div class="mycarousel"> | 93 | <div class="mycarousel"> |
58 | <ul class="jcarousel jcarousel-skin-tango"> | 94 | <ul class="jcarousel jcarousel-skin-tango"> |
59 | - <?php foreach ($product->enabledVariants as $variant) : ?> | ||
60 | - <?php if (!empty($variant->image)) :?> | ||
61 | - <li> | ||
62 | - <a href="<?= Url::to([ | ||
63 | - 'catalog/product', | ||
64 | - 'product' => $product, | ||
65 | - '#' => 'm' . $variant->product_variant_id]) ?>"> | ||
66 | - <?= \common\components\artboximage\ArtboxImageHelper::getImage($variant->imageUrl, 'product_variant',['alt' => $product->category->categoryName->value . ' ' . | ||
67 | - $product->fullname, 'title' => $product->category->categoryName->value . ' ' . | ||
68 | - $product->fullname])?> | ||
69 | - </a> | ||
70 | - </li> | 95 | + <?php foreach($product->enabledVariants as $variant) : ?> |
96 | + <?php if(!empty( $variant->image )) : ?> | ||
97 | + <li> | ||
98 | + <a href="<?= Url::to([ | ||
99 | + 'catalog/product', | ||
100 | + 'product' => $product, | ||
101 | + '#' => 'm' . $variant->product_variant_id, | ||
102 | + ]) ?>"> | ||
103 | + <?= \common\components\artboximage\ArtboxImageHelper::getImage($variant->imageUrl, 'product_variant', [ | ||
104 | + 'alt' => $product->category->categoryName->value . ' ' . $product->fullname, | ||
105 | + 'title' => $product->category->categoryName->value . ' ' . $product->fullname, | ||
106 | + ]) ?> | ||
107 | + </a> | ||
108 | + </li> | ||
71 | <?php endif; ?> | 109 | <?php endif; ?> |
72 | <?php endforeach; ?> | 110 | <?php endforeach; ?> |
73 | </ul> | 111 | </ul> |
frontend/views/catalog/products.php
@@ -12,7 +12,7 @@ use common\modules\product\helpers\FilterHelper; | @@ -12,7 +12,7 @@ use common\modules\product\helpers\FilterHelper; | ||
12 | use frontend\widgets\Seo; | 12 | use frontend\widgets\Seo; |
13 | //$this->title = $category->categoryName->value; | 13 | //$this->title = $category->categoryName->value; |
14 | $this->params['seo']['title'] = !empty($category->meta_title) ? $category->meta_title : ''; | 14 | $this->params['seo']['title'] = !empty($category->meta_title) ? $category->meta_title : ''; |
15 | - | 15 | + |
16 | $this->params['seo']['fields']['meta-title'] = $category->meta_title; | 16 | $this->params['seo']['fields']['meta-title'] = $category->meta_title; |
17 | $this->params['seo']['h1'] = !empty($category->h1) ? $category->h1 : $category->name; | 17 | $this->params['seo']['h1'] = !empty($category->h1) ? $category->h1 : $category->name; |
18 | $this->params['seo']['seo_text'] = $category->seo_text; | 18 | $this->params['seo']['seo_text'] = $category->seo_text; |
frontend/views/products/_product.php
frontend/web/css/style.css
1 | -html,form,body{padding:0;margin:0;font-family:'Roboto';font-size:14px;color:#333;height:100%}h1,h2,h3{margin:0px;padding:0px 0px 10px 0px}.fl{float:left}.fotter .wrap .fr{float:right;width:180px;height:50px;position:relative;font-size:12px}.fotter .wrap .fr img{position:absolute;top:50%;margin-top:-10px;right:0}.fotter .wrap .fl{line-height:50px;font-size:12px}.both{clear:both}h1{margin:10px 0;font-size:24px}h3{margin-bottom:30px}p{margin:3px 0px;padding:0px}a{color:#6a6a6a;font-size:14px;text-decoration:underline}a:hover{color:#799920}.wrap{width:960px;margin:0px auto}.f{background:#ffffff}.br{-webkit-box-shadow:-1px 5px 14px 0px rgba(50, 46, 50, 0.46);-moz-box-shadow:-1px 5px 14px 0px rgba(50, 46, 50, 0.46);box-shadow:-1px 5px 14px 0px rgba(50, 46, 50, 0.46);padding:20px}nav.top{background:#f5f5f5;padding:10px 0px;border-bottom:1px solid #d2d2d2;font-size:12px}nav.top ul{list-style:none;margin:0px;padding:0px}nav.top ul li{float:left;padding-right:20px}nav.top ul li a{font-size:12px}nav.top a{color:#6a6a6a;text-decoration:none}#help{background:url('../img/help.png') right no-repeat;padding-right:20px}#help span{border-bottom:1px dotted #6a6a6a}#login{background:url('../img/login.png') right no-repeat;padding-right:20px;font-size:12px}#login span{border-bottom:1px dotted #6a6a6a}.search{margin:-5px 0px -5px 100px;float:left}nav input[type="text"]{width:325px;outline:0;border:1px solid #d8d6d6;border-radius:5px;padding:5px 0px 5px 0px;font-size:14px;text-indent:10px}nav input[type="submit"]{width:35px;height:29px;border:none;background:url('../img/lupa_sub.png') center no-repeat;margin-left:-35px;cursor:pointer}.header{margin:0px 0px 20px}.phone{float:left;position:relative;text-align:center;}.phone .tel{font-size:23px}.phone .tel span.more{margin-bottom:3px}.more_block{background:#ffffff;border:1px solid #d2d2d2;padding:10px;position:absolute;font-size:20px;display:none;z-index:99}.more{background:url('../img/more.png') no-repeat;width:12px;height:7px;display:inline-block;cursor:pointer;margin-bottom:5px}.logo{margin:0px auto 0px;width:193px}.logo a{display:block;width:193px;height:84px;background:url('../img/logo.png') no-repeat}.logo a span{display:none}#call{color:#6a6a6a;text-decoration:none;border-bottom:1px dotted #6a6a6a}.basket{float:right;position:relative;border:1px solid #d2d2d2;border-radius:5px;padding:15px 20px;font-size:18px;text-transform:uppercase;margin-top:13px}.basket .info{float:left;border-right:1px solid #d2d2d2;padding-right:10px;margin-right:17px}.basket .info span{color:#f75d50;font-size:22px}.basket a:link,.basket a:visited{text-decoration:none;color:#000000;font-size:18px}.basket span.more{margin-bottom:-1px}.menu{background:#596065;border:1px solid #e8e8e8}.menu ul{margin:0px;padding:0px;list-style:none}.menu ul li{float:left;border-left:1px solid #8b9094;height:43px}.menu ul li:first-child{border-left:none}.menu ul li a{width:100%;height:100%;line-height:43px;float:left;box-sizing:border-box;padding:0 19px;text-transform:uppercase;color:#ffffff;font-size:15px;text-decoration:none;font-weight:600}.menu ul li:hover{background:#3e454b}.menu ul li.active a{background:#f5f5f5;color:#596065}.menu ul li.active a:hover{cursor:default}.menu_childs{background:#f5f5f5;border:1px solid #e8e8e8;border-bottom:2px solid #596065}.menu_childs ul{margin:0px;padding:0px;list-style:none}.menu_childs ul li{float:left}.menu_childs ul li a{float:left;padding:15px 23px 15px 23px;text-transform:uppercase;color:#596065;font-size:14px;font-weight:bold;text-decoration:none}.menu_childs ul li a:hover{color:#878b8e}.fr ul li{border:none}.akciya a{background:#f75d50;color:#ffffff}.brands a{background:#95ba2f;color:#ffffff}a.myorders{color:#f75d50}.sub{margin:2px 0px 0px 0px}.sub img{float:left;margin-right:2px}.rubrics{margin:60px 0 0 0;padding-bottom:27px}.rubrics ul{list-style:none;margin:0px;padding:0px}.rubrics ul li{float:left;margin:0px 35px}.rubrics ul li a{float:left;width:120px;padding-top:130px;text-align:center;text-transform:uppercase;color:#494949;text-decoration:none;font-weight:bold}.rubrics ul li.item_ryukzaki a{background:url('../img/ico1.png') no-repeat}.rubrics ul li.item_sumki a{background:url('../img/ico2.png') no-repeat}.rubrics ul li.item_chehly a{background:url('../img/ico3.png') no-repeat}.rubrics ul li.item_nesessery a{background:url('../img/ico4.png') no-repeat}.rubrics ul li.item_koshelki a{background:url('../img/ico5.png') no-repeat}.products{padding-bottom:30px;padding-top:20px}.why_me_,.products{border-top:1px solid #d2d2d2}.products ul{list-style:none;margin:0;padding:0}.products ul li.item{float:left;width:192px;margin:0 0 50px 0;text-align:center;position:relative}.products ul li a.name,.special-products a.name{display:block;color:#799920;font-size:15px;text-decoration:none;margin:15px 0 0 0;height:35px;overflow:hidden;box-sizing:border-box;padding:0 10px}.products ul li a.name:hover,.special-products a.name:hover{text-decoration:underline}.products ul li .info{text-align:left}.pn{border:none}.cost,.product_read_price #cost{color:#f75d50;font-size:18px;margin:0;padding:0}.cost span,.cost span.valute,.product_read_price .valute{font-size:14px}strike,strike span#old_cost{font-size:14px;color:#333}.submit4m,a.link_buy,.checkout_basket button,.submit4{background:#95ba2f;border-radius:4px;height:29px;text-transform:uppercase;color:#ffffff;text-decoration:none;font-weight:600;text-align:center;border-bottom:3px solid #799920;font-size:12px}.submit4.bottom3{font-size:12px !important;display:block}.basket .submit4.bottom3{font-size:12px !important;display:block;margin-top:10px}a.link_buy,.checkout_basket button{display:block;margin:0 auto 10px auto;width:122px;line-height:32px}.checkout_basket button,.submit4{margin:0;padding:0 20px;line-height:31px;width:auto;border-top:0;border-left:0;border-right:0;cursor:pointer}a.link_buy:hover,.submit4m:hover,.checkout_basket button:hover,.submit4:hover,.btn-primary:hover{border-bottom:3px solid #95ba2f}a.link_buy:active,.submit4m:active,.checkout_basket button:active,.submit4:active,.btn-primary:active{background:#799920;border-bottom:3px solid #799920}.checkout_basket button:focus,.submit4:focus{outline:none}.mycarousel{position:absolute;right:22px;top:13px}ul.mycarousel{list-style:none;margin:0px;padding:0px}ul.mycarousel li{margin:0px;padding:0px}.mycarousel img{border:1px solid #d2d2d2}h3{text-align:center;text-transform:uppercase;font-size:20px}span.why {height: 29px;display: block;width:213px;height:49px;background:url('../img/logo-why.png') no-repeat;margin:0px auto;padding:0 0 20px 0}ul.why_list{list-style:none;margin:0px;padding:0px}ul.why_list li{float:left;margin-left:58px;width:288px;height:96px;box-sizing:border-box;padding-left:110px;margin-top:20px}ul.why_list li div{display:table-cell;height:96px;vertical-align:middle}ul.why_list li span{font-weight:bold;color:#799920}ul.why_list li.item1{background:url('../img/why_item1.png') left no-repeat}ul.why_list li.item2{background:url('../img/why_item2.png') left no-repeat}ul.why_list li.item3{background:url('../img/why_item3.png') left no-repeat}ul.why_list li.item4{background:url('../img/why_item4.png') left no-repeat}ul.why_list li.item5{background:url('../img/why_item5.png') left no-repeat}ul.why_list li.item6{background:url('../img/why_item6.png') left no-repeat}.banner_akciya{margin:50px 0px}.bottom{background:#4d5458;padding:40px 0px;color:#ffffff}.bottom .leftbar{float:left;width:210px}.bottom ul{list-style:none;margin:0px;padding:0px;line-height:23px}.bottom ul a{color:#ffffff;font-size:15px;text-decoration:none}.bottom ul a:hover{color:#799920}.phones{padding-left:25px;background:url('../img/phone.png') left top no-repeat;margin-top:50px;line-height:23px;font-size:18px}.map{padding:5px 0px 5px 25px;background:url('../img/map.png') left no-repeat;margin-bottom:7px}a.more_map{color:#99a5ad;border-bottom:1px dotted #99a5ad;text-decoration:none;font-size:11px;text-align:center}.bread-crumbs{padding:0 0 0 20px;border-bottom:1px solid #d2d2d2;height:29px}.bread-crumbs ul{list-style:none;margin:0 0 0 0;padding:0;height:29px}.bread-crumbs ul li{float:left;padding-left:20px;height:100%;line-height:29px;color:#7d7d7d;position:relative;font-size:12px}.bread-crumbs ul li:first-child{padding-left:0}.bread-crumbs ul li a{font-size:12px;display:block;color:#7d7d7d}.bread-crumbs ul li a:visited,.bread-crumbs ul li a:link{color:#7d7d7d;text-decoration:underline}.bread-crumbs ul li a:hover{color:#464646;text-decoration:none}.breadcrumb > li + li:before{color:#ccc;content:"/";position:absolute;top:0;left:8px}.loyout{padding:20px 0px}.leftbar{float:left;width:172px;margin-right:20px}.rightbar{float:right;width:380px;margin-left:40px}.rightbar.basket_rightbar{margin-right:20px}.rightbar2{float:right;width:320px}.content{overflow:hidden}* html .content{height:1%}.content2{overflow:hidden}* html .content2{height:1%}.filters{border-top:1px solid #d2d2d2;padding:20px 0px 0px;margin-top:20px}.filters .begin{text-transform:uppercase;font-weight:bold;font-size:12px}.filters ul{list-style:none;margin:0px;padding:0px;line-height:22px;margin-top:6px}.filters ul li{position:relative;box-sizing:border-box;padding-left:24px;line-height:16px;margin-top:7px}.filters ul li:first-child{margin-top:0}.filters ul li>input{position:absolute;left:4px;margin:0px 0 0;top:3px}.filters ul li a{color:#464646;text-decoration:none;font-size:13px;line-height:16px}.filters ul li a:hover{text-decoration:underline}.filters ul li.hidden{color: #9da9b1}.productLeftBar{float:left;width:228px;margin-left:20px;margin-right:20px}.productRightBar{float:right;width:260px;margin:0 20px}.productLeftBar h1{font-size:24px;border-bottom:1px solid #d2d2d2;margin-bottom:10px}ul.product_mod{list-style:none;margin:10px 0 0 0;padding:0;float:left}ul.product_mod li{float:left;width:46px;height:46px;background:#fff;border:1px solid #d2d2d2;margin:5px 5px 0 0;text-align:center;position:relative}ul.product_mod li.active:before{width:48px;height:48px;position:absolute;content:'';background:none;border:2px solid #95ba2f;top:-1px;left:-1px;box-sizing:border-box}ul.product_mod li a{width:46px;height:46px;display:table-cell;vertical-align:middle}ul.product_mod li a:focus{outline:none}ul.product_mod li img{vertical-align:middle;max-width:46px;max-height:46px}ul.product_colors{list-style:none;margin:30px 0 0 0;padding:0;float:left}ul.product_colors li{float:left;margin:10px 10px 0 0;width:98px;height:98px;text-align:center;border:1px solid #d2d2d2}ul.product_colors li a{width:98px;height:98px;vertical-align:middle;display:table-cell}ul.product_colors li img{max-width:98px;max-height:98px;vertical-align:middle}.productLeftBar .begin{text-transform:uppercase;font-weight:bold;font-size:12px}.cost_box{border-top:1px solid #d2d2d2;border-bottom:1px solid #d2d2d2;margin:10px 0px;padding:10px 0px}.cost_box .w{float:left;margin-right:20px;padding-top:5px}.product_service ul{list-style:none;margin:0px;padding:0px}.product_service ul li a{color:#799920;text-decoration:none;border-bottom:1px dotted #799920;font-size:12px}.product_service ul li.item1{background:url('../img/li1.png') left no-repeat;padding:3px 23px}.product_service ul li.item2{background:url('../img/li2.png') left no-repeat;padding:3px 23px}.product_service ul li.item3{background:url('../img/li3.png') left no-repeat;padding:3px 23px}#nav_product{list-style:none;margin:0px;padding:0px;line-height:23px}#nav_product li a{background:url('../img/li_plus.png') left no-repeat;padding:3px 15px;color:#000000;text-transform:uppercase;text-decoration:none;font-weight:bold;font-size:12px}#nav_product li a.active{background:url('../img/li_minus.png') left no-repeat}#nav_product li .info{display:none;border-bottom:1px solid #d2d2d2;padding:10px 0px;margin-bottom:10px}#nav_product li .info,#nav_product li .info p{font-size:12px;line-height:16px}.modal_box{position:fixed;left:0;top:0;width:100%;height:100%;z-index:999;background:#000;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);-moz-opacity:0.5;-khtml-opacity:0.5;opacity:0.5}#data_box{position:absolute;top:100px;z-index:1000;width:400px;background:#ffffff;-webkit-box-shadow:0 0 15px #000;-moz-box-shadow:0 0 15px #000;box-shadow:0 0 15px #000;border:7px solid #1b9bb6;border-radius:5px}#data_box .data_wrp{padding:25px 15px 15px 15px}#data_box .data_wrp h1{text-transform:uppercase}#data_box .data_wrp hr{height:1px;border:none;color:#000000;background:#000000;margin:45px 0px 20px 0px}#data_box .data_wrp hr.hr{height:1px;border:none;color:#000000;background:#000000;margin:20px 0px 20px 0px}#data_box .pic-tango{margin-right:7px;margin-bottom:7px}#modal_close{cursor:pointer;margin-top:-80px;margin-right:-50px}.rightbar .control-label,.textareagroup .control-label{float:left;width:80px;padding-top:5px}.form-control{outline:0;border:1px solid #d8d6d6;border-radius:5px;padding:5px 0px 5px 0px;font-size:14px;text-indent:10px;margin-bottom:3px;width:250px}.form-control:focus{border:#1b9bb6 1px solid;box-shadow:0 0 10px #1b9bb6;-webkit-box-shadow:0 0 10px #1b9bb6;-moz-box-shadow:0 0 10px #1b9bb6}.help-block{color:red;font-size:12px;margin-bottom:5px}.basket_item{padding:10px 0px;border-bottom:1px solid #b7b7b7;clear:both}.basket_item img{margin-right:20px}.basket_item .count{margin:20px 0px}.basket_item .fr{margin-top:13px}.basket_item .info{overflow:hidden}.basket_item > a{display:block;float:left}a.del:visited,a.del:link{background:url('../img/del.png') left center no-repeat;padding:2px 25px;font-size:12px;font-weight:normal;color:#787878;text-decoration:underline}a.del:hover{color:#a52828;text-decoration:underline}.total{text-align:right;color:#87476a;font-size:20px;margin:10px 0px}.submit4m{font-family:Roboto;border:none;background:#95ba2f;border-radius:4px;color:#ffffff;text-transform:uppercase;font-size:10px;cursor:pointer;width:102px;height:29px;border-bottom:3px solid #799920;line-height:29px}.submit4m:active,.submit4m:focus{outline:none}.btn-primary{border-bottom:3px solid #799920;border-top:0;border-right:0;border-left:0;margin-top:5px;padding:0 15px;background:#95ba2f;border-radius:4px;color:#ffffff;text-transform:uppercase;text-decoration:none;font-size:12px;font-weight:bold;cursor:pointer;height:29px;line-height:29px}.btn-primary:active,.btn-primary:focus{outline:none}a.logout:visited,a.logout:link{border:none;padding:3px 5px;background:#f75d50;border-radius:5px;color:#ffffff;text-transform:uppercase;text-decoration:none;font-size:11px;font-weight:normal;cursor:pointer}a.logout:hover{background:#95ba2f}.boy_box{border-bottom:1px solid #b7b7b7;padding:0px 0px 15px 0px}.boy_box div{padding-top:10px}.content_product .info{padding:0px 0px 20px 0px}a.btn-success{display:inline-block;border:2px solid #d8d6d6;color:#95ba2f;border-radius:5px;padding:5px;margin-bottom:10px;text-decoration:none;font-size:14px}a.btn-success:hover{border:#95ba2f 2px solid;color:#f75d50}.txtb1{font-size:14px;font-weight:bold}.txtf{font-size:14px;font-weight:bold;color:#87476a}.txtfb{font-size:20px;font-weight:bold;color:#87476a}.count{margin:20px 0px}.count input[type="number"]{outline:0;width:50px;border:1px solid #d8d6d6;border-radius:5px;padding:5px 0px 5px 0px;font-size:14px;text-indent:10px;margin-bottom:7px}a.link2:visited,a.link2:link{font-size:14px;font-weight:bold;color:#95ba2f;text-decoration:none}a.link2:hover{color:#f75d50;text-decoration:underline}.well{margin:50px auto;width:400px;background:#f5f5f5;border:1px solid #e8e8e8;padding:20px;border-radius:5px}.control-label{float:left;width:100px;padding-top:5px}#user-verifycode-image{display:block}.form-inline{display:inline}.form-inline .form-group{float:left;margin-right:10px}.form-inline .form-group select{width:100px}.form-group{margin-bottom:10px}.table-bordered{width:100%;border:1px solid silver}.table-bordered th{background:#B3D1FD;padding:5px}.table-bordered tr td{border:1px solid silver;padding:5px}.table-bordered .filters{display:none}.formCost label{float:left;width:30px}ul.brends_list{list-style:none;margin:0px;padding:0px}ul.brends_list li{float:left;text-align:center;margin:0px 15px 20px 15px}.compare{text-align:center}.compare a:visited,.compare a:link{font-size:12px;text-decoration:underline}.alert-success{margin:10px 0px;padding:10px;border:1px solid #3ed824;border-radius:5px;background:#c0feb5}.news_item{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid silver}.news_item img{margin-right:20px}.news_item a{font-size:16px}.pic{width:392px;height:365px}.pic a{width:392px;height:365px;display:table-cell;vertical-align:middle}.pic a img{max-width:392px;max-height:365px;vertical-align:middle}input#subscribe-email::-webkit-input-placeholder{color:#596065}input#subscribe-email::-moz-placeholder{color:#596065}input#subscribe-email:-ms-input-placeholder{color:#596065}input#subscribe-sale::-webkit-input-placeholder{color:#596065}input#subscribe-sale::-moz-placeholder{color:#596065}input#subscribe-sale:-ms-input-placeholder{color:#596065}#subscribe-email,#subscribe-sale{color:#596065}#subscribe-sale{width:100px;float:left;margin-right:20px;height:28px}.saletxt{width:150px;float:left;color:#ffffff;font-size:12px}#subscribe-email{width:370px}.txts{color:#9da9b1;font-size:18px;margin-bottom:20px}.content ul.pagination{list-style:none;text-align:center;margin:0 0 16px 0;padding:0 0 20px 0;border-bottom:1px solid #d2d2d2}.content ul.pagination li{display:inline}.content ul.pagination li a{padding:3px;color:#82a02f;font-size:15px;margin:0;text-decoration:none}.content ul.pagination li a:hover{text-decoration:underline}.content ul.pagination li.active a{color:#333333}.boxitem{height:283px}ul.social{margin-top:20px}.social{list-style:none;margin:10px;padding:0px;height:48px}.social li{display:inline-block;margin-right:7px;padding-bottom:10px}.social li a{width:36px;height:36px;display:block;margin:0;padding:0;text-indent:-9999px;background:#bcbcbc url(../img/social-ico-two.png) no-repeat 0 0;border-radius:48px;-moz-border-radius:48px;-webkit-border-radius:48px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;transition:all 0.5s ease-out}.social .fb{background-position:-44px 0;cursor:pointer}.social .vk{cursor:pointer}.social .vk:hover{background-color:#5B7FA6}.social .fb:hover{background-color:#354f89}.social .gp{background-position:-132px 0;cursor:pointer}.social .gp:hover{background-color:#c72f21}.social .tw{background-position:-144px 0;cursor:pointer}.social .tw:hover{background-color:#6398c9}.social .ok{background-position:-89px 0;cursor:pointer}.social .ok:hover{background-color:#f88f15}.social ul li a:hover{background-color:#065baa}.socialbox{margin:10px 0px}.hide{display:none}.footer .fl{font-size:12px}.fotter{background:#484f55;height:50px;color:#98a3ab}.fotter a{color:#98a3ab;line-height:50px;float:left;font-size:12px}.view_products2{list-style:none;overflow:auto;height:400px}.view_products2 img{float:left;margin-right:20px}.view_products2 li{margin:10px 0px}.pixbox{width:160px;margin:0 auto;height:200px;overflow:hidden;text-align:center}.form-order{background:#f5f5f5;padding:0 20px 20px 20px}#order-payment{float:right;width:280px}#order-delivery{float:right;width:280px}.delivery-data{margin-bottom:27px;position:relative;background:#95ba2f;display:none;border-radius:5px;float:left;box-sizing:border-box;padding:14px 20px;color:#fff;font-size:13px}.jcarousel-next-disabled,.jcarousel-prev-disabled{opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"}.content2 br{display:none}.pixbox a{width:160px;height:200px;display:table-cell;vertical-align:middle}.pixbox img{max-width:160px;max-height:200px;vertical-align:middle}.pagination li.prev.disabled span{display:none}.pagination li.next.disabled span{display:none}.fr{float:right}.nobottom{border-bottom:none !important}.dotted a{border-bottom:1px dotted #808080}.mycabinet{padding-left:20px;margin-top:20px}.mycabinet .begin{text-transform:uppercase;font-size:13px;font-weight:bold;padding-bottom:15px}.mycabinet ul{margin:0px;padding:0px;list-style:none}.mycabinet ul li{padding-top:10px;padding-bottom:10px}.mycabinet a{color:#799920;text-decoration:none}.lay_title .uppercase{text-transform:uppercase}.lay_title .center{text-align:center}.lay_title{padding-top:15px;font-size:24px}.user_data{width:390px;border-right:1px solid #d2d2d2;float:left}.user_data .col{padding-bottom:35px}.user_data .col.last{padding-bottom:0px}.user_data .title{text-transform:uppercase;font-weight:bold;width:170px;float:left;font-size:13px}.user_data .data{float:left;font-size:13px}.edit_menu{float:left;padding-left:60px;font-size:13px}.edit_menu div{padding-bottom:20px}.edit_menu a{color:#799920;text-decoration:none}.edit_menu .dotted{border-bottom:1px dotted #799920}.user_edit_area{padding-top:30px}.user_data_editing{float:left}.inputs .col{padding-bottom:12px !important}.user_data_editing .col{padding-bottom:35px;width:432px}.user_data_editing .title{text-transform:uppercase;font-weight:bold;width:170px;float:left;font-size:13px}.user_data_editing .data{float:left;font-size:13px;width:262px}.user_data_editing input[type="text"]{padding:0;margin:0;border:1px solid #d2d2d2;padding-top:7px;padding-bottom:7px;padding-left:10px;padding-right:10px;border-radius:4px;font-size:12px;margin-top:-10px;width:240px}.user_data_editing .add{color:#799920;text-decoration:none;border-bottom:1px dotted #799920}.add_more{padding-bottom:24px;padding-left:170px}.delete{float:right}.delete_button{background:url('../img/ico_close.png') right no-repeat;width:16px;height:16px;float:right}.content_area{width:450px}#cancel{text-decoration:none;color:#799920;font-size:13px;border-bottom:1px dotted #799920;float:left;margin-left:40px}.buttons{display:inline-flex;align-items:center}.favorites{background-color:#f5f5f5;padding:5px;font-size:14px}.favorites .fav_point{background-color:#ffffff;border:1px solid #d2d2d2;border-radius:3px;padding-top:10px;padding-bottom:10px;padding-left:20px;padding-right:20px;margin-top:5px}.favorites .fav_point .left{float:left;padding-right:0;width:178px}.favorites .fav_point .right{float:right;padding-right:0;padding-left:0}.favorites .link{color:#799920;text-decoration:none;border-bottom:1px dotted #799920}.redtext{color:#f75d50}.greentext{color:#95ba2f}.hold .orders_view{display:none !important}.orders_view{width:680px;margin-top:13px;padding-top:13px;padding-bottom:5px;border-top:1px solid #d2d2d2;display:block}.orders_view .order{float:left;width:225px;text-align:center}.orders_view .order .order_price{color:#f75d50;font-weight:bold;font-size:15px}.orders_view .order .order_price span{font-size:24px}.orders_view .order img{padding-bottom:22px}.orders_view .order .note{font-size:13px}.orders_view .order .note span{color:#f75d50}.basket_hovered{position:absolute;border:1px solid #d2d2d2;border-radius:5px;padding:15px 20px;background-color:white;right:-1px;margin-top:10px;width:640px;display:none;z-index:1111}.open .basket_hovered{display:block}.open,.open .basket_hovered{-moz-box-shadow:0px 0px 5px rgba(149,149,149,0.75);-webkit-box-shadow:0px 0px 5px rgba(149,149,149,0.75);box-shadow:0px 0px 5px rgba(149,149,149,0.75)}.basket_hovered1:before{position:absolute;left:0;content:' ';width:100%;background-color:white;height:10px;top:45px;z-index:1112}.basket_item input{border:1px solid #d2d2d2;border-radius:4px;padding:9px;width:26px;font-size:18px;font-weight:bold;text-align:center;background-color:white;color:black;margin:7px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.minus{background:url('../img/minus.png') no-repeat;width:15px;height:15px;display:inline-block;cursor:pointer}.plus{background:url('../img/plus.png') no-repeat;width:15px;height:15px;display:inline-block;cursor:pointer}.basket_sum{padding-top:15px}.basket_sum .sum_text{font-size:15px;text-transform:none;padding-top:12px;float:right !important;padding-top:1px;margin-bottom:11px}.basket_sum .sum_text span{font-size:18px;color:#f75d50;font-weight:bold}.basket_sum a{color:white !important;font-size:15px !important;float:right}.black{z-index:9999;width:100%;height:100%;position:absolute;display:block;padding-top:6%}.black:before{content:'';background-color:rgba(0,0,0,0.5);width:100%;height:100%;position:fixed;top:0}.black.hidden{display:none}.black .item_added_win{background-color:#ffffff;width:640px;margin:auto;position:relative}.black_close{position:absolute;top:30px;right:30px;background:url('../img/ico_close2.png') no-repeat;width:22px;height:22px;display:inline-block;cursor:pointer}.block_content{padding-left:20px;padding-right:20px}.item_added_win h2{text-transform:uppercase;text-align:center;padding:30px}.block_content .item{padding-top:20px;padding-bottom:20px;border-bottom:1px solid #d2d2d2}.uppercase{text-transform:uppercase}.w230{width:230px}.w260{width:260px}.w430{width:430px}.borderbottom{border-bottom:1px solid #d2d2d2}.left_block .begin{text-transform:uppercase;font-size:13px;font-weight:bold;padding-bottom:15px}.color_variants .variant{text-align:center;border:1px solid #d2d2d2;float:left;margin-right:5px;margin-bottom:5px}.variant:hover{cursor:pointer}.color_variants{margin-top:14px;margin-bottom:-5px}.color_variants .variant.active{width:44px;height:44px;border:2px solid #95ba2f}.color_variants .variant.active a{width:44px;height:44px}.tobasket{margin-top:20px;margin-bottom:20px}.tobasket:hover{color:white}.variant{width:46px;height:46px}.variant.active{width:44px;height:44px}.layout{margin-top:15px}.left_block{float:left}.right_block{float:right}.center_block{float:left;margin-left:23px}.left_block .links{margin-top:25px}.left_block .links li{list-style:none;padding-left:25px;display:inline-block;cursor:pointer;height:20px}.left_block .links ul{margin:0;padding:0}.left_block .links a{font-size:13.5px;text-decoration:none;color:#8ba73e}.links .add_bookmarks{background:url('../img/ico_add_bookmark.png') no-repeat center left}.links .what_price{background:url('../img/ico_price.png') no-repeat center left}.links .add_compare{background:url('../img/ico_scales.png') no-repeat center left}.spoiler_one{padding-top:15px;padding-bottom:15px;border-bottom:1px solid #d2d2d2}.spoiler_one .spoiler_content{margin-top:15px;font-size:13px}.spoiler_one .spoiler_content.hidden{display:none}.title_spoiler:hover{cursor:pointer}.title_spoiler{background:url('../img/ico_open.png') no-repeat center left;padding-left:17px;font-size:13px;text-transform:uppercase;color:#333333;font-weight:bold;text-decoration:none}.title_spoiler.closed{background:url('../img/ico_close3.png') no-repeat center left}.features{list-style:none;padding:0;margin:0;font-size:13px}.features a{font-size:13px;text-decoration:none;border-bottom:1px dotted #8ba73e;color:#8ba73e}.features li{padding-top:5px;padding-bottom:4px}.note_prod{width:225px;height:23px;overflow:hidden;border-radius:5px;display:table;text-transform:uppercase;font-size:11px;font-weight:bold}.note_prod .one{z-index:999}.note_prod .two{z-index:998}.note_prod .blue{float:left;padding-top:5px;padding-bottom:5px;background-color:#42b9f6;padding-left:10px;padding-right:5px;position:relative}.note_prod .blue:after{content:'';width:0;height:0;border-top:13px solid transparent;border-left:5px solid #42b9f6;border-bottom:13px solid transparent;position:absolute;top:-1px;margin-left:5px}.note_prod .red{float:left;padding-top:5px;padding-bottom:5px;background-color:#f75d50;padding-left:10px;padding-right:5px;position:relative;color:#ffffff}.note_prod .red:after{content:'';width:0;height:0;border-top:13px solid transparent;border-left:5px solid #f75d50;border-bottom:13px solid transparent;position:absolute;top:-1px;margin-left:5px}.note_prod .yellow{float:left;padding-top:5px;padding-bottom:5px;background-color:#fbc665;padding-left:10px;padding-right:5px;position:relative}.note_prod .yellow:after{content:'';width:0;height:0;border-top:13px solid transparent;border-left:5px solid #fbc665;border-bottom:13px solid transparent;position:absolute;top:-1px;margin-left:5px}.products_block .product{float:left;width:190px;vertical-align:bottom}.product .image{height:225px;position:relative}.product .image img{position:absolute;bottom:0;left:15px}.price{font-size:18px;color:#f75d50;font-weight:bold;text-align:center}.product{padding-bottom:30px;position:relative}.product p{font-size:15px;text-align:center;margin-top:15px}.left52{margin-left:52px}.product a{color:#ffffff}.mrg1{margin-top:25px;margin-bottom:15px}.products_martopbot{margin-top:60px;margin-bottom:100px}.cont_shop_but{display:table-cell;vertical-align:middle;padding:35px}.cont_shop{text-decoration:none;font-size:12px;border-bottom:1px dotted #799920;color:#799920}.icons{width:45px;height:50%;position:absolute;z-index:9;right:0;padding-top:25px;padding-right:15px}.icons a{width:44px;height:44px;float:left;border:1px solid #d2d2d2;margin-bottom:5px;background-color:white}a:hover{cursor:pointer}.basket_item .form-group{display:inline}.basket.open:after{content:'';position:absolute;top:43px;width:100%;height:10px;background-color:white;left:0;z-index:9990}.basket_hovered .basket_sum{float:left}a.active{font-weight:bold;text-decoration:underline}.HOME_RIGHT{display:inline-block;vertical-align:top;margin-left:10px;position:absolute}#HOME_UNDER_SLIDER > div{display:inline-block;margin-right:3px;margin-top:3px}.sort_block{display:inline-block}.sort_block ul{display:inline-block;margin:0;padding:0}.sort_block ul li{display:inline-block;margin:0 0.5em;list-style:none}.sort_block ul li a.asc:after,.sort_block ul li a.desc:after{display:block;width:5px;height:3px;position:absolute;top:50%;margin-top:-1px;right:-10px;content:'';background:url("../img/arrow_sort_asc_desc.png") no-repeat}.sort_block ul li a.asc:after{background-position:0 0}.sort_block ul li a.desc:after{background-position:0 -3px}.home_banner_up{margin-top:20px}.home_banner_up .HOME_RIGHT{display:block;float:right;position:static;margin-left:0}#HOME_SLIDER .jssorb03 div,#HOME_SLIDER .jssorb03 div:hover,#HOME_SLIDER .jssorb03 .av{width:6px;height:6px;border-radius:50%;line-height:6px;background:#fff;border:2px solid #fff;box-shadow:0px 0px 5px 0px rgba(54, 54, 54, 0.75)}#HOME_SLIDER .jssorb03 div.av:hover,#HOME_SLIDER .jssorb03 div.av:active,#HOME_SLIDER .jssorb03 .av{cursor:default;background:#95BA2F}.special-products{padding-top:30px}.special-products .link_buy{margin-bottom:0}.special-products .item{margin-bottom:0 !important;text-align:center}.why_me_{padding-top:30px;overflow:hidden;margin-bottom:60px}.why_me_ .why_list{width:1038px;margin-left:-58px}.seo_text p{margin:12px 0 0 0;font-size:13px !important;color:#333 !important;font-family:Roboto !important}.seo_text p:first-child{margin-top:0}.product-special{position:absolute}.jcarousel-skin-tango .jcarousel-item{width:38px;height:38px;border:1px solid #d2d2d2;text-align:center;background:#fff}.jcarousel-skin-tango .jcarousel-item a{display:table-cell;width:38px;height:38px;vertical-align:middle}.mycarousel img{max-width:38px;max-height:38px;border:0;vertical-align:middle}.jcarousel-skin-tango .jcarousel-clip-vertical,.jcarousel-skin-tango .jcarousel-container-vertical{height:175px}.jcarousel-skin-tango .jcarousel-container-vertical{padding:0}.jcarousel-skin-tango .jcarousel-prev-vertical{top:-13px}.jcarousel-skin-tango .jcarousel-next-vertical{bottom:-13px}.jcarousel-skin-tango .jcarousel-prev-vertical,.jcarousel-skin-tango .jcarousel-next-vertical{left:0;width:42px;background-position:14px 0}.jcarousel-skin-tango .jcarousel-prev-vertical:hover,.jcarousel-skin-tango .jcarousel-next-vertical:hover{background-position:14px 0;left:0}ul.product-special{position:absolute;top:0;left:16px}ul.product-special li{width:100%;float:left}ul.product-special li div{color:#333;font-size:10px;text-transform:uppercase;font-weight:700;height:22px;line-height:24px;padding:0 9px;position:relative;border-top-left-radius:4px;border-bottom-left-radius:4px;margin-top:8px;float:left}ul.product-special li:first-child{margin-top:0}ul.product-special li.top div{background:#fbc665}ul.product-special li.top div:after{content:'';position:absolute;right:-19px;top:3px;border:11px solid transparent;border-top:5px solid #fbc665;transform:rotate(-90deg)}ul.product-special li.new div{background:#42b9f6}ul.product-special li.new div:after{content:'';position:absolute;right:-18px;top:2px;border:11px solid transparent;border-top:5px solid #42b9f6;transform:rotate(-90deg)}ul.product-special li.promo div{background:#f75d50}ul.product-special li.promo div:after{content:'';position:absolute;right:-18px;top:2px;border:11px solid transparent;border-top:5px solid #f75d50;transform:rotate(-90deg)}.cost-block{margin-top:1px}.products.pn a.link_buy{margin-bottom:0}.products.pn{padding-bottom:0}.products.pn>ul{width:100%;float:left;margin-bottom:-3px}._form_checkbox_reset,.sort_block ul li a,.sort_block{font-size:12px}.filter_accept_bloc{margin-top:13px;margin-bottom:0}._form_checkbox_reset{color:#6a6a6a;display:block;width:128px;height:28px;border:1px solid #d2d2d2;line-height:28px;text-align:center;border-radius:4px;text-decoration:none;margin:0 auto}._form_checkbox_reset:hover{border:1px solid #95ba2f;color:#6a6a6a}._form_checkbox_reset:active{border:1px solid #95ba2f;background:#95ba2f;color:#fff}.sort_block ul li a{color:#8fa951;position:relative}.sort_block ul li a:hover{color:#333}#HOME_SLIDER .jssora03l,#HOME_SLIDER .jssora03r{width:36px;height:340px;background:url('../img/new_arrows_.png') no-repeat}#HOME_SLIDER .jssora03l,#HOME_SLIDER .jssora03l:hover{background-position:0 50%;left:0;top:0}#HOME_SLIDER .jssora03r,#HOME_SLIDER .jssora03r:hover{background-position:-36px 50%;right:0;top:0}.loyout ._prd_spec-wr{margin-top:10px}.loyout .special-products:first-child{border-top:0;padding-top:0}.irs-slider{width:13px;height:13px;top:25px;border-radius:100%;box-shadow:none;border:1px solid #d2d2d2;background:#ffffff;background:-moz-linear-gradient(top, #ffffff 0%, #ebebeb 100%);background:-webkit-linear-gradient(top, #ffffff 0%,#ebebeb 100%);background:linear-gradient(to bottom, #ffffff 0%,#ebebeb 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ebebeb',GradientType=0 )}.irs-slider.state_hover,.irs-slider:hover{background:#ffffff}.irs-slider:after{display:none}.irs-slider:before{content:"";position:absolute;width:5px;height:5px;z-index:2;border:1px solid #d2d2d2;border-radius:100%;background:#799920;top:3px;left:3px}.irs-bar{height:3px;top:30px}.irs-line{height:9px;background:#ebebeb;border:1px solid #d2d2d2;top:27px}.irs-line:before{width:166px;height:5px;position:absolute;content:'';top:2px;left:2px;background:#d2d2d2;border-radius:5px}.irs-min,.irs-max{display:none}.irs{height:49px}.price_filter.first_price_li{margin-top:8px}.product_read_ .w{width:110px;overflow:hidden;margin:0;padding-top:0;display:table-cell;vertical-align:middle;height:32px;float:none}.product_read_ .w strike,.product_read_ .w .cost{width:100%;float:left}.product_read_price .link_buy{width:118px;position:absolute;top:50%;right:0;margin:-16px 0 0 0}.product_read_price{position:relative;min-height:32px;margin-top:10px}.special-products.products h3{margin-bottom:10px}.special-products.products li.item{margin-top:30px}.productLeftBar .cost_box{border-top:0;padding:10px 0 15px 0}.productLeftBar .product_mod{width:100%;float:left;border-bottom:1px solid #d2d2d2;padding-bottom:15px}.field-orders-delivery .control-label,.field-orders-payment .control-label,.field-orders-body .control-label,.textareagroup .control-label{width:100%;float:left}.basket_title_{text-align:center}.cont_shopping-wr{width:100%;float:left;margin-top:10px}.cont_shopping-wr .cont_shopping{float:right}.cont_shopping{display:block !important;border-top:0 !important;border-left:0 !important;border-right:0 !important;border-bottom:1px dashed #799920 !important;color:#799920 !important;margin:0 !important;padding:0 !important;font-size:12px !important;float:left;border-radius:0 !important}.info.product-thumb-video{width:100%;height:100%}.info.product-thumb-video iframe,.info.product-thumb-video embed{width:100% !important;height:auto !important}.input-blocks-wrapper,.input-blocks{width:100%;float:left}.form-order .input-blocks-wrapper{margin-top:6px}.input-blocks label{font-size:13px;color:#333}.basket_input_2 label{height:30px;line-height:30px;float:left;width:70px !important;padding-top:0 !important}.custom-input-2{width:100%;height:30px;box-sizing:border-box;outline:none;line-height:30px;padding-left:8px;margin-top:5px;background:#fff;border-radius:4px}.custom-input-2,.custom-area-2,.textareagroup textarea{border:1px solid #d2d2d2;box-sizing:border-box;font-size:13px;color:#636363}.custom-area-2,.textareagroup textarea{min-height:128px;max-height:128px;resize:none;width:100%;max-width:100%;outline:none;padding-left:8px;padding-top:8px;margin-top:8px}.basket_input_2 .custom-input-2{width:270px;float:right;margin-top:0}.custom-input-2:focus,.custom-area-3:focus,.textareagroup textarea:focus{box-shadow:1px 2px 2px 0px rgba(215, 215, 215, 0.75) inset;transition:0.1s}.textareagroup textarea:focus{border:1px solid #d2d2d2}.title_groups,.radio_grp label.control-label,.textareagroup .control-label{font-size:12px;font-weight:bold;text-transform:uppercase;margin-bottom:12px}.input-blocks-group{width:100%;float:left;border-bottom:1px solid #d2d2d2;padding-bottom:20px;margin-top:18px}.custom-form-buttons{width:100%;float:left}input.custom-radio + label,input.custom-check + label{font-size:13px;cursor:pointer;margin-left:6px}input.custom-radio,input.custom-check{display:none}input.custom-radio + label span{width:16px;height:16px;background:url('../img/radio_new.png') no-repeat;float:left;transition:.2s;margin-top:1px}input.custom-radio:checked + label span,input.custom-radio:checked + label:hover span{background:url('../img/radio_new-active.png') no-repeat}input.custom-radio + label:hover{text-decoration:underline}.custom-form-buttons{margin-top:7px}.custom-form-buttons:first-child{margin-top:0}.delivery-data .field-order-delivery-childs .control-label{display:none}.checkout_basket{width:100%;float:left}.checkout_basket button{margin:0 auto}.input-blocks-wrapper .help-block{padding-left:71px;padding-top:4px;width:100%;float:left;box-sizing:border-box;margin-bottom:0}.cont_shop_but-wr{height:33px;margin-top:35px;padding-bottom:29px}.cont_shop_but-wr .cont_shop{margin-top:8px;float:left}.cont_shop_but-wr .submit4.bottom3{float:right}._qqq_ .params{font-size:12px}.activeShow{border-bottom:0 !important}.delivery-data:after{width:100%;border-bottom:1px solid #d2d2d2;position:absolute;content:'';bottom:-27px;left:0}.img_ajax_basket img{margin-right:0 !important;max-width:90px;max-height:90px;vertical-align:middle}.jcarousel-skin-tango>li{display:none}#login-form{margin:50px auto 0 auto}#bg{top:0 !important;z-index:1 !important}.top,.wrap,.bottom,.fotter{position:relative;z-index:2}.owl-pagination{display:none}.owl-controls .owl-buttons div{width:34px !important;height:50px !important;background:#596065 !important;top:50% !important;margin:-25px 0 0 0 !important;opacity:1 !important;border-radius:0 !important;padding:0 !important;position:absolute}.owl-controls .owl-buttons div:hover{background:#acafb2 !important;transition:0.2s !important}.owl-controls .owl-buttons .owl-prev{border-top-right-radius:4px !important;border-bottom-right-radius:4px !important;left:-20px}.owl-controls .owl-buttons .owl-next{border-top-left-radius:4px !important;border-bottom-left-radius:4px !important;right:-20px}.owl-controls .owl-buttons div:before{position:absolute;content:'';width:8px;height:22px;background:url("../img/arrows_blocks.png") no-repeat;top:50%;margin-top:-11px;left:50%;margin-left:-4px}.owl-controls .owl-buttons .owl-prev:before{background-position:0 0}.owl-controls .owl-buttons .owl-next:before{background-position:-8px 0}.basket_input_2.required .control-label{position:relative}.basket_input_2.required .control-label:before{position:absolute;top:0;content:'*';color:#D60000;left:-11px;padding-top:2px}.float-left{float:left}.blog-show-img{padding-right:20px}.text_seo.hidden_seo{height:178px;overflow:hidden;position:relative}.text_seo.hidden_seo div{height:162px;overflow:hidden;position:relative}.text_seo.hidden_seo a{position:absolute;bottom:0;right:0;font-size:16px}.text_seo.hidden_seo div:before{content:'';display:block;position:absolute;bottom:0;right:0;left:0;height:120px;background:-moz-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,#fff));background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%)}.special-products{border-bottom:1px solid #d2d2d2}a.link_buy,.checkout_basket button,.submit4{font-size:15px}.cost,.product_read_price #cost{font-size:20px}.cost span,.cost span.valute,.product_read_price .valute{font-size:15px} | ||
2 | \ No newline at end of file | 1 | \ No newline at end of file |
2 | +html,form,body{padding:0;margin:0;font-family:'Roboto';font-size:14px;color:#333;height:100%}h1,h2,h3{margin:0;padding:0 0 10px}.fl{float:left}.fotter .wrap .fr{float:right;width:180px;height:50px;position:relative;font-size:12px}.fotter .wrap .fr img{position:absolute;top:50%;margin-top:-10px;right:0}.fotter .wrap .fl{line-height:50px;font-size:12px}.both{clear:both}h1{margin:10px 0;font-size:24px}h3{margin-bottom:30px}p{margin:3px 0;padding:0}a{color:#6a6a6a;font-size:14px;text-decoration:underline}a:hover{color:#799920}.wrap{width:960px;margin:0 auto}.f{background:#fff}.br{-webkit-box-shadow:-1px 5px 14px 0 rgba(50,46,50,0.46);-moz-box-shadow:-1px 5px 14px 0 rgba(50,46,50,0.46);box-shadow:-1px 5px 14px 0 rgba(50,46,50,0.46);padding:20px}nav.top{background:#f5f5f5;padding:10px 0;border-bottom:1px solid #d2d2d2;font-size:12px}nav.top ul{list-style:none;margin:0;padding:0}nav.top ul li{float:left;padding-right:20px}nav.top ul li a{font-size:12px}nav.top a{color:#6a6a6a;text-decoration:none}#help{background:url(../img/help.png) right no-repeat;padding-right:20px}#help span{border-bottom:1px dotted #6a6a6a}#login{background:url(../img/login.png) right no-repeat;padding-right:20px;font-size:12px}#login span{border-bottom:1px dotted #6a6a6a}.search{margin:-5px 0 -5px 100px;float:left}nav input[type="text"]{width:325px;outline:0;border:1px solid #d8d6d6;border-radius:5px;padding:5px 0;font-size:14px;text-indent:10px}nav input[type="submit"]{width:35px;height:29px;border:none;background:url(../img/lupa_sub.png) center no-repeat;margin-left:-35px;cursor:pointer}.header{margin:0 0 20px}.phone{float:left;position:relative;text-align:center}.phone .tel{font-size:23px}.phone .tel span.more{margin-bottom:3px}.more_block{background:#fff;border:1px solid #d2d2d2;padding:10px;position:absolute;font-size:20px;display:none;z-index:99}.more{background:url(../img/more.png) no-repeat;width:12px;height:7px;display:inline-block;cursor:pointer;margin-bottom:5px}.logo{margin:0 auto;width:193px}.logo a{display:block;width:193px;height:84px;background:url(../img/logo.png) no-repeat}.logo a span{display:none}#call{color:#6a6a6a;text-decoration:none;border-bottom:1px dotted #6a6a6a}.basket{float:right;position:relative;border:1px solid #d2d2d2;border-radius:5px;padding:15px 20px;font-size:18px;text-transform:uppercase;margin-top:13px}.basket .info{float:left;border-right:1px solid #d2d2d2;padding-right:10px;margin-right:17px}.basket .info span{color:#f75d50;font-size:22px}.basket a:link,.basket a:visited{text-decoration:none;color:#000;font-size:18px}.basket span.more{margin-bottom:-1px}.menu{background:#596065;border:1px solid #e8e8e8}.menu ul{margin:0;padding:0;list-style:none}.menu ul li{float:left;border-left:1px solid #8b9094;height:43px}.menu ul li:first-child{border-left:none}.menu ul li a{width:100%;height:100%;line-height:43px;float:left;box-sizing:border-box;padding:0 19px;text-transform:uppercase;color:#fff;font-size:15px;text-decoration:none;font-weight:600}.menu ul li:hover{background:#3e454b}.menu ul li.active a{background:#f5f5f5;color:#596065}.menu ul li.active a:hover{cursor:default}.menu_childs{background:#f5f5f5;border:1px solid #e8e8e8;border-bottom:2px solid #596065}.menu_childs ul{margin:0;padding:0;list-style:none}.menu_childs ul li{float:left}.menu_childs ul li a{float:left;padding:15px 23px;text-transform:uppercase;color:#596065;font-size:14px;font-weight:700;text-decoration:none}.menu_childs ul li a:hover{color:#878b8e}.fr ul li{border:none}.akciya a{background:#f75d50;color:#fff}.brands a{background:#95ba2f;color:#fff}a.myorders{color:#f75d50}.sub{margin:2px 0 0}.sub img{float:left;margin-right:2px}.rubrics{margin:60px 0 0;padding-bottom:27px}.rubrics ul{list-style:none;margin:0;padding:0}.rubrics ul li{float:left;margin:0 35px}.rubrics ul li a{float:left;width:120px;padding-top:130px;text-align:center;text-transform:uppercase;color:#494949;text-decoration:none;font-weight:700}.rubrics ul li.item_ryukzaki a{background:url(../img/ico1.png) no-repeat}.rubrics ul li.item_sumki a{background:url(../img/ico2.png) no-repeat}.rubrics ul li.item_chehly a{background:url(../img/ico3.png) no-repeat}.rubrics ul li.item_nesessery a{background:url(../img/ico4.png) no-repeat}.rubrics ul li.item_koshelki a{background:url(../img/ico5.png) no-repeat}.products{padding-bottom:30px;padding-top:20px}.why_me_,.products{border-top:1px solid #d2d2d2}.products ul{list-style:none;margin:0;padding:0}.products ul li.item{float:left;width:192px;margin:0 0 50px;text-align:center;position:relative}.products ul li a.name,.special-products a.name{display:block;color:#799920;font-size:15px;text-decoration:none;margin:15px 0 0;height:35px;overflow:hidden;box-sizing:border-box;padding:0 10px}.products ul li a.name:hover,.special-products a.name:hover{text-decoration:underline}.products ul li .info{text-align:left}.pn{border:none}.cost,.product_read_price #cost{color:#f75d50;font-size:18px;margin:0;padding:0}.cost span,.cost span.valute,.product_read_price .valute{font-size:14px}strike,strike span#old_cost{font-size:14px;color:#333}.submit4m,a.link_buy,.checkout_basket button,.submit4{background:#95ba2f;border-radius:4px;height:29px;text-transform:uppercase;color:#fff;text-decoration:none;font-weight:600;text-align:center;border-bottom:3px solid #799920;font-size:12px}.submit4.bottom3{font-size:12px!important;display:block}.basket .submit4.bottom3{font-size:12px!important;display:block;margin-top:10px}a.link_buy,.checkout_basket button{display:block;margin:0 auto 10px;width:122px;line-height:32px}.checkout_basket button,.submit4{margin:0;padding:0 20px;line-height:31px;width:auto;border-top:0;border-left:0;border-right:0;cursor:pointer}a.link_buy:hover,.submit4m:hover,.checkout_basket button:hover,.submit4:hover,.btn-primary:hover{border-bottom:3px solid #95ba2f}a.link_buy:active,.submit4m:active,.checkout_basket button:active,.submit4:active,.btn-primary:active{background:#799920;border-bottom:3px solid #799920}.checkout_basket button:focus,.submit4:focus{outline:none}.mycarousel{position:absolute;right:22px;top:13px}ul.mycarousel{list-style:none;margin:0;padding:0}ul.mycarousel li{margin:0;padding:0}.mycarousel img{border:1px solid #d2d2d2}h3{text-align:center;text-transform:uppercase;font-size:20px}span.why{width:213px;height:49px;background:url(../img/logo-why.png) no-repeat;margin:0 auto;padding:0 0 20px;height:29px;display:block}ul.why_list{list-style:none;margin:0;padding:0}ul.why_list li{float:left;margin-left:58px;width:288px;height:96px;box-sizing:border-box;padding-left:110px;margin-top:20px}ul.why_list li div{display:table-cell;height:96px;vertical-align:middle}ul.why_list li span{font-weight:700;color:#799920}ul.why_list li.item1{background:url(../img/why_item1.png) left no-repeat}ul.why_list li.item2{background:url(../img/why_item2.png) left no-repeat}ul.why_list li.item3{background:url(../img/why_item3.png) left no-repeat}ul.why_list li.item4{background:url(../img/why_item4.png) left no-repeat}ul.why_list li.item5{background:url(../img/why_item5.png) left no-repeat}ul.why_list li.item6{background:url(../img/why_item6.png) left no-repeat}.banner_akciya{margin:50px 0}.bottom{background:#4d5458;padding:40px 0;color:#fff}.bottom .leftbar{float:left;width:210px}.bottom ul{list-style:none;margin:0;padding:0;line-height:23px}.bottom ul a{color:#fff;font-size:15px;text-decoration:none}.bottom ul a:hover{color:#799920}.phones{padding-left:25px;background:url(../img/phone.png) left top no-repeat;margin-top:50px;line-height:23px;font-size:18px}.map{padding:5px 0 5px 25px;background:url(../img/map.png) left no-repeat;margin-bottom:7px}a.more_map{color:#99a5ad;border-bottom:1px dotted #99a5ad;text-decoration:none;font-size:11px;text-align:center}.bread-crumbs{padding:0 0 0 20px;border-bottom:1px solid #d2d2d2;height:29px}.bread-crumbs ul{list-style:none;margin:0;padding:0;height:29px}.bread-crumbs ul li{float:left;padding-left:20px;height:100%;line-height:29px;color:#7d7d7d;position:relative;font-size:12px}.bread-crumbs ul li:first-child{padding-left:0}.bread-crumbs ul li a{font-size:12px;display:block;color:#7d7d7d}.bread-crumbs ul li a:visited,.bread-crumbs ul li a:link{color:#7d7d7d;text-decoration:underline}.bread-crumbs ul li a:hover{color:#464646;text-decoration:none}.breadcrumb > li + li:before{color:#ccc;content:"/";position:absolute;top:0;left:8px}.loyout{padding:20px 0}.leftbar{float:left;width:172px;margin-right:20px}.rightbar{float:right;width:380px;margin-left:40px}.rightbar.basket_rightbar{margin-right:20px}.rightbar2{float:right;width:320px}.content{overflow:hidden}* html .content{height:1%}.content2{overflow:hidden}* html .content2{height:1%}.filters{border-top:1px solid #d2d2d2;padding:20px 0 0;margin-top:20px}.filters .begin{text-transform:uppercase;font-weight:700;font-size:12px}.filters ul{list-style:none;margin:0;padding:0;line-height:22px;margin-top:6px}.filters ul li{position:relative;box-sizing:border-box;padding-left:24px;line-height:16px;margin-top:7px}.filters ul li:first-child{margin-top:0}.filters ul li>input{position:absolute;left:4px;margin:0;top:3px}.filters ul li a{color:#464646;text-decoration:none;font-size:13px;line-height:16px}.filters ul li a:hover{text-decoration:underline}.productLeftBar{float:left;width:228px;margin-left:20px;margin-right:20px}.productRightBar{float:right;width:260px;margin:0 20px}.productLeftBar h1{font-size:24px;border-bottom:1px solid #d2d2d2;margin-bottom:10px}ul.product_mod{list-style:none;margin:10px 0 0;padding:0;float:left}ul.product_mod li{float:left;width:46px;height:46px;background:#fff;border:1px solid #d2d2d2;margin:5px 5px 0 0;text-align:center;position:relative}ul.product_mod li.active:before{width:48px;height:48px;position:absolute;content:'';background:none;border:2px solid #95ba2f;top:-1px;left:-1px;box-sizing:border-box}ul.product_mod li a{width:46px;height:46px;display:table-cell;vertical-align:middle}ul.product_mod li a:focus{outline:none}ul.product_mod li img{vertical-align:middle;max-width:46px;max-height:46px}ul.product_colors{list-style:none;margin:30px 0 0;padding:0;float:left}ul.product_colors li{float:left;margin:10px 10px 0 0;width:98px;height:98px;text-align:center;border:1px solid #d2d2d2}ul.product_colors li a{width:98px;height:98px;vertical-align:middle;display:table-cell}ul.product_colors li img{max-width:98px;max-height:98px;vertical-align:middle}.productLeftBar .begin{text-transform:uppercase;font-weight:700;font-size:12px}.cost_box{border-top:1px solid #d2d2d2;border-bottom:1px solid #d2d2d2;margin:10px 0;padding:10px 0}.cost_box .w{float:left;margin-right:20px;padding-top:5px}.product_service ul{list-style:none;margin:0;padding:0}.product_service ul li a{color:#799920;text-decoration:none;border-bottom:1px dotted #799920;font-size:12px}.product_service ul li.item1{background:url(../img/li1.png) left no-repeat;padding:3px 23px}.product_service ul li.item2{background:url(../img/li2.png) left no-repeat;padding:3px 23px}.product_service ul li.item3{background:url(../img/li3.png) left no-repeat;padding:3px 23px}#nav_product{list-style:none;margin:0;padding:0;line-height:23px}#nav_product li a{background:url(../img/li_plus.png) left no-repeat;padding:3px 15px;color:#000;text-transform:uppercase;text-decoration:none;font-weight:700;font-size:12px}#nav_product li a.active{background:url(../img/li_minus.png) left no-repeat}#nav_product li .info{display:none;border-bottom:1px solid #d2d2d2;padding:10px 0;margin-bottom:10px}#nav_product li .info,#nav_product li .info p{font-size:12px;line-height:16px}.modal_box{position:fixed;left:0;top:0;width:100%;height:100%;z-index:999;background:#000;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);-moz-opacity:.5;-khtml-opacity:.5;opacity:.5}#data_box{position:absolute;top:100px;z-index:1000;width:400px;background:#fff;-webkit-box-shadow:0 0 15px #000;-moz-box-shadow:0 0 15px #000;box-shadow:0 0 15px #000;border:7px solid #1b9bb6;border-radius:5px}#data_box .data_wrp{padding:25px 15px 15px}#data_box .data_wrp h1{text-transform:uppercase}#data_box .data_wrp hr{height:1px;border:none;color:#000;background:#000;margin:45px 0 20px}#data_box .data_wrp hr.hr{height:1px;border:none;color:#000;background:#000;margin:20px 0}#data_box .pic-tango{margin-right:7px;margin-bottom:7px}#modal_close{cursor:pointer;margin-top:-80px;margin-right:-50px}.rightbar .control-label,.textareagroup .control-label{float:left;width:80px;padding-top:5px}.form-control{outline:0;border:1px solid #d8d6d6;border-radius:5px;padding:5px 0;font-size:14px;text-indent:10px;margin-bottom:3px;width:250px}.form-control:focus{border:#1b9bb6 1px solid;box-shadow:0 0 10px #1b9bb6;-webkit-box-shadow:0 0 10px #1b9bb6;-moz-box-shadow:0 0 10px #1b9bb6}.help-block{color:red;font-size:12px;margin-bottom:5px}.basket_item{padding:10px 0;border-bottom:1px solid #b7b7b7;clear:both}.basket_item img{margin-right:20px}.basket_item .count{margin:20px 0}.basket_item .fr{margin-top:13px}.basket_item .info{overflow:hidden}.basket_item > a{display:block;float:left}a.del:visited,a.del:link{background:url(../img/del.png) left center no-repeat;padding:2px 25px;font-size:12px;font-weight:400;color:#787878;text-decoration:underline}a.del:hover{color:#a52828;text-decoration:underline}.total{text-align:right;color:#87476a;font-size:20px;margin:10px 0}.submit4m{font-family:Roboto;border:none;background:#95ba2f;border-radius:4px;color:#fff;text-transform:uppercase;font-size:10px;cursor:pointer;width:102px;height:29px;border-bottom:3px solid #799920;line-height:29px}.submit4m:active,.submit4m:focus{outline:none}.btn-primary{border-bottom:3px solid #799920;border-top:0;border-right:0;border-left:0;margin-top:5px;padding:0 15px;background:#95ba2f;border-radius:4px;color:#fff;text-transform:uppercase;text-decoration:none;font-size:12px;font-weight:700;cursor:pointer;height:29px;line-height:29px}.btn-primary:active,.btn-primary:focus{outline:none}a.logout:visited,a.logout:link{border:none;padding:3px 5px;background:#f75d50;border-radius:5px;color:#fff;text-transform:uppercase;text-decoration:none;font-size:11px;font-weight:400;cursor:pointer}a.logout:hover{background:#95ba2f}.boy_box{border-bottom:1px solid #b7b7b7;padding:0 0 15px}.boy_box div{padding-top:10px}.content_product .info{padding:0 0 20px}a.btn-success{display:inline-block;border:2px solid #d8d6d6;color:#95ba2f;border-radius:5px;padding:5px;margin-bottom:10px;text-decoration:none;font-size:14px}a.btn-success:hover{border:#95ba2f 2px solid;color:#f75d50}.txtb1{font-size:14px;font-weight:700}.txtf{font-size:14px;font-weight:700;color:#87476a}.txtfb{font-size:20px;font-weight:700;color:#87476a}.count{margin:20px 0}.count input[type="number"]{outline:0;width:50px;border:1px solid #d8d6d6;border-radius:5px;padding:5px 0;font-size:14px;text-indent:10px;margin-bottom:7px}a.link2:visited,a.link2:link{font-size:14px;font-weight:700;color:#95ba2f;text-decoration:none}a.link2:hover{color:#f75d50;text-decoration:underline}.well{margin:50px auto;width:400px;background:#f5f5f5;border:1px solid #e8e8e8;padding:20px;border-radius:5px}.control-label{float:left;width:100px;padding-top:5px}#user-verifycode-image{display:block}.form-inline{display:inline}.form-inline .form-group{float:left;margin-right:10px}.form-inline .form-group select{width:100px}.form-group{margin-bottom:10px}.table-bordered{width:100%;border:1px solid silver}.table-bordered th{background:#B3D1FD;padding:5px}.table-bordered tr td{border:1px solid silver;padding:5px}.table-bordered .filters{display:none}.formCost label{float:left;width:30px}ul.brends_list{list-style:none;margin:0;padding:0}ul.brends_list li{float:left;text-align:center;margin:0 15px 20px}.compare{text-align:center}.compare a:visited,.compare a:link{font-size:12px;text-decoration:underline}.alert-success{margin:10px 0;padding:10px;border:1px solid #3ed824;border-radius:5px;background:#c0feb5}.news_item{padding-bottom:20px;margin-bottom:20px;border-bottom:1px solid silver}.news_item img{margin-right:20px}.news_item a{font-size:16px}.pic{width:392px;height:365px}.pic a{width:392px;height:365px;display:table-cell;vertical-align:middle}.pic a img{max-width:392px;max-height:365px;vertical-align:middle}input#subscribe-email::-webkit-input-placeholder{color:#596065}input#subscribe-email::-moz-placeholder{color:#596065}input#subscribe-email:-ms-input-placeholder{color:#596065}input#subscribe-sale::-webkit-input-placeholder{color:#596065}input#subscribe-sale::-moz-placeholder{color:#596065}input#subscribe-sale:-ms-input-placeholder{color:#596065}#subscribe-email,#subscribe-sale{color:#596065}#subscribe-sale{width:100px;float:left;margin-right:20px;height:28px}.saletxt{width:150px;float:left;color:#fff;font-size:12px}#subscribe-email{width:370px}.txts{color:#9da9b1;font-size:18px;margin-bottom:20px}.content ul.pagination{list-style:none;text-align:center;margin:0 0 16px;padding:0 0 20px;border-bottom:1px solid #d2d2d2}.content ul.pagination li{display:inline}.content ul.pagination li a{padding:3px;color:#82a02f;font-size:15px;margin:0;text-decoration:none}.content ul.pagination li a:hover{text-decoration:underline}.content ul.pagination li.active a{color:#333}.boxitem{height:318px}ul.social{margin-top:20px}.social{list-style:none;margin:10px;padding:0;height:48px}.social li{display:inline-block;margin-right:7px;padding-bottom:10px}.social li a{width:36px;height:36px;display:block;margin:0;padding:0;text-indent:-9999px;background:#bcbcbc url(../img/social-ico-two.png) no-repeat 0 0;border-radius:48px;-moz-border-radius:48px;-webkit-border-radius:48px;-webkit-transition:all .5s ease-out;-moz-transition:all .5s ease-out;transition:all .5s ease-out}.social .fb{background-position:-44px 0;cursor:pointer}.social .vk{cursor:pointer}.social .vk:hover{background-color:#5B7FA6}.social .fb:hover{background-color:#354f89}.social .gp{background-position:-132px 0;cursor:pointer}.social .gp:hover{background-color:#c72f21}.social .tw{background-position:-144px 0;cursor:pointer}.social .tw:hover{background-color:#6398c9}.social .ok{background-position:-89px 0;cursor:pointer}.social .ok:hover{background-color:#f88f15}.social ul li a:hover{background-color:#065baa}.socialbox{margin:10px 0}.hide{display:none}.footer .fl{font-size:12px}.fotter{background:#484f55;height:50px;color:#98a3ab}.fotter a{color:#98a3ab;line-height:50px;float:left;font-size:12px}.view_products2{list-style:none;overflow:auto;height:400px}.view_products2 img{float:left;margin-right:20px}.view_products2 li{margin:10px 0}.pixbox{width:160px;margin:0 auto;height:200px;overflow:hidden;text-align:center}.form-order{background:#f5f5f5;padding:0 20px 20px}#order-payment{float:right;width:280px}#order-delivery{float:right;width:280px}.delivery-data{margin-bottom:27px;position:relative;background:#95ba2f;display:none;border-radius:5px;float:left;box-sizing:border-box;padding:14px 20px;color:#fff;font-size:13px}.jcarousel-next-disabled,.jcarousel-prev-disabled{opacity:0;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0)}.content2 br{display:none}.pixbox a{width:160px;height:200px;display:table-cell;vertical-align:middle}.pixbox img{max-width:160px;max-height:200px;vertical-align:middle}.pagination li.prev.disabled span{display:none}.pagination li.next.disabled span{display:none}.fr{float:right}.nobottom{border-bottom:none!important}.dotted a{border-bottom:1px dotted gray}.mycabinet{padding-left:20px;margin-top:20px}.mycabinet .begin{text-transform:uppercase;font-size:13px;font-weight:700;padding-bottom:15px}.mycabinet ul{margin:0;padding:0;list-style:none}.mycabinet ul li{padding-top:10px;padding-bottom:10px}.mycabinet a{color:#799920;text-decoration:none}.lay_title .uppercase{text-transform:uppercase}.lay_title .center{text-align:center}.lay_title{padding-top:15px;font-size:24px}.user_data{width:390px;border-right:1px solid #d2d2d2;float:left}.user_data .col{padding-bottom:35px}.user_data .col.last{padding-bottom:0}.user_data .title{text-transform:uppercase;font-weight:700;width:170px;float:left;font-size:13px}.user_data .data{float:left;font-size:13px}.edit_menu{float:left;padding-left:60px;font-size:13px}.edit_menu div{padding-bottom:20px}.edit_menu a{color:#799920;text-decoration:none}.edit_menu .dotted{border-bottom:1px dotted #799920}.user_edit_area{padding-top:30px}.user_data_editing{float:left}.inputs .col{padding-bottom:12px!important}.user_data_editing .col{padding-bottom:35px;width:432px}.user_data_editing .title{text-transform:uppercase;font-weight:700;width:170px;float:left;font-size:13px}.user_data_editing .data{float:left;font-size:13px;width:262px}.user_data_editing input[type="text"]{padding:0;margin:0;border:1px solid #d2d2d2;padding-top:7px;padding-bottom:7px;padding-left:10px;padding-right:10px;border-radius:4px;font-size:12px;margin-top:-10px;width:240px}.user_data_editing .add{color:#799920;text-decoration:none;border-bottom:1px dotted #799920}.add_more{padding-bottom:24px;padding-left:170px}.delete{float:right}.delete_button{background:url(../img/ico_close.png) right no-repeat;width:16px;height:16px;float:right}.content_area{width:450px}#cancel{text-decoration:none;color:#799920;font-size:13px;border-bottom:1px dotted #799920;float:left;margin-left:40px}.buttons{display:inline-flex;align-items:center}.favorites{background-color:#f5f5f5;padding:5px;font-size:14px}.favorites .fav_point{background-color:#fff;border:1px solid #d2d2d2;border-radius:3px;margin-top:5px;padding:10px 20px}.favorites .fav_point .left{float:left;padding-right:0;width:178px}.favorites .fav_point .right{float:right;padding-right:0;padding-left:0}.favorites .link{color:#799920;text-decoration:none;border-bottom:1px dotted #799920}.redtext{color:#f75d50}.greentext{color:#95ba2f}.hold .orders_view{display:none!important}.orders_view{width:680px;margin-top:13px;padding-top:13px;padding-bottom:5px;border-top:1px solid #d2d2d2;display:block}.orders_view .order{float:left;width:225px;text-align:center}.orders_view .order .order_price{color:#f75d50;font-weight:700;font-size:15px}.orders_view .order .order_price span{font-size:24px}.orders_view .order img{padding-bottom:22px}.orders_view .order .note{font-size:13px}.orders_view .order .note span{color:#f75d50}.basket_hovered{position:absolute;border:1px solid #d2d2d2;border-radius:5px;padding:15px 20px;background-color:#fff;right:-1px;margin-top:10px;width:640px;display:none;z-index:1111}.open .basket_hovered{display:block}.open,.open .basket_hovered{-moz-box-shadow:0 0 5px rgba(149,149,149,0.75);-webkit-box-shadow:0 0 5px rgba(149,149,149,0.75);box-shadow:0 0 5px rgba(149,149,149,0.75)}.basket_hovered1:before{position:absolute;left:0;content:' ';width:100%;background-color:#fff;height:10px;top:45px;z-index:1112}.basket_item input{border:1px solid #d2d2d2;border-radius:4px;padding:9px;width:26px;font-size:18px;font-weight:700;text-align:center;background-color:#fff;color:#000;margin:7px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.minus{background:url(../img/minus.png) no-repeat;width:15px;height:15px;display:inline-block;cursor:pointer}.plus{background:url(../img/plus.png) no-repeat;width:15px;height:15px;display:inline-block;cursor:pointer}.basket_sum{padding-top:15px}.basket_sum .sum_text{font-size:15px;text-transform:none;padding-top:12px;float:right!important;padding-top:1px;margin-bottom:11px}.basket_sum .sum_text span{font-size:18px;color:#f75d50;font-weight:700}.basket_sum a{color:#fff!important;font-size:15px!important;float:right}.black{z-index:9999;width:100%;height:100%;position:absolute;display:block;padding-top:6%}.black:before{content:'';background-color:rgba(0,0,0,0.5);width:100%;height:100%;position:fixed;top:0}.black.hidden{display:none}.black .item_added_win{background-color:#fff;width:640px;margin:auto;position:relative}.black_close{position:absolute;top:30px;right:30px;background:url(../img/ico_close2.png) no-repeat;width:22px;height:22px;display:inline-block;cursor:pointer}.block_content{padding-left:20px;padding-right:20px}.item_added_win h2{text-transform:uppercase;text-align:center;padding:30px}.block_content .item{padding-top:20px;padding-bottom:20px;border-bottom:1px solid #d2d2d2}.uppercase{text-transform:uppercase}.w230{width:230px}.w260{width:260px}.w430{width:430px}.borderbottom{border-bottom:1px solid #d2d2d2}.left_block .begin{text-transform:uppercase;font-size:13px;font-weight:700;padding-bottom:15px}.color_variants .variant{text-align:center;border:1px solid #d2d2d2;float:left;margin-right:5px;margin-bottom:5px}.variant:hover{cursor:pointer}.color_variants{margin-top:14px;margin-bottom:-5px}.color_variants .variant.active{width:44px;height:44px;border:2px solid #95ba2f}.color_variants .variant.active a{width:44px;height:44px}.tobasket{margin-top:20px;margin-bottom:20px}.tobasket:hover{color:#fff}.variant{width:46px;height:46px}.variant.active{width:44px;height:44px}.layout{margin-top:15px}.left_block{float:left}.right_block{float:right}.center_block{float:left;margin-left:23px}.left_block .links{margin-top:25px}.left_block .links li{list-style:none;padding-left:25px;display:inline-block;cursor:pointer;height:20px}.left_block .links ul{margin:0;padding:0}.left_block .links a{font-size:13.5px;text-decoration:none;color:#8ba73e}.links .add_bookmarks{background:url(../img/ico_add_bookmark.png) no-repeat center left}.links .what_price{background:url(../img/ico_price.png) no-repeat center left}.links .add_compare{background:url(../img/ico_scales.png) no-repeat center left}.spoiler_one{padding-top:15px;padding-bottom:15px;border-bottom:1px solid #d2d2d2}.spoiler_one .spoiler_content{margin-top:15px;font-size:13px}.spoiler_one .spoiler_content.hidden{display:none}.title_spoiler:hover{cursor:pointer}.title_spoiler{background:url(../img/ico_open.png) no-repeat center left;padding-left:17px;font-size:13px;text-transform:uppercase;color:#333;font-weight:700;text-decoration:none}.title_spoiler.closed{background:url(../img/ico_close3.png) no-repeat center left}.features{list-style:none;padding:0;margin:0;font-size:13px}.features a{font-size:13px;text-decoration:none;border-bottom:1px dotted #8ba73e;color:#8ba73e}.features li{padding-top:5px;padding-bottom:4px}.note_prod{width:225px;height:23px;overflow:hidden;border-radius:5px;display:table;text-transform:uppercase;font-size:11px;font-weight:700}.note_prod .one{z-index:999}.note_prod .two{z-index:998}.note_prod .blue{float:left;background-color:#42b9f6;position:relative;padding:5px 5px 5px 10px}.note_prod .blue:after{content:'';width:0;height:0;border-top:13px solid transparent;border-left:5px solid #42b9f6;border-bottom:13px solid transparent;position:absolute;top:-1px;margin-left:5px}.note_prod .red{float:left;background-color:#f75d50;position:relative;color:#fff;padding:5px 5px 5px 10px}.note_prod .red:after{content:'';width:0;height:0;border-top:13px solid transparent;border-left:5px solid #f75d50;border-bottom:13px solid transparent;position:absolute;top:-1px;margin-left:5px}.note_prod .yellow{float:left;background-color:#fbc665;position:relative;padding:5px 5px 5px 10px}.note_prod .yellow:after{content:'';width:0;height:0;border-top:13px solid transparent;border-left:5px solid #fbc665;border-bottom:13px solid transparent;position:absolute;top:-1px;margin-left:5px}.products_block .product{float:left;width:190px;vertical-align:bottom}.product .image{height:225px;position:relative}.product .image img{position:absolute;bottom:0;left:15px}.price{font-size:18px;color:#f75d50;font-weight:700;text-align:center}.product{padding-bottom:30px;position:relative}.product p{font-size:15px;text-align:center;margin-top:15px}.left52{margin-left:52px}.product a{color:#fff}.mrg1{margin-top:25px;margin-bottom:15px}.products_martopbot{margin-top:60px;margin-bottom:100px}.cont_shop_but{display:table-cell;vertical-align:middle;padding:35px}.cont_shop{text-decoration:none;font-size:12px;border-bottom:1px dotted #799920;color:#799920}.icons{width:45px;height:50%;position:absolute;z-index:9;right:0;padding-top:25px;padding-right:15px}.icons a{width:44px;height:44px;float:left;border:1px solid #d2d2d2;margin-bottom:5px;background-color:#fff}a:hover{cursor:pointer}.basket_item .form-group{display:inline}.basket.open:after{content:'';position:absolute;top:43px;width:100%;height:10px;background-color:#fff;left:0;z-index:9990}.basket_hovered .basket_sum{float:left}a.active{font-weight:700;text-decoration:underline}.HOME_RIGHT{display:inline-block;vertical-align:top;margin-left:10px;position:absolute}#HOME_UNDER_SLIDER > div{display:inline-block;margin-right:3px;margin-top:3px}.sort_block{display:inline-block}.sort_block ul{display:inline-block;margin:0;padding:0}.sort_block ul li{display:inline-block;margin:0 .5em;list-style:none}.sort_block ul li a.asc:after,.sort_block ul li a.desc:after{display:block;width:5px;height:3px;position:absolute;top:50%;margin-top:-1px;right:-10px;content:'';background:url(../img/arrow_sort_asc_desc.png) no-repeat}.sort_block ul li a.asc:after{background-position:0 0}.sort_block ul li a.desc:after{background-position:0 -3px}.home_banner_up{margin-top:20px}.home_banner_up .HOME_RIGHT{display:block;float:right;position:static;margin-left:0}#HOME_SLIDER .jssorb03 div,#HOME_SLIDER .jssorb03 div:hover,#HOME_SLIDER .jssorb03 .av{width:6px;height:6px;border-radius:50%;line-height:6px;background:#fff;border:2px solid #fff;box-shadow:0 0 5px 0 rgba(54,54,54,0.75)}#HOME_SLIDER .jssorb03 div.av:hover,#HOME_SLIDER .jssorb03 div.av:active,#HOME_SLIDER .jssorb03 .av{cursor:default;background:#95BA2F}.special-products{padding-top:30px}.special-products .link_buy{margin-bottom:0}.special-products .item{margin-bottom:0!important;text-align:center}.why_me_{padding-top:30px;overflow:hidden;margin-bottom:60px}.why_me_ .why_list{width:1038px;margin-left:-58px}.seo_text p{margin:12px 0 0;font-size:13px!important;color:#333!important;font-family:Roboto!important}.seo_text p:first-child{margin-top:0}.product-special{position:absolute}.jcarousel-skin-tango .jcarousel-item{width:38px;height:38px;border:1px solid #d2d2d2;text-align:center;background:#fff}.jcarousel-skin-tango .jcarousel-item a{display:table-cell;width:38px;height:38px;vertical-align:middle}.mycarousel img{max-width:38px;max-height:38px;border:0;vertical-align:middle}.jcarousel-skin-tango .jcarousel-clip-vertical,.jcarousel-skin-tango .jcarousel-container-vertical{height:175px}.jcarousel-skin-tango .jcarousel-container-vertical{padding:0}.jcarousel-skin-tango .jcarousel-prev-vertical{top:-13px}.jcarousel-skin-tango .jcarousel-next-vertical{bottom:-13px}.jcarousel-skin-tango .jcarousel-prev-vertical,.jcarousel-skin-tango .jcarousel-next-vertical{left:0;width:42px;background-position:14px 0}.jcarousel-skin-tango .jcarousel-prev-vertical:hover,.jcarousel-skin-tango .jcarousel-next-vertical:hover{background-position:14px 0;left:0}ul.product-special{position:absolute;top:0;left:16px}ul.product-special li{width:100%;float:left}ul.product-special li div{color:#333;font-size:10px;text-transform:uppercase;font-weight:700;height:22px;line-height:24px;padding:0 9px;position:relative;border-top-left-radius:4px;border-bottom-left-radius:4px;margin-top:8px;float:left}ul.product-special li:first-child{margin-top:0}ul.product-special li.top div{background:#fbc665}ul.product-special li.top div:after{content:'';position:absolute;right:-19px;top:3px;border:11px solid transparent;border-top:5px solid #fbc665;transform:rotate(-90deg)}ul.product-special li.new div{background:#42b9f6}ul.product-special li.new div:after{content:'';position:absolute;right:-18px;top:2px;border:11px solid transparent;border-top:5px solid #42b9f6;transform:rotate(-90deg)}ul.product-special li.promo div{background:#f75d50}ul.product-special li.promo div:after{content:'';position:absolute;right:-18px;top:2px;border:11px solid transparent;border-top:5px solid #f75d50;transform:rotate(-90deg)}.cost-block{margin-top:1px}.products.pn a.link_buy{margin-bottom:0}.products.pn{padding-bottom:0}.products.pn>ul{width:100%;float:left;margin-bottom:-3px}._form_checkbox_reset,.sort_block ul li a,.sort_block{font-size:12px}.filter_accept_bloc{margin-top:13px;margin-bottom:0}._form_checkbox_reset{color:#6a6a6a;display:block;width:128px;height:28px;border:1px solid #d2d2d2;line-height:28px;text-align:center;border-radius:4px;text-decoration:none;margin:0 auto}._form_checkbox_reset:hover{border:1px solid #95ba2f;color:#6a6a6a}._form_checkbox_reset:active{border:1px solid #95ba2f;background:#95ba2f;color:#fff}.sort_block ul li a{color:#8fa951;position:relative}.sort_block ul li a:hover{color:#333}#HOME_SLIDER .jssora03l,#HOME_SLIDER .jssora03r{width:36px;height:340px;background:url(../img/new_arrows_.png) no-repeat}#HOME_SLIDER .jssora03l,#HOME_SLIDER .jssora03l:hover{background-position:0 50%;left:0;top:0}#HOME_SLIDER .jssora03r,#HOME_SLIDER .jssora03r:hover{background-position:-36px 50%;right:0;top:0}.loyout ._prd_spec-wr{margin-top:10px}.loyout .special-products:first-child{border-top:0;padding-top:0}.irs-slider{width:13px;height:13px;top:25px;border-radius:100%;box-shadow:none;border:1px solid #d2d2d2;background:#fff;background:-moz-linear-gradient(top,#fff 0%,#ebebeb 100%);background:-webkit-linear-gradient(top,#fff 0%,#ebebeb 100%);background:linear-gradient(to bottom,#fff 0%,#ebebeb 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#ebebeb',GradientType=0)}.irs-slider.state_hover,.irs-slider:hover{background:#fff}.irs-slider:after{display:none}.irs-slider:before{content:"";position:absolute;width:5px;height:5px;z-index:2;border:1px solid #d2d2d2;border-radius:100%;background:#799920;top:3px;left:3px}.irs-bar{height:3px;top:30px}.irs-line{height:9px;background:#ebebeb;border:1px solid #d2d2d2;top:27px}.irs-line:before{width:166px;height:5px;position:absolute;content:'';top:2px;left:2px;background:#d2d2d2;border-radius:5px}.irs-min,.irs-max{display:none}.irs{height:49px}.price_filter.first_price_li{margin-top:8px}.product_read_ .w{width:110px;overflow:hidden;margin:0;padding-top:0;display:table-cell;vertical-align:middle;height:32px;float:none}.product_read_ .w strike,.product_read_ .w .cost{width:100%;float:left}.product_read_price .link_buy{width:118px;position:absolute;top:50%;right:0;margin:-16px 0 0}.product_read_price{position:relative;min-height:32px;margin-top:10px}.special-products.products h3{margin-bottom:10px}.special-products.products li.item{margin-top:30px}.productLeftBar .cost_box{border-top:0;padding:10px 0 15px}.productLeftBar .product_mod{width:100%;float:left;border-bottom:1px solid #d2d2d2;padding-bottom:15px}.field-orders-delivery .control-label,.field-orders-payment .control-label,.field-orders-body .control-label,.textareagroup .control-label{width:100%;float:left}.basket_title_{text-align:center}.cont_shopping-wr{width:100%;float:left;margin-top:10px}.cont_shopping-wr .cont_shopping{float:right}.cont_shopping{display:block!important;border-top:0!important;border-left:0!important;border-right:0!important;border-bottom:1px dashed #799920!important;color:#799920!important;margin:0!important;padding:0!important;font-size:12px!important;float:left;border-radius:0!important}.info.product-thumb-video{width:100%;height:100%}.info.product-thumb-video iframe,.info.product-thumb-video embed{width:100%!important;height:auto!important}.input-blocks-wrapper,.input-blocks{width:100%;float:left}.form-order .input-blocks-wrapper{margin-top:6px}.input-blocks label{font-size:13px;color:#333}.basket_input_2 label{height:30px;line-height:30px;float:left;width:70px!important;padding-top:0!important}.custom-input-2{width:100%;height:30px;box-sizing:border-box;outline:none;line-height:30px;padding-left:8px;margin-top:5px;background:#fff;border-radius:4px}.custom-input-2,.custom-area-2,.textareagroup textarea{border:1px solid #d2d2d2;box-sizing:border-box;font-size:13px;color:#636363}.custom-area-2,.textareagroup textarea{min-height:128px;max-height:128px;resize:none;width:100%;max-width:100%;outline:none;padding-left:8px;padding-top:8px;margin-top:8px}.basket_input_2 .custom-input-2{width:270px;float:right;margin-top:0}.custom-input-2:focus,.custom-area-3:focus,.textareagroup textarea:focus{box-shadow:1px 2px 2px 0 rgba(215,215,215,0.75) inset;transition:.1s}.textareagroup textarea:focus{border:1px solid #d2d2d2}.title_groups,.radio_grp label.control-label,.textareagroup .control-label{font-size:12px;font-weight:700;text-transform:uppercase;margin-bottom:12px}.input-blocks-group{width:100%;float:left;border-bottom:1px solid #d2d2d2;padding-bottom:20px;margin-top:18px}.custom-form-buttons{width:100%;float:left}input.custom-radio + label,input.custom-check + label{font-size:13px;cursor:pointer;margin-left:6px}input.custom-radio,input.custom-check{display:none}input.custom-radio + label span{width:16px;height:16px;background:url(../img/radio_new.png) no-repeat;float:left;transition:.2s;margin-top:1px}input.custom-radio:checked + label span,input.custom-radio:checked + label:hover span{background:url(../img/radio_new-active.png) no-repeat}input.custom-radio + label:hover{text-decoration:underline}.custom-form-buttons{margin-top:7px}.custom-form-buttons:first-child{margin-top:0}.delivery-data .field-order-delivery-childs .control-label{display:none}.checkout_basket{width:100%;float:left}.checkout_basket button{margin:0 auto}.input-blocks-wrapper .help-block{padding-left:71px;padding-top:4px;width:100%;float:left;box-sizing:border-box;margin-bottom:0}.cont_shop_but-wr{height:33px;margin-top:35px;padding-bottom:29px}.cont_shop_but-wr .cont_shop{margin-top:8px;float:left}.cont_shop_but-wr .submit4.bottom3{float:right}._qqq_ .params{font-size:12px}.activeShow{border-bottom:0!important}.delivery-data:after{width:100%;border-bottom:1px solid #d2d2d2;position:absolute;content:'';bottom:-27px;left:0}.img_ajax_basket img{margin-right:0!important;max-width:90px;max-height:90px;vertical-align:middle}.jcarousel-skin-tango>li{display:none}#login-form{margin:50px auto 0}#bg{top:0!important;z-index:1!important}.top,.wrap,.bottom,.fotter{position:relative;z-index:2}.owl-pagination{display:none}.owl-controls .owl-buttons div{width:34px!important;height:50px!important;background:#596065!important;top:50%!important;margin:-25px 0 0!important;opacity:1!important;border-radius:0!important;padding:0!important;position:absolute}.owl-controls .owl-buttons div:hover{background:#acafb2!important;transition:.2s!important}.owl-controls .owl-buttons .owl-prev{border-top-right-radius:4px!important;border-bottom-right-radius:4px!important;left:-20px}.owl-controls .owl-buttons .owl-next{border-top-left-radius:4px!important;border-bottom-left-radius:4px!important;right:-20px}.owl-controls .owl-buttons div:before{position:absolute;content:'';width:8px;height:22px;background:url(../img/arrows_blocks.png) no-repeat;top:50%;margin-top:-11px;left:50%;margin-left:-4px}.owl-controls .owl-buttons .owl-prev:before{background-position:0 0}.owl-controls .owl-buttons .owl-next:before{background-position:-8px 0}.basket_input_2.required .control-label{position:relative}.basket_input_2.required .control-label:before{position:absolute;top:0;content:'*';color:#D60000;left:-11px;padding-top:2px}.float-left{float:left}.blog-show-img{padding-right:20px}.text_seo.hidden_seo{height:178px;overflow:hidden;position:relative}.text_seo.hidden_seo div{height:162px;overflow:hidden;position:relative}.text_seo.hidden_seo a{position:absolute;bottom:0;right:0;font-size:16px}.text_seo.hidden_seo div:before{content:'';display:block;position:absolute;bottom:0;right:0;left:0;height:120px;background:-moz-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(255,255,255,0)),color-stop(100%,#fff));background:-webkit-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:-o-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:-ms-linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%);background:linear-gradient(top,rgba(255,255,255,0) 0%,#fff 100%)}.special-products{border-bottom:1px solid #d2d2d2}a.link_buy,.checkout_basket button,.submit4{font-size:15px}.cost,.product_read_price #cost{font-size:20px}.cost span,.cost span.valute,.product_read_price .valute{font-size:15px}.comment_display_block{height:35px} | ||
3 | \ No newline at end of file | 3 | \ No newline at end of file |
frontend/web/css/style.dev.css
@@ -500,7 +500,7 @@ input#subscribe-sale:-ms-input-placeholder { | @@ -500,7 +500,7 @@ input#subscribe-sale:-ms-input-placeholder { | ||
500 | .content ul.pagination li a:hover {text-decoration: underline} | 500 | .content ul.pagination li a:hover {text-decoration: underline} |
501 | .content ul.pagination li.active a{color: #333333;} | 501 | .content ul.pagination li.active a{color: #333333;} |
502 | .boxitem{ | 502 | .boxitem{ |
503 | - height:283px; | 503 | + height:318px; |
504 | } | 504 | } |
505 | ul.social {margin-top: 20px;} | 505 | ul.social {margin-top: 20px;} |
506 | .social{list-style: none;margin: 10px;padding: 0px;height:48px;} | 506 | .social{list-style: none;margin: 10px;padding: 0px;height:48px;} |
@@ -1613,4 +1613,7 @@ input.custom-radio + label:hover { | @@ -1613,4 +1613,7 @@ input.custom-radio + label:hover { | ||
1613 | background: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0%, #fff 100%); | 1613 | background: -ms-linear-gradient(top, rgba(255, 255, 255, 0) 0%, #fff 100%); |
1614 | background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, #fff 100%); | 1614 | background: linear-gradient(top, rgba(255, 255, 255, 0) 0%, #fff 100%); |
1615 | } | 1615 | } |
1616 | -.special-products{border-bottom:1px solid #d2d2d2}a.link_buy,.checkout_basket button,.submit4{font-size:15px}.cost,.product_read_price #cost{font-size:20px}.cost span,.cost span.valute,.product_read_price .valute{font-size:15px} | ||
1617 | \ No newline at end of file | 1616 | \ No newline at end of file |
1617 | +.special-products{border-bottom:1px solid #d2d2d2}a.link_buy,.checkout_basket button,.submit4{font-size:15px}.cost,.product_read_price #cost{font-size:20px}.cost span,.cost span.valute,.product_read_price .valute{font-size:15px} | ||
1618 | +.comment_display_block { | ||
1619 | + height: 35px; | ||
1620 | +} | ||
1618 | \ No newline at end of file | 1621 | \ No newline at end of file |