Commit c67585d715a91088d20849bd76fa8cea36e4ee37
1 parent
51819516
Category path fixes
Showing
8 changed files
with
264 additions
and
20 deletions
Show diff stats
common/modules/product/models/Category.php
| ... | ... | @@ -14,9 +14,7 @@ |
| 14 | 14 | |
| 15 | 15 | /** |
| 16 | 16 | * This is the model class for table "category". |
| 17 | - * | |
| 18 | 17 | * @todo Write doc for ArtboxTreeBehavior |
| 19 | - * | |
| 20 | 18 | * @property integer $category_id |
| 21 | 19 | * @property integer $remote_id |
| 22 | 20 | * @property integer $parent_id |
| ... | ... | @@ -24,6 +22,7 @@ |
| 24 | 22 | * @property integer $depth |
| 25 | 23 | * @property string $image |
| 26 | 24 | * @property integer $product_unit_id |
| 25 | + * @property Brand[] $activeBrands | |
| 27 | 26 | * * From language behavior * |
| 28 | 27 | * @property CategoryLang $lang |
| 29 | 28 | * @property CategoryLang[] $langs |
| ... | ... | @@ -155,7 +154,16 @@ |
| 155 | 154 | ->select('brand.*') |
| 156 | 155 | ->joinWith('brand') |
| 157 | 156 | ->groupBy('brand.brand_id'); |
| 158 | - | |
| 157 | + } | |
| 158 | + | |
| 159 | + /** | |
| 160 | + * Improved getBrands() | |
| 161 | + * @return ActiveQuery | |
| 162 | + */ | |
| 163 | + public function getActiveBrands() | |
| 164 | + { | |
| 165 | + return $this->hasMany(Brand::className(), [ 'brand_id' => 'brand_id' ]) | |
| 166 | + ->via('products'); | |
| 159 | 167 | } |
| 160 | 168 | |
| 161 | 169 | public function getTaxGroupsByLevel($level) | ... | ... |
common/translation/ru/app.php
common/translation/ua/app.php
frontend/controllers/FilterController.php
| ... | ... | @@ -6,6 +6,7 @@ |
| 6 | 6 | use common\modules\product\models\Category; |
| 7 | 7 | use common\modules\product\models\ProductSearch; |
| 8 | 8 | use common\modules\rubrication\models\TaxOption; |
| 9 | + use yii\db\ActiveQuery; | |
| 9 | 10 | use yii\web\Controller; |
| 10 | 11 | use yii\web\NotFoundHttpException; |
| 11 | 12 | |
| ... | ... | @@ -38,11 +39,13 @@ |
| 38 | 39 | |
| 39 | 40 | /** |
| 40 | 41 | * Filter by type. |
| 42 | + * | |
| 41 | 43 | * @return string |
| 42 | 44 | */ |
| 43 | 45 | public function actionCategory($id) |
| 44 | 46 | { |
| 45 | 47 | $category = $this->findCategory($id); |
| 48 | + $brandsAll = $category->activeBrands; | |
| 46 | 49 | $purposes = TaxOption::find() |
| 47 | 50 | ->joinWith('lang', true, 'INNER JOIN') |
| 48 | 51 | ->joinWith([ |
| ... | ... | @@ -80,14 +83,16 @@ |
| 80 | 83 | } |
| 81 | 84 | } |
| 82 | 85 | return $this->render('category', [ |
| 83 | - 'category' => $category, | |
| 84 | - 'purposes' => $purposes, | |
| 85 | - 'brands' => $brands, | |
| 86 | + 'category' => $category, | |
| 87 | + 'purposes' => $purposes, | |
| 88 | + 'brands' => $brands, | |
| 89 | + 'brandsAll' => $brandsAll, | |
| 86 | 90 | ]); |
| 87 | 91 | } |
| 88 | 92 | |
| 89 | 93 | /** |
| 90 | 94 | * Filter by purpose. |
| 95 | + * | |
| 91 | 96 | * @return string |
| 92 | 97 | */ |
| 93 | 98 | public function actionPurpose($id) |
| ... | ... | @@ -136,6 +141,9 @@ |
| 136 | 141 | $searchModel = new ProductSearch(); |
| 137 | 142 | $dataProvider = $searchModel->search(\Yii::$app->request->queryParams); |
| 138 | 143 | $dataProvider->pagination = false; |
| 144 | + /** | |
| 145 | + * @var ActiveQuery $query | |
| 146 | + */ | |
| 139 | 147 | $query = $dataProvider->query; |
| 140 | 148 | $query->with('variants.lang') |
| 141 | 149 | ->joinWith('brand.lang') |
| ... | ... | @@ -155,6 +163,42 @@ |
| 155 | 163 | ]); |
| 156 | 164 | } |
| 157 | 165 | |
| 166 | + public function actionCategoryBrand($category_id, $brand_id) | |
| 167 | + { | |
| 168 | + $category = $this->findCategory($category_id); | |
| 169 | + $brand = $this->findBrand($brand_id); | |
| 170 | + $searchModel = new ProductSearch(); | |
| 171 | + $dataProvider = $searchModel->search(\Yii::$app->request->queryParams); | |
| 172 | + $dataProvider->pagination = false; | |
| 173 | + /** | |
| 174 | + * @var ActiveQuery $query | |
| 175 | + */ | |
| 176 | + $query = $dataProvider->query; | |
| 177 | + $query->with('variants.lang') | |
| 178 | + ->joinWith('brand.lang') | |
| 179 | + ->joinWith('categories.lang') | |
| 180 | + ->andWhere([ | |
| 181 | + 'category.category_id' => $category->category_id, | |
| 182 | + 'brand.brand_id' => $brand->brand_id, | |
| 183 | + ]); | |
| 184 | + return $this->render('category-brand', [ | |
| 185 | + 'category' => $category, | |
| 186 | + 'brand' => $brand, | |
| 187 | + 'searchModel' => $searchModel, | |
| 188 | + 'dataProvider' => $dataProvider, | |
| 189 | + ]); | |
| 190 | + } | |
| 191 | + | |
| 192 | + public function actionCategoryBrands($category_id) | |
| 193 | + { | |
| 194 | + $category = $this->findCategory($category_id); | |
| 195 | + $brands = $category->activeBrands; | |
| 196 | + return $this->render('category-brands', [ | |
| 197 | + 'category' => $category, | |
| 198 | + 'brands' => $brands, | |
| 199 | + ]); | |
| 200 | + } | |
| 201 | + | |
| 158 | 202 | /** |
| 159 | 203 | * @param $id |
| 160 | 204 | * | ... | ... |
| 1 | +<?php | |
| 2 | + /** | |
| 3 | + * @var View $this | |
| 4 | + * @var Category $category | |
| 5 | + * @var TaxOption $purpose | |
| 6 | + * @var Brand $brand | |
| 7 | + * @var ProductSearch $searchModel | |
| 8 | + * @var ActiveDataProvider $dataProvider | |
| 9 | + */ | |
| 10 | + use common\components\artboximage\ArtboxImageHelper; | |
| 11 | + use common\modules\product\models\Brand; | |
| 12 | + use common\modules\product\models\Category; | |
| 13 | + use common\modules\product\models\ProductSearch; | |
| 14 | + use common\modules\rubrication\models\TaxOption; | |
| 15 | + use yii\data\ActiveDataProvider; | |
| 16 | + use yii\web\View; | |
| 17 | + use yii\widgets\ListView; | |
| 18 | + | |
| 19 | + $this->title = $category->lang->name . ' ' . $brand->lang->name . ' ' . mb_strtolower($purpose->lang->value); | |
| 20 | + $this->params[ 'breadcrumbs' ][] = [ | |
| 21 | + 'label' => $category->lang->name, | |
| 22 | + 'url' => [ | |
| 23 | + 'filter/category', | |
| 24 | + 'id' => $category->category_id, | |
| 25 | + ], | |
| 26 | + ]; | |
| 27 | + $this->params[ 'breadcrumbs' ][] = [ | |
| 28 | + 'label' => $purpose->lang->value, | |
| 29 | + 'url' => [ | |
| 30 | + 'filter/purpose', | |
| 31 | + 'id' => $purpose->tax_option_id, | |
| 32 | + ], | |
| 33 | + ]; | |
| 34 | + $this->params[ 'breadcrumbs' ][] = [ | |
| 35 | + 'label' => $category->lang->name . ' ' . mb_strtolower($purpose->lang->value), | |
| 36 | + 'url' => [ | |
| 37 | + 'filter/index', | |
| 38 | + 'category_id' => $category->category_id, | |
| 39 | + 'purpose_id' => $purpose->tax_option_id, | |
| 40 | + ], | |
| 41 | + ]; | |
| 42 | + $this->params[ 'breadcrumbs' ][] = $this->title; | |
| 43 | +?> | |
| 44 | +<div class="section-box box-title-1 uppercase"><?= $this->title ?></div> | |
| 45 | +<div class="section-box box-brand margin_bottom_30"> | |
| 46 | + <div class="row"> | |
| 47 | + <div class="style" style="position: relative"> | |
| 48 | + <div class="col-xs-12 col-sm-6 col-md-6"> | |
| 49 | + <div class="style article-img"> | |
| 50 | + <?php | |
| 51 | + echo ArtboxImageHelper::getImage($category->getImageUrl(), 'article_list'); | |
| 52 | + ?> | |
| 53 | + </div> | |
| 54 | + </div> | |
| 55 | + <div class="col-xs-12 col-sm-6 col-md-6" style="position: relative;z-index: 2"> | |
| 56 | + <div class="style brand-main-txt"> | |
| 57 | + <?php | |
| 58 | + echo $brand->lang->seo_text; | |
| 59 | + ?> | |
| 60 | + </div> | |
| 61 | + </div> | |
| 62 | + <div class="brand-txt-img"> | |
| 63 | + <?php | |
| 64 | + echo ArtboxImageHelper::getImage($brand->getImageUrl(), 'brand_image_filter'); | |
| 65 | + ?> | |
| 66 | + </div> | |
| 67 | + </div> | |
| 68 | + <?php | |
| 69 | + echo ListView::widget([ | |
| 70 | + 'dataProvider' => $dataProvider, | |
| 71 | + 'itemView' => '_brand_item', | |
| 72 | + 'itemOptions' => [ | |
| 73 | + 'class' => 'brands-list_', | |
| 74 | + ], | |
| 75 | + 'options' => [ | |
| 76 | + 'class' => 'style brands-list-wr', | |
| 77 | + ], | |
| 78 | + 'layout' => '{items}', | |
| 79 | + ]); | |
| 80 | + ?> | |
| 81 | + </div> | |
| 82 | +</div> | |
| 0 | 83 | \ No newline at end of file | ... | ... |
| 1 | +<?php | |
| 2 | + /** | |
| 3 | + * @var $this yii\web\View | |
| 4 | + * @var Category $category | |
| 5 | + * @var Brand[] $brands | |
| 6 | + */ | |
| 7 | + use common\components\artboximage\ArtboxImageHelper; | |
| 8 | + use common\modules\product\models\Brand; | |
| 9 | + use common\modules\product\models\Category; | |
| 10 | + use yii\helpers\Html; | |
| 11 | + | |
| 12 | + $this->title = \Yii::t('product', 'Brands').' '.$category->lang->name; | |
| 13 | + $this->params[ 'breadcrumbs' ][] = [ | |
| 14 | + 'label' => $category->lang->name, | |
| 15 | + 'url' => [ | |
| 16 | + 'filter/category', | |
| 17 | + 'id' => $category->category_id, | |
| 18 | + ], | |
| 19 | + ]; | |
| 20 | + $this->params[ 'breadcrumbs' ][] = $this->title; | |
| 21 | +?> | |
| 22 | +<div class="section-box box-title-1 uppercase"><?= $this->title; ?></div> | |
| 23 | +<div class="section-box box-brand margin_bottom_30"> | |
| 24 | + <div class="row"> | |
| 25 | + <div class="col-xs-12 col-sm-9 col-md-7 col-lg-7"> | |
| 26 | + <div class="style article-img"> | |
| 27 | + <?php | |
| 28 | + echo ArtboxImageHelper::getImage($category->getImageUrl(), 'full_filter'); | |
| 29 | + ?> | |
| 30 | + </div> | |
| 31 | + <div class="style content-txt"> | |
| 32 | + <?php | |
| 33 | + echo $category->lang->seo_text; | |
| 34 | + ?> | |
| 35 | + </div> | |
| 36 | + </div> | |
| 37 | + <div class="col-xs-12 col-sm-1 col-md-1 col-lg-1 hidden-sm hidden-xs"></div> | |
| 38 | + <div class="col-xs-12 col-sm-3 col-md-3 col-lg-2"> | |
| 39 | + <div class="brand-link"> | |
| 40 | + <?php | |
| 41 | + foreach($brands as $brand) { | |
| 42 | + echo Html::a(ArtboxImageHelper::getImage($brand->getImageUrl(), 'brand_image_filter'), [ | |
| 43 | + 'filter/category-brand', | |
| 44 | + 'category_id' => $category->category_id, | |
| 45 | + 'brand_id' => $brand->brand_id, | |
| 46 | + ]); | |
| 47 | + } | |
| 48 | + ?> | |
| 49 | + </div> | |
| 50 | + </div> | |
| 51 | + </div> | |
| 52 | +</div> | |
| 0 | 53 | \ No newline at end of file | ... | ... |
frontend/views/filter/category.php
| 1 | 1 | <?php |
| 2 | + | |
| 3 | + use common\components\artboximage\ArtboxImageHelper; | |
| 4 | + use common\modules\product\models\Brand; | |
| 5 | + use common\modules\product\models\Category; | |
| 6 | + use common\modules\rubrication\models\TaxOption; | |
| 7 | + use yii\helpers\Html; | |
| 8 | + | |
| 2 | 9 | /** |
| 3 | 10 | * @var $this yii\web\View |
| 4 | 11 | * @var Category $category |
| 5 | 12 | * @var TaxOption[] $purposes |
| 6 | 13 | * @var array $brands |
| 14 | + * @var Brand[] $brandsAll | |
| 7 | 15 | */ |
| 8 | - use common\components\artboximage\ArtboxImageHelper; | |
| 9 | - use common\modules\product\models\Brand; | |
| 10 | - use common\modules\product\models\Category; | |
| 11 | - use common\modules\rubrication\models\TaxOption; | |
| 12 | - use yii\helpers\Html; | |
| 13 | 16 | |
| 14 | 17 | $this->title = $category->lang->name; |
| 15 | 18 | $this->params[ 'breadcrumbs' ][] = $this->title; |
| ... | ... | @@ -18,6 +21,53 @@ |
| 18 | 21 | <div class="section-box box-category margin_bottom_30"> |
| 19 | 22 | <div class="row"> |
| 20 | 23 | <?php |
| 24 | + if(!empty( $brandsAll )) { | |
| 25 | + ?> | |
| 26 | + <div class="cat-list-wr col-xs-12 col-sm-4 col-md-4 col-lg-3"> | |
| 27 | + <div class="cat-list"> | |
| 28 | + <?php | |
| 29 | + echo Html::a(Html::tag('p', \Yii::t('app', 'All-list ').$category->lang->name), [ | |
| 30 | + 'filter/category-brands', | |
| 31 | + 'category_id' => $category->category_id, | |
| 32 | + ], [ | |
| 33 | + 'class' => 'link-cat', | |
| 34 | + 'style' => 'background-image: url("' . ArtboxImageHelper::getImageSrc($category->getImageUrl(), 'filter_image') . '")', | |
| 35 | + ]); | |
| 36 | + ?> | |
| 37 | + <div class="cat-list-brands-wr"> | |
| 38 | + <div class="cat-list-brands"> | |
| 39 | + <ul> | |
| 40 | + <?php | |
| 41 | + foreach($brandsAll as $brand) { | |
| 42 | + /** | |
| 43 | + * @var Brand $brand | |
| 44 | + */ | |
| 45 | + echo Html::tag('li', Html::a($brand->lang->name, [ | |
| 46 | + 'filter/category-brand', | |
| 47 | + 'category_id' => $category->category_id, | |
| 48 | + 'brand_id' => $brand->brand_id, | |
| 49 | + ])); | |
| 50 | + } | |
| 51 | + ?> | |
| 52 | + </ul> | |
| 53 | + <?php | |
| 54 | + if(count($brandsAll) > 5) { | |
| 55 | + ?> | |
| 56 | + <div class="expand_brands"> | |
| 57 | + <p><?php echo \Yii::t('app', 'развернуть'); ?></p></div> | |
| 58 | + <?php | |
| 59 | + } | |
| 60 | + ?> | |
| 61 | + <!--если список больше 5 то выводим блок .expand_brands--> | |
| 62 | + <!--------------------------------------------------------> | |
| 63 | + </div> | |
| 64 | + </div> | |
| 65 | + </div> | |
| 66 | + </div> | |
| 67 | + <?php | |
| 68 | + } | |
| 69 | + ?> | |
| 70 | + <?php | |
| 21 | 71 | foreach($purposes as $purpose) { |
| 22 | 72 | ?> |
| 23 | 73 | <div class="cat-list-wr col-xs-12 col-sm-4 col-md-4 col-lg-3"> | ... | ... |
frontend/views/layouts/main.php
| ... | ... | @@ -7,7 +7,7 @@ |
| 7 | 7 | |
| 8 | 8 | use common\models\Page; |
| 9 | 9 | use common\modules\language\models\Language; |
| 10 | - use common\modules\product\models\Category; | |
| 10 | + use common\modules\rubrication\models\TaxGroup; | |
| 11 | 11 | use yii\helpers\Html; |
| 12 | 12 | use frontend\assets\AppAsset; |
| 13 | 13 | use yii\widgets\ActiveForm; |
| ... | ... | @@ -37,17 +37,23 @@ |
| 37 | 37 | ], |
| 38 | 38 | ]; |
| 39 | 39 | } |
| 40 | - $categories = Category::find() | |
| 41 | - ->joinWith('lang', true, 'INNER JOIN') | |
| 42 | - ->where([ 'depth' => 0 ]) | |
| 43 | - ->all(); | |
| 40 | + /** | |
| 41 | + * @var TaxGroup $purposes | |
| 42 | + */ | |
| 43 | + $purposes = TaxGroup::find() | |
| 44 | + ->where([ | |
| 45 | + 'tax_group.tax_group_id' => 5, | |
| 46 | + 'level' => 0, | |
| 47 | + ]) | |
| 48 | + ->joinWith('options.lang') | |
| 49 | + ->one(); | |
| 44 | 50 | $submenu_items = []; |
| 45 | - foreach($categories as $category) { | |
| 51 | + foreach($purposes->options as $option) { | |
| 46 | 52 | $submenu_items[] = [ |
| 47 | - 'label' => $category->lang->name, | |
| 53 | + 'label' => $option->lang->value, | |
| 48 | 54 | 'url' => [ |
| 49 | - 'filter/category', | |
| 50 | - 'id' => $category->category_id, | |
| 55 | + 'filter/purpose', | |
| 56 | + 'id' => $option->tax_option_id, | |
| 51 | 57 | ], |
| 52 | 58 | ]; |
| 53 | 59 | } | ... | ... |