diff --git a/common/behaviors/ShowImage.php b/common/behaviors/ShowImage.php index 9cf5f32..3a59c2a 100644 --- a/common/behaviors/ShowImage.php +++ b/common/behaviors/ShowImage.php @@ -42,12 +42,18 @@ if(!file_exists($filename)) { $original = $storage . dirname($dir) . '/original.' . $type[ 1 ]; + $resizer = new UploaderComponent(); if(file_exists($original)) { - $resizer = new UploaderComponent(); $resizer->resizeImg($width, $height, $original, $filename); - } else { - throw new \Exception("Файл $original не существует"); + + $imageNotFound = yii\helpers\Url::to('@storage')."/imageNotFound".$width."x".$height.".jpg"; + if(!file_exists($imageNotFound)){ + $resizer->resizeImg($width, $height, yii\helpers\Url::to('@storage')."/imageNotFound.jpg", $imageNotFound ); + } + return "/storage/imageNotFound".$width."x".$height.".jpg"; + + } } diff --git a/common/models/Portfolio.php b/common/models/Portfolio.php index bc6520f..26004f5 100644 --- a/common/models/Portfolio.php +++ b/common/models/Portfolio.php @@ -32,6 +32,8 @@ * @property Comment[] $comment * @property Rating[] $rating * @property string $ratingValue + * @method string minImg( string $dir, $width, $height = NULL ) Resizes image + * @method array ShowGallery( string $array ) Splits string to image paths array */ class Portfolio extends \yii\db\ActiveRecord { @@ -195,6 +197,9 @@ return $this->hasOne(Gallery::className(), [ 'gallery_id' => 'gallery_id' ]); } + /** + * @return ActiveQuery + */ public function getPortfolioUsers() { return $this->hasMany(PortfolioUser::className(), [ 'portfolio_id' => 'portfolio_id' ]) @@ -212,7 +217,9 @@ public function getComments() { return $this->hasMany(Comment::className(), [ 'model_id' => 'portfolio_id' ]) - ->andWhere([ 'comment.model' => $this->className(), 'comment.status' => Comment::STATUS_ACTIVE ]); + ->andWhere([ 'comment.model' => $this->className(), + 'comment.status' => Comment::STATUS_ACTIVE, + ]); } /** diff --git a/common/models/User.php b/common/models/User.php index 8c17b5d..2855c3f 100755 --- a/common/models/User.php +++ b/common/models/User.php @@ -56,6 +56,8 @@ * @property int $ratingPG * @property string $lastVisit * @property string $link + * @method string minImg( string $dir, $width, $height = NULL ) Resizes image + * @method array ShowGallery( string $array ) Splits string to image paths array */ class User extends ActiveRecord implements IdentityInterface, UserRbacInterface { @@ -437,15 +439,15 @@ public function getAddress() { $address = $this->userInfo->city; - if(!empty($this->userInfo->country)) { - $address = $this->userInfo->country.', '.$address; + if(!empty( $this->userInfo->country )) { + $address = $this->userInfo->country . ', ' . $address; } if($this->type == 2) { - if(!empty($this->companyInfo->street)) { - $address .= ', '.$this->companyInfo->street; + if(!empty( $this->companyInfo->street )) { + $address .= ', ' . $this->companyInfo->street; } - if(!empty($this->companyInfo->house)) { - $address .= ', '.$this->companyInfo->house; + if(!empty( $this->companyInfo->house )) { + $address .= ', ' . $this->companyInfo->house; } } return $address; @@ -535,7 +537,10 @@ public function getJobs() { return $this->hasMany(Job::className(), [ 'user_id' => 'id' ]) - ->orderBy([ 'current' => SORT_DESC, 'date_start' => SORT_DESC]); + ->orderBy([ + 'current' => SORT_DESC, + 'date_start' => SORT_DESC, + ]); } /** @@ -613,8 +618,16 @@ */ public function getGalleries() { - $portfolio_galleries = PortfolioGallery::find()->select('gallery_id')->asArray()->where(['user_id' => $this->id])->column(); - return $this->hasMany(Gallery::className(), [ 'user_id' => 'id' ])->andWhere(['not', ['gallery_id' => $portfolio_galleries]]); + $portfolio_galleries = PortfolioGallery::find() + ->select('gallery_id') + ->asArray() + ->where([ 'user_id' => $this->id ]) + ->column(); + return $this->hasMany(Gallery::className(), [ 'user_id' => 'id' ]) + ->andWhere([ + 'not', + [ 'gallery_id' => $portfolio_galleries ], + ]); } /** @@ -654,7 +667,8 @@ ]) ->andWhere([ 'comment.model' => $this->className(), - ])->orderBy(['date_update' => SORT_DESC]); + ]) + ->orderBy([ 'date_update' => SORT_DESC ]); } /** @@ -844,7 +858,7 @@ public function getIsOnline() { - if((time() - \Yii::$app->formatter->asTimestamp($this->userInfo->date_visit)) < 1800) { + if(( time() - \Yii::$app->formatter->asTimestamp($this->userInfo->date_visit) ) < 1800) { return true; } else { return false; diff --git a/common/modules/file/widgets/views/image_sizer.php b/common/modules/file/widgets/views/image_sizer.php index 55e8f3b..a1a4847 100755 --- a/common/modules/file/widgets/views/image_sizer.php +++ b/common/modules/file/widgets/views/image_sizer.php @@ -164,7 +164,7 @@ var img = data.result.view; var block = $("#_img_block"); block.append(img); - var gallery = $("#_picture_link"); + var gallery = $("#"); gallery.val(gallery.val() + data.result.link + ','); } } @@ -174,7 +174,7 @@ { var url = $(this).data('url'); $(this).parent('.gallery_image').remove(); - var gallery = $("#_picture_link"); + var gallery = $("#"); var urls = gallery.val(); gallery.val(urls.replace(url + ',', "")); $.post( diff --git a/frontend/assets/AdminAsset.php b/frontend/assets/AdminAsset.php index de7c658..f99ed73 100755 --- a/frontend/assets/AdminAsset.php +++ b/frontend/assets/AdminAsset.php @@ -21,12 +21,10 @@ class AdminAsset extends AssetBundle 'css/style.css', 'css/art_box.css', '/admin/css/flags32.css', - //'https://fonts.googleapis.com/css?family=Roboto:400,700&subset=cyrillic,latin', ]; public $js = [ 'js/script.js', '/admin/js/option.js', - //'http://maps.google.com/maps/api/js?sensor=false', 'js/markerclusterer.js', 'js/jquery.scrollbox.min.js', 'js/slider.js', diff --git a/frontend/assets/AppAsset.php b/frontend/assets/AppAsset.php index 832b1f5..5679da5 100755 --- a/frontend/assets/AppAsset.php +++ b/frontend/assets/AppAsset.php @@ -30,7 +30,7 @@ public $js = [ '/js/jscroll.js', '/js/script.js', - //'http://maps.google.com/maps/api/js?sensor=false', + 'http://maps.google.com/maps/api/js?sensor=false', '/js/markerclusterer.js', '/js/jquery.scrollbox.min.js', '/js/slider.js', diff --git a/frontend/config/main.php b/frontend/config/main.php index eb1224f..634e383 100755 --- a/frontend/config/main.php +++ b/frontend/config/main.php @@ -79,6 +79,7 @@ return [ 'performer/portfolio///' => 'performer/portfolio-filter', 'performer/portfolio//' => 'performer/portfolio-filter', 'performer/portfolio-view///' => 'performer/portfolio-view', + 'performer/portfolio-view///' => 'performer/portfolio-view', 'performer/portfolio-view//' => 'performer/portfolio-view', 'performer/blog-view///' => 'performer/blog-view', 'performer/blog-view//' => 'performer/blog-view', @@ -86,7 +87,8 @@ return [ 'performer//' => 'performer/', 'company/portfolio///' => 'company/portfolio-filter', 'company/portfolio//' => 'company/portfolio-filter', - 'company/portfolio-view///' => 'company/portfolio-view', + 'company/portfolio-view////' => 'company/portfolio-view', + 'company/portfolio-view///' => 'company/portfolio-view', 'company/portfolio-view//' => 'company/portfolio-view', 'company/blog-view///' => 'company/blog-view', 'company/blog-view//' => 'company/blog-view', diff --git a/frontend/controllers/CompanyController.php b/frontend/controllers/CompanyController.php index c7e0980..3e7fb19 100755 --- a/frontend/controllers/CompanyController.php +++ b/frontend/controllers/CompanyController.php @@ -6,6 +6,8 @@ use common\models\Gallery; use common\models\Portfolio; use common\models\PortfolioSpecialization; + use common\models\PortfolioUser; + use common\models\Specialization; use common\models\Team; use common\models\Vacancy; use common\models\VacancySpecialization; @@ -139,68 +141,95 @@ public function actionPortfolio($company_id, $type = 'implementer') { - $company = User::findOne($company_id); + $company = User::find() + ->where([ + 'id' => $company_id, + ]) + ->joinWith([ + 'portfolios' => function($query) { + $query->indexBy('portfolio_id'); + }, + 'portfolios.specializations', + ]) + ->one(); if(!$company instanceof User) { throw new BadRequestHttpException('Пользователь не найден'); } - $projects = ArrayHelper::getColumn($company->portfolios, 'portfolio_id'); - - $filters = PortfolioSpecialization::find() - ->select([ - "specialization_id", - "COUNT('specialization_id') AS count", - ]) - ->where([ "portfolio_id" => $projects ]) - ->groupBy("specialization_id") - ->all(); - - $portfolio = new ArrayDataProvider([ - 'allModels' => $company->getPortfolios() - ->orderBy('portfolio_id') - ->all(), + + $filters = Specialization::find() + ->select([ + 'count' => 'COUNT(portfolio_specialization.specialization_id)', + 'portfolio_specialization.specialization_id', + 'specialization.specialization_name', + ]) + ->join('INNER JOIN', 'portfolio_specialization', 'specialization.specialization_id = portfolio_specialization.specialization_id') + ->where([ 'portfolio_specialization.portfolio_id' => array_keys($company->portfolios) ]) + ->groupBy([ + 'portfolio_specialization.specialization_id', + 'specialization.specialization_name', + ]) + ->indexBy('specialization_id') + ->asArray() + ->all(); + + $portfolio = new ActiveDataProvider([ + 'query' => $company->getPortfolios(), 'pagination' => [ 'pageSize' => 9, ], + 'sort' => new Sort([ + 'defaultOrder' => [ + 'portfolio_id' => SORT_DESC, + ], + ]), ]); return $this->render('portfolio', [ 'company' => $company, 'filters' => $filters, 'portfolio' => $portfolio, - 'count' => count($company->portfolios), ]); } public function actionPortfolioFilter($company_id, $filter, $type = 'implementer') { - $company = User::findOne($company_id); + $company = User::find() + ->where([ + 'id' => $company_id, + ]) + ->joinWith([ + 'portfolios' => function($query) { + $query->indexBy('portfolio_id'); + }, + 'portfolios.specializations', + ]) + ->one(); if(!$company instanceof User) { throw new BadRequestHttpException('Пользователь не найден'); } - $portfolios = ArrayHelper::getColumn($company->portfolios, 'portfolio_id'); - - $filters = PortfolioSpecialization::find() - ->select([ - "specialization_id", - "COUNT('specialization_id') AS count", - ]) - ->where([ "portfolio_id" => $portfolios ]) - ->groupBy("specialization_id") - ->all(); - - $filter_result = PortfolioSpecialization::find() - ->where([ - 'specialization_id' => $filter, - 'portfolio_id' => $portfolios, - ]) - ->all(); - - $portfolio = new ArrayDataProvider([ - 'allModels' => Portfolio::find() - ->where([ 'portfolio_id' => ArrayHelper::getColumn($filter_result, 'portfolio_id') ]) - ->all(), + + $filters = Specialization::find() + ->select([ + 'count' => 'COUNT(portfolio_specialization.specialization_id)', + 'portfolio_specialization.specialization_id', + 'specialization.specialization_name', + ]) + ->join('INNER JOIN', 'portfolio_specialization', 'specialization.specialization_id = portfolio_specialization.specialization_id') + ->where([ 'portfolio_specialization.portfolio_id' => array_keys($company->portfolios) ]) + ->groupBy([ + 'portfolio_specialization.specialization_id', + 'specialization.specialization_name', + ]) + ->indexBy('specialization_id') + ->asArray() + ->all(); + + $portfolio = new ActiveDataProvider([ + 'query' => $company->getPortfolios() + ->joinWith('specializations') + ->where([ 'portfolio_specialization.specialization_id' => $filter ]), 'pagination' => [ 'pageSize' => 9, ], @@ -211,20 +240,30 @@ 'filters' => $filters, 'portfolio' => $portfolio, 'filter_id' => $filter, - 'count' => count($company->portfolios), ]); } - public function actionPortfolioView($company_id, $portfolio_id, $type = 'implementer') + public function actionPortfolioView($company_id, $portfolio_id, $portfolio_user = NULL, $type = 'implementer') { $user = User::findOne($company_id); $portfolio = $user->getPortfolios() ->where([ 'portfolio_id' => $portfolio_id ]) + ->with('portfolioUsers') + ->with('portfolioUsers.gallery') ->one(); - $portfolio->updateCounters([ 'view_count' => 1 ]); + if(!empty( $portfolio_user )) { + $portfolio_user = PortfolioUser::find() + ->where([ 'portfolio_user_id' => $portfolio_user ]) + ->with('gallery') + ->with('user') + ->one(); + } else { + $portfolio->updateCounters([ 'view_count' => 1 ]); + } return $this->render('portfolio-view', [ - 'user' => $user, - 'portfolio' => $portfolio, + 'user' => $user, + 'portfolio' => $portfolio, + 'portfolio_user' => $portfolio_user, ]); } @@ -407,9 +446,9 @@ $this->layout = 'gallery-company'; return $this->render('gallery', [ - 'company' => $company, - 'gallery' => $gallery, - 'videos' => $videos, + 'company' => $company, + 'gallery' => $gallery, + 'videos' => $videos, ]); } diff --git a/frontend/controllers/PerformerController.php b/frontend/controllers/PerformerController.php index fa3d165..84a76d0 100755 --- a/frontend/controllers/PerformerController.php +++ b/frontend/controllers/PerformerController.php @@ -6,6 +6,7 @@ use common\models\Gallery; use common\models\Portfolio; use common\models\PortfolioSpecialization; + use common\models\PortfolioUser; use Yii; use yii\data\ActiveDataProvider; use yii\data\ArrayDataProvider; @@ -176,16 +177,27 @@ ]); } - public function actionPortfolioView($performer_id, $portfolio_id, $type = 'implementer') + public function actionPortfolioView($performer_id, $portfolio_id, $portfolio_user = NULL, $type = 'implementer') { $user = User::findOne($performer_id); $portfolio = $user->getPortfolios() ->where([ 'portfolio_id' => $portfolio_id ]) + ->with('portfolioUsers') + ->with('portfolioUsers.gallery') ->one(); - $portfolio->updateCounters([ 'view_count' => 1 ]); + if(!empty( $portfolio_user )) { + $portfolio_user = PortfolioUser::find() + ->where([ 'portfolio_user_id' => $portfolio_user ]) + ->with('gallery') + ->with('user') + ->one(); + } else { + $portfolio->updateCounters([ 'view_count' => 1 ]); + } return $this->render('portfolio-view', [ - 'user' => $user, - 'portfolio' => $portfolio, + 'user' => $user, + 'portfolio' => $portfolio, + 'portfolio_user' => $portfolio_user, ]); } @@ -219,21 +231,21 @@ } $blog = new ActiveDataProvider([ - 'query' => $user->getBlog(), + 'query' => $user->getBlog(), 'pagination' => new Pagination([ 'pageSize' => 1, ]), - 'sort' => new Sort([ + 'sort' => new Sort([ 'defaultOrder' => [ 'date_add' => SORT_DESC, - 'name' => SORT_ASC, + 'name' => SORT_ASC, ], ]), ]); return $this->render('blog-list', [ - 'user' => $user, - 'blog' => $blog, + 'user' => $user, + 'blog' => $blog, ]); } @@ -297,7 +309,7 @@ } $gallery = new ActiveDataProvider([ - 'query' =>$user->getGalleries(), + 'query' => $user->getGalleries(), 'pagination' => [ 'pageSize' => 5, ], @@ -308,9 +320,9 @@ $this->layout = 'gallery'; return $this->render('gallery', [ - 'user' => $user, - 'gallery' => $gallery, - 'videos' => $videos, + 'user' => $user, + 'gallery' => $gallery, + 'videos' => $videos, ]); } @@ -319,13 +331,13 @@ if(!empty( \Yii::$app->request->get('type') )) { $action->controller->view->params[ 'type' ] = \Yii::$app->request->get('type'); } - if(!empty(\Yii::$app->request->get('performer_id'))) { + if(!empty( \Yii::$app->request->get('performer_id') )) { $user = User::findOne(\Yii::$app->request->get('performer_id')); - if(!empty($user) && $user->type == 2) { + if(!empty( $user ) && $user->type == 2) { $queryParams = \Yii::$app->request->queryParams; - unset($queryParams['performer_id']); - $queryParams['company_id'] = $user->id; - return $this->redirect(array_merge(['company/'.$action->id], $queryParams)); + unset( $queryParams[ 'performer_id' ] ); + $queryParams[ 'company_id' ] = $user->id; + return $this->redirect(array_merge([ 'company/' . $action->id ], $queryParams)); } } return parent::beforeAction($action); diff --git a/frontend/messages/ru/app.php b/frontend/messages/ru/app.php index 416d162..d536bff 100644 --- a/frontend/messages/ru/app.php +++ b/frontend/messages/ru/app.php @@ -179,4 +179,5 @@ 'Feedback answer' => 'Вопрос', 'Feedback file' => 'Файл', 'Feedback date add' => 'Дата обращения', + 'Projects' => 'Проекты', ]; \ No newline at end of file diff --git a/frontend/views/company/_portfolio_list_view.php b/frontend/views/company/_portfolio_list_view.php index 87cd8bc..8893157 100644 --- a/frontend/views/company/_portfolio_list_view.php +++ b/frontend/views/company/_portfolio_list_view.php @@ -4,7 +4,6 @@ */ use yii\helpers\ArrayHelper; use yii\helpers\Html; - use yii\helpers\StringHelper; use yii\helpers\Url; use yii\web\View; @@ -36,21 +35,21 @@
-
127
+
view_count?>
-
10.0
+
ratingValue)) { echo $model->ratingValue; } else { echo 'Нет'; } ?>
-
14
+
comments)?>
specializations, 'specialization_name')) ?>
diff --git a/frontend/views/company/portfolio-view.php b/frontend/views/company/portfolio-view.php index 45545a8..c16a0e8 100644 --- a/frontend/views/company/portfolio-view.php +++ b/frontend/views/company/portfolio-view.php @@ -1,22 +1,48 @@ params[ 'company' ] = $user; $this->title = 'My Yii Application'; + $rating = $portfolio->getRatingValue(); + if(!empty( $portfolio_user )) { + $portfolio_user_gallery = $portfolio->ShowGallery($portfolio_user->gallery->photo); + } ?>
+ $user->id, + 'portfolio_id' => $portfolio->portfolio_id, + ]); + } + ?>
- minImg($portfolio->cover, '720', '280')) ?> + minImg(ArrayHelper::getValue($portfolio_user_gallery, 0, ''), '720', '280')); + } else { + echo Html::img($portfolio->minImg($portfolio->cover, '720', '280')); + } + ?>
@@ -33,41 +59,64 @@
-
XX.X
+
-
XX
+
comments) ?>
-
- - - - -
+ 'rating_portfolio', + 'value' => $rating, + 'pluginOptions' => [ + 'displayOnly' => true, + 'size' => 'xxs', + ], + ]); + ?>
name ?>
gallery ) || !empty( $portfolio->gallery->photo )) { + if(!empty( $portfolio_user_gallery )) { + ?> +
+
+
+
    + +
  • + +
+
+
+ + +
+
+
+ gallery ) || !empty( $portfolio->gallery->photo ) )) { ?>
    gallery->photo) as $one_photo) { - if(empty( $one_photo )) { - continue; - } + foreach($portfolio->ShowGallery($portfolio->gallery->photo) as $one_photo) { ?>
- - - -
-
- preview ?> -
description )) { - ?> -
Развернуть
- portfolioGallery ) && !empty( $portfolio_user->portfolioGallery->caption )) { + echo Html::tag('div', $portfolio_user->portfolioGallery->caption, [ 'class' => 'new-portfolio-editor' ]); + } else { + echo Html::tag('div', $portfolio->preview, [ 'class' => 'new-portfolio-editor' ]); + if(!empty( $portfolio->description )) { + ?> +
Развернуть
+
description )) { + if(empty( $portfolio_user ) && !empty( $portfolio->description )) { ?>
@@ -136,6 +163,34 @@ } ?>
+ portfolioUsers )) { + ?> +
+

Участники проекта:

+ portfolioUsers as $portfolioUser) { + $gallery = $portfolio->ShowGallery($portfolioUser->gallery->photo); + ?> + +
+

minImg(ArrayHelper::getValue($gallery, 0, ''), 'original'), [ 'class' => 'portfolio_user_image' ]) ?>

+
user->name . ': ' . $portfolioUser->portfolioGallery->caption ?>
+
+
+ +
+ - - -
-
Комментарии: 3
-
- -
-
- - -
-
- - - -
-
- - -
-
- -
-
- -
- -
-
-
-
- -
-
- -
-
- - - - -
-
- -
- -
-

Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-

Евровагонка — удобная в монтаже фасонная доска, которая позволяет создать обшивку из плотно пригнанных элементов с качественно обработанной поверхностью. Толщина евровагонки составляет 125 мм, общая ширина (с гребнем) 960 мм, рабочая ширина 880 мм.Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-
- -
-
-
- -
-
-
- -
-
- -
-
- - - - -
-
- -
- -
-

Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-

Евровагонка — удобная в монтаже фасонная доска, которая позволяет создать обшивку из плотно пригнанных элементов с качественно обработанной поверхностью. Толщина евровагонки составляет 125 мм, общая ширина (с гребнем) 960 мм, рабочая ширина 880 мм.Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-
- -
-
-
- -
-
-
- -
-
- -
-
- - - - -
-
- -
- -
-

Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-

Евровагонка — удобная в монтаже фасонная доска, которая позволяет создать обшивку из плотно пригнанных элементов с качественно обработанной поверхностью. Толщина евровагонки составляет 125 мм, общая ширина (с гребнем) 960 мм, рабочая ширина 880 мм.Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-
- -
-
-
- -
-
-
- -
-
- -
-
- - - - -
-
- -
- -
-

Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-

Евровагонка — удобная в монтаже фасонная доска, которая позволяет создать обшивку из плотно пригнанных элементов с качественно обработанной поверхностью. Толщина евровагонки составляет 125 мм, общая ширина (с гребнем) 960 мм, рабочая ширина 880 мм.Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-
- -
-
-
-
-
-
- -
-
- -
-
- - - - -
-
- -
- -
-

Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-

Евровагонка — удобная в монтаже фасонная доска, которая позволяет создать обшивку из плотно пригнанных элементов с качественно обработанной поверхностью. Толщина евровагонки составляет 125 мм, общая ширина (с гребнем) 960 мм, рабочая ширина 880 мм.Балкон, обшитый вагонкой, выглядит аккуратно, стильно и уютно. Монтаж обшивки вполне возможно выполнить своими силами — достаточно иметь в распоряжении необходимые инструменты и владеть базовыми навыками строительно-ремонтных работ.

-
- -
-
-
- -
-
- */ - ?>
- -