app()->getProductsMenu($this->app()->getCurrentCityId()); $vars = [ 'menu' => $mainMenu ]; $this->getLayout()->setTitle('Каталог товаров Розетка39: продаем всё, что втыкается в розетку'); $this->getLayout()->addMetaKeywords('каталог, товары, розетка39, розетка, 39'); $this->getLayout()->addMetaDescription('Весь каталог товаров Розетка39 на одной странице'); $this->getLayout()->addBodyClass('catalogue'); $this->getLayout()->addBodyClass('narrow-top-banner'); $this->getLayout()->addBodyClass('inner'); if ($this->core()->isDev()) { $rnd = mt_rand(1000, 10000000000); $this->getLayout()->addCssFile('catalogue.css?rnd=' . $rnd, 'css'); $this->getLayout()->addJsFile('catalogue.js?rnd=' . $rnd, 'js'); } else { $this->getLayout()->clearCssFiles()->addCssFile($this->getLayout()->bundles()->get('catalog.min.css')); $this->getLayout()->clearJsFiles()->addJsFile($this->getLayout()->bundles()->get('catalog.min.js')); } return $this->outputVars($vars); } /** * First depth category */ public function categoryDepth1Action() { $id = $this->params('id'); $category = $this->catalog()->categories()->getCategoryById($id, $this->app()->getProductsMenuSiteId()); if (!$category) { return $this->redirect()->toUrl('/catalog/'); } $mainMenu = $this->app()->getProductsMenu($this->app()->getCurrentCityId()); $vars = [ 'menu' => $mainMenu ]; $vars['category'] = $category; // Товары со скидкой $discountProducts = $this->getDiscountProducts( [ 'siteCategoryId' => $category->getId(), 'limit' => 8, 'maxTallwides' => 2, 'maxActions' => 0, 'positions' => [ 'tallwide' => [ 1, 5 ] ] ]); $vars['discountProducts'] = $discountProducts; // meta $metaParams = [ 'category_name' => $category->getName() ]; $title = 'купить {category_name} в калининграде дешево в интернет магазине розетка39'; $description = 'купить {category_name} в калининграде дешево в интернет магазине розетка39'; $keywords = '{category_name}, купить, калининград, дешево, интернет, магазин, розетка39, розетка'; $this->getLayout()->setTitle(StringUtils::format($title, $metaParams)); $this->getLayout()->addMetaDescription(StringUtils::format($description, $metaParams)); $this->getLayout()->addMetaKeywords(StringUtils::format($keywords, $metaParams)); // meta: seo text $firstSubcategories = []; $otherSubcategories = []; foreach ($mainMenu[$category->getId()] as $subitem) { if (3 > count($firstSubcategories)) { $firstSubcategories[] = '' . StringUtils::lcfirstRus($subitem->getName()) . ''; } else { $otherSubcategories[] = '' . StringUtils::lcfirstRus($subitem->getName()) . ''; } } $metaParams['first_subcategories'] = implode(', ', $firstSubcategories); $metaParams['other_subcategories'] = implode(', ', $otherSubcategories); $sameLevelCategories = []; $menuCategory = $mainMenu[$category->getId()]; if (0 < $menuCategory->getLevel()) { foreach ($menuCategory->getParent() as $sameLevelCategory) { $sameLevelCategories[] = $sameLevelCategory; } } else { foreach ($mainMenu as $sameLevelCategory) { $sameLevelCategories[] = $sameLevelCategory; } } $randomSameLevelCategory = $sameLevelCategories[mt_rand(0, count($sameLevelCategories) - 1)]; $metaParams['random_same_level_category_name'] = $randomSameLevelCategory->getName(); $randomSameLevelSubcategories = []; foreach ($randomSameLevelCategory as $sameLevelSubcategory) { if (4 > count($randomSameLevelSubcategories)) { $randomSameLevelSubcategories[] = '' . StringUtils::lcfirstRus($sameLevelSubcategory->getName()) . ''; } } $metaParams['random_same_level_categoory_subategories'] = implode(', ', $randomSameLevelSubcategories); $otherRandomSameLevelCategory = null; if (1 < $menuCategory->countItems()) { while (null === $otherRandomSameLevelCategory) { $rndCategory = $sameLevelCategories[mt_rand(0, count($sameLevelCategories) - 1)]; if ($rndCategory->getId() != $randomSameLevelCategory->getId()) { $otherRandomSameLevelCategory = $rndCategory; } } } if (null !== $otherRandomSameLevelCategory) { $metaParams['other_same_level_category_name'] = StringUtils::lcfirstRus($otherRandomSameLevelCategory->getName()); $metaParams['other_same_level_category'] = '' . StringUtils::lcfirstRus($otherRandomSameLevelCategory->getName()) . ''; } $seoText = 'Купить {category_name} в калининграде дешево — это к нам! Розетка39 продает {category_name} с существенными скидками: {first_subcategories} — и это далеко не весь ассортимент {category_name}, что можно купить в калининграде в интернет-магазине розетка39.

Кроме {category_name}, вы можете купить {random_same_level_category_name}: {random_same_level_categoory_subategories} и {other_same_level_category} — все это доступно за наличный расчет и по картам.

А еще у нас можно купить {category_name} в кредит, мы сотрудничаем со множеством банков и предоставляем нашим покупателям выгодные условия на покупку {category_name} в рассрочку и кредит.

'; if (0 < count($otherSubcategories)) { $seoText .= 'Не обошли вниманием и {other_subcategories}.

'; } $seoText .= 'Купить {category_name} с доставкой по калининграду и калининградской области.

Розетка39: продаем всё, что втыкается в розетку!'; $seoText = StringUtils::format($seoText, $metaParams); $vars['seoText'] = $seoText; // END meta: seo text // END meta $this->getLayout()->addBodyClass('catalogue'); $this->getLayout()->addBodyClass('-root'); $this->getLayout()->addBodyClass('inner'); $this->getLayout()->addBodyClass('short-header'); if ($this->core()->isDev()) { $rnd = mt_rand(1000, 10000000000); $this->getLayout()->addCssFile('catalogue.css?rnd=' . $rnd, 'css'); $this->getLayout()->addJsFile('catalogue.js?rnd=' . $rnd, 'js'); } else { $this->getLayout()->clearCssFiles()->addCssFile($this->getLayout()->bundles()->get('catalog.min.css')); $this->getLayout()->clearJsFiles()->addJsFile($this->getLayout()->bundles()->get('catalog.min.js')); } $this->getLayout()->setTemplate('application/catalog/catalog-depth1.tpl'); return $this->outputVars($vars); } /** * Seconda depth category */ public function categoryDepth2Action() { $id = $this->params('id'); $category = $this->catalog()->categories()->getCategoryById($id, $this->app()->getProductsMenuSiteId()); if (!$category) { return $this->redirect()->toUrl('/catalog/'); } $mainMenu = $this->app()->getProductsMenu($this->app()->getCurrentCityId()); $vars = [ 'menu' => $mainMenu ]; $vars['category'] = $category; // Товары со скидкой $discountProducts = $this->getDiscountProducts( [ 'siteCategoryId' => $category->getId(), 'limit' => 8, 'maxTallwides' => 2, 'maxActions' => 0, 'positions' => [ 'tallwide' => [ 1, 5 ] ] ]); $vars['discountProducts'] = $discountProducts; // meta $metaParams = [ 'category_name' => $category->getName() ]; $title = 'купить {category_name} в калининграде дешево в интернет магазине розетка39'; $description = 'купить {category_name} в калининграде дешево в интернет магазине розетка39'; $keywords = '{category_name}, купить, калининград, дешево, интернет, магазин, розетка39, розетка'; $this->getLayout()->setTitle(StringUtils::format($title, $metaParams)); $this->getLayout()->addMetaDescription(StringUtils::format($description, $metaParams)); $this->getLayout()->addMetaKeywords(StringUtils::format($keywords, $metaParams)); // meta: seo text $firstSubcategories = []; $otherSubcategories = []; foreach ($mainMenu[$category->getId()] as $subitem) { if (3 > count($firstSubcategories)) { $firstSubcategories[] = '' . StringUtils::lcfirstRus($subitem->getName()) . ''; } else { $otherSubcategories[] = '' . StringUtils::lcfirstRus($subitem->getName()) . ''; } } $metaParams['first_subcategories'] = implode(', ', $firstSubcategories); $metaParams['other_subcategories'] = implode(', ', $otherSubcategories); $sameLevelCategories = []; $menuCategory = $mainMenu[$category->getId()]; if (0 < $menuCategory->getLevel()) { foreach ($menuCategory->getParent() as $sameLevelCategory) { $sameLevelCategories[] = $sameLevelCategory; } } else { foreach ($mainMenu as $sameLevelCategory) { $sameLevelCategories[] = $sameLevelCategory; } } $randomSameLevelCategory = $sameLevelCategories[mt_rand(0, count($sameLevelCategories) - 1)]; $metaParams['random_same_level_category_name'] = $randomSameLevelCategory->getName(); $randomSameLevelSubcategories = []; foreach ($randomSameLevelCategory as $sameLevelSubcategory) { if (4 > count($randomSameLevelSubcategories)) { $randomSameLevelSubcategories[] = '' . StringUtils::lcfirstRus($sameLevelSubcategory->getName()) . ''; } } $metaParams['random_same_level_categoory_subategories'] = implode(', ', $randomSameLevelSubcategories); $otherRandomSameLevelCategory = null; if (1 < $menuCategory->countItems()) { while (null === $otherRandomSameLevelCategory) { $rndCategory = $sameLevelCategories[mt_rand(0, count($sameLevelCategories) - 1)]; if ($rndCategory->getId() != $randomSameLevelCategory->getId()) { $otherRandomSameLevelCategory = $rndCategory; } } } if (null !== $otherRandomSameLevelCategory) { $metaParams['other_same_level_category_name'] = StringUtils::lcfirstRus($otherRandomSameLevelCategory->getName()); $metaParams['other_same_level_category'] = '' . StringUtils::lcfirstRus($otherRandomSameLevelCategory->getName()) . ''; } $seoText = 'Купить {category_name} в калининграде дешево — это к нам! Розетка39 продает {category_name} с существенными скидками: {first_subcategories} — и это далеко не весь ассортимент {category_name}, что можно купить в калининграде в интернет-магазине розетка39.

Кроме {category_name}, вы можете купить {random_same_level_category_name}: {random_same_level_categoory_subategories} и {other_same_level_category} — все это доступно за наличный расчет и по картам.

А еще у нас можно купить {category_name} в кредит, мы сотрудничаем со множеством банков и предоставляем нашим покупателям выгодные условия на покупку {category_name} в рассрочку и кредит.

'; if (0 < count($otherSubcategories)) { $seoText .= 'Не обошли вниманием и {other_subcategories}.

'; } $seoText .= 'Купить {category_name} с доставкой по калининграду и калининградской области.

Розетка39: продаем всё, что втыкается в розетку!'; $seoText = StringUtils::format($seoText, $metaParams); $vars['seoText'] = $seoText; // END meta: seo text // END meta $this->getLayout()->addBodyClass('catalogue'); $this->getLayout()->addBodyClass('-root'); $this->getLayout()->addBodyClass('inner'); $this->getLayout()->addBodyClass('short-header'); if ($this->core()->isDev()) { $rnd = mt_rand(1000, 10000000000); $this->getLayout()->addCssFile('catalogue.css?rnd=' . $rnd, 'css'); $this->getLayout()->addJsFile('catalogue.js?rnd=' . $rnd, 'js'); } else { $this->getLayout()->clearCssFiles()->addCssFile($this->getLayout()->bundles()->get('catalog.min.css')); $this->getLayout()->clearJsFiles()->addJsFile($this->getLayout()->bundles()->get('catalog.min.js')); } $this->getLayout()->setTemplate('application/catalog/catalog-depth2.tpl'); return $this->outputVars($vars); } /** * Catalog category */ public function categoryAction() { $isAjax = $this->getRequest()->isXmlHttpRequest(); $id = $this->params('id'); $category = $this->catalog()->categories()->getCategoryById($id, $this->app()->getProductsMenuSiteId()); if (!$category) { return $this->redirect()->toUrl('/catalog/'); } // normalize pagination request $requestUri = new Uri($this->getRequest()->getUri()); if ($requestUri->hasQueryParam('p')) { $pageNumber = $requestUri->getQueryValue('p', 0); if ($pageNumber > 1) { $requestUri->appendToPath(sprintf('page-%d', $pageNumber)); } $requestUri->removeFromQuery('p'); return $this->permanentRedirect($requestUri->toString()); } if ($requestUri->hasInPath('page-', false)) { $pathItem = $requestUri->getPathPart('page-', false); $pageNumber = intval(substr($pathItem, strlen('page-'))); if (1 >= $pageNumber) { $requestUri->removeFromPath('page-', false); return $this->permanentRedirect($requestUri->toString()); } } // END normalize pagination request $categorySettings = $this->catalog()->categories()->getCategorySettings($category->getId(), $this->app()->getProductsMenuSiteId()); $isJoinSubcategories = ($categorySettings && $categorySettings->isJoinSubcategories()); $categoriesCrosses = $this->catalog()->categories()->findAllCategoriesCrosses($category->getId(), $this->app()->getProductsMenuSiteId()); $mainMenu = $this->app()->getProductsMenu($this->app()->getCurrentCityId()); $vars = [ 'menu' => $mainMenu ]; $vars['category'] = $category; $vars['categorySettings'] = $categorySettings; $categoryUrl = (isset($mainMenu[$category->getId()]) ? $mainMenu[$category->getId()]->getUrl() : sprintf('/%s/', $category->getUid())); $vars['categoryUrl'] = $categoryUrl; if (isset($mainMenu[$category->getId()])) { $menuCategory = $mainMenu[$category->getId()]; $parentCategory = $menuCategory->getParent(); $vars['parentCategory'] = $parentCategory; } // create query filters $queryFilters = $this->getFilterQuery(); $vars['queryFilters'] = $queryFilters; // tag $tag = null; if ($this->params()->fromRoute('tag')) { $tag = $this->catalog()->categories()->tags()->get($this->params()->fromRoute('tag')); $vars['tag'] = $tag; } // END tag // page number $pageNumber = 1; if ((isset($queryFilters['page']) && !$queryFilters['page']->isEmpty())) { $pageNumber = intval($queryFilters['page']->getValue()); } // END page number $input = new ProductsFiltersSearchInput(); $customFilters = []; // brand custom filter $categoryBrands = iterator_to_array($this->catalog()->products()->findAllAvailBrandsByCategoryId($category->getId(), $this->sites()->currentSite()->getId(), $this->app()->getCurrentCityId())); $categoryBrandModel = null; if (0 < count($categoryBrands)) { if (!empty($this->params()->fromRoute('brand'))) { $brandUid = $this->params()->fromRoute('brand'); $brandExists = false; foreach ($categoryBrands as $categoryBrand) { if (!$brandExists && ($brandUid == StringUtils::translit($categoryBrand->getBrandName()))) { $categoryBrandModel = $categoryBrand; $brandExists = true; if ($categoryBrand->getBrandPropertyId() && $categoryBrand->getBrandPropertyValueId()) { $queryFilters->getParam('features')->addTypeValue($categoryBrand->getBrandPropertyId(), $categoryBrand->getBrandPropertyValueId()); } elseif ($categoryBrand->getBrandId()) { $input->setBrandId($categoryBrand->getBrandId()); } else { $brandExists = false; $categoryBrandModel = null; } } } // brand failure if (!$brandExists) { $categoryBrands = iterator_to_array( $this->catalog()->products()->findAllBrandsByCategoryId($category->getId(), $this->sites()->currentSite()->getId(), $this->app()->getCurrentCityId())); foreach ($categoryBrands as $categoryBrand) { if (!$brandExists && ($brandUid == StringUtils::translit($categoryBrand->getBrandName()))) { $categoryBrandModel = $categoryBrand; $brandExists = true; if ($categoryBrand->getBrandPropertyId() && $categoryBrand->getBrandPropertyValueId()) { $queryFilters->getParam('features')->addTypeValue($categoryBrand->getBrandPropertyId(), $categoryBrand->getBrandPropertyValueId()); } elseif ($categoryBrand->getBrandId()) { $input->setBrandId($categoryBrand->getBrandId()); } else { $brandExists = false; $categoryBrandModel = null; } } } if (!$brandExists) { if (isset($mainMenu[$category->getId()])) { $menuItem = $mainMenu[$category->getId()]; $response = $this->getResponse(); $response->getHeaders()->addHeaderLine('Location', $menuItem->getUrl()); $response->setStatusCode(Response::STATUS_CODE_301); return $response; } return $this->notfound(); } } } $customFilter = [ 'title' => 'Бренды', 'className' => 'brands', 'items' => [] ]; foreach ($categoryBrands as $categoryBrand) { $brandUid = StringUtils::translit($categoryBrand->getBrandName()); $customFilter['items'][$brandUid] = [ 'title' => $categoryBrand->getBrandName(), 'url' => (isset($mainMenu[$category->getId()]) ? $mainMenu[$category->getId()]->getUrl() : '') . $brandUid . '/' ]; } ksort($customFilter['items'], SORT_STRING); if (1 < count($customFilter['items'])) { $customFilters[] = $customFilter; } } $vars['categoryBrandModel'] = $categoryBrandModel; // END brand custom filter $brandName = ''; if (!empty($this->params()->fromRoute('brand')) && $categoryBrandModel) { $brandName = $categoryBrandModel->getBrandName(); } // setup catalog view $view = $this->getCatalogView(); $vars['view'] = $view; // create search index $indexManager = $this->service('SoloElasticsearch\Service\IndexManager'); $indexName = sprintf('site_%d', $this->app()->getProductsMenuSiteId()); $productsFilterIndexType = $indexManager->createIndexType($indexName, 'productsFilters'); if ($isJoinSubcategories) { $siteCategoryId = $category->getId(); if (isset($mainMenu[$siteCategoryId])) { $menuCategory = $mainMenu[$siteCategoryId]; if ($menuCategory->hasItems()) { $nameMappings = []; foreach ($mainMenu[$siteCategoryId]->getItemsWithSubitems() as $subcategory) { if (200 > count($nameMappings)) { $nameMappings[$subcategory->getId()] = [ 'categoryId' => $subcategory->getId() ]; } } $productsFilterIndexType->setMode($productsFilterIndexType::MODE_MULTIPLE_INDECES); $productsFilterIndexType->setNameMapping($nameMappings); } else { $productsFilterIndexType->setMode($productsFilterIndexType::MODE_SINGLE_INDEX); $productsFilterIndexType->setNameMapping([ 'categoryId' => $siteCategoryId ]); } } } else { $productsFilterIndexType->setMode($productsFilterIndexType::MODE_SINGLE_INDEX); $productsFilterIndexType->setNameMapping([ 'categoryId' => $category->getId() ]); } $input->setCityId($this->app()->getCurrentCityId()); $input->setPricesCityId($this->app()->getCityIdForPrice()); $input->onlyAvailable(true); $input->onlyWithImages(false); if (isset($queryFilters['query']) && !$queryFilters['query']->isEmpty()) { $input->setProductName($queryFilters['query']->getValue()); } $input->setPriceColumn(1 ? : $this->auth()->getUser()->getCurrentAgent()->getPriceColumnId()); if (isset($queryFilters['price']) && !$queryFilters['price']->isEmpty()) { $input->setPriceRange($queryFilters['price']->getFrom(), $queryFilters['price']->getTo()); } if (isset($queryFilters['features']) && !$queryFilters['features']->isEmpty()) { foreach ($queryFilters['features']->getValues() as $typeId => $valueIds) { $input->addFeatures($typeId, $valueIds, 'or'); } } if (isset($queryFilters['stores']) && !$queryFilters['stores']->isEmpty()) { foreach ($queryFilters['stores']->getValues() as $storeId) { $input->addStore($storeId); } } if (isset($queryFilters['receiptTerms']) && !$queryFilters['receiptTerms']->isEmpty()) { foreach ($queryFilters['receiptTerms']->getValues() as $type => $dates) { foreach ($dates as $dateTimestamp) { $date = DateTime::createFromTimestamp($dateTimestamp); if ($date instanceof DateTime) { $input->addReceiptTerm($type, $date); } } } } // Кол-во товаров на страницу $limitPerPage = $view->getProductsPerPage() - $numBanners; $limitFrom = 0; if ((isset($queryFilters['page']) && !$queryFilters['page']->isEmpty())) { $limitFrom = (intval($queryFilters['page']->getValue()) - 1) * $limitPerPage; } $input->setLimit($limitPerPage, $limitFrom); // -END Кол-во товаров на страницу $input->addSort($view->getCurrentSortMode()->getQueryName(), $view->getCurrentSortDirection()); if ($this->params()->fromRoute('tag')) { $input->setTagId($this->params()->fromRoute('tag')); } $input->storesEnabled(true); // search in index $searchInCategories = [ $category->getId() ]; $tags = $this->catalog()->categories()->tags()->getAllForCategory($this->app()->getProductsMenuSiteId(), $category->getId()); if (0 < count($tags)) { $productsFilterIndexType->enableTags(); } $result = $productsFilterIndexType->search($input); // END search // Корректируем кол-во банеров и отправляем в TPL $productsPerBanner = 8; // Минимальное кол-во товаров на 1 банер $numProducts = $result->getProducts()->getTotal(); // Итого найдено товаров с учетом фильтров и постранички $numBanners = min($numBanners, floor($numProducts / $productsPerBanner)); // Рассчитать "красивые" позиции банеров $bannerPositions = []; // Номер позиции. Отсчет с 1 for ($cnt = 1; $cnt <= $numBanners; $cnt++) { // $cnt - порядковый номер "набора" $bannerPositions[] = mt_rand(($cnt - 1) * $productsPerBanner + 2, // Не первый в "наборе" $cnt * $productsPerBanner - $productsPerBanner / 2); // Не последний в "наборе" } $vars['gridBanners'] = $gridBanners; $vars['bannerPositions'] = $bannerPositions; // -END Корректируем кол-во банеров и отправляем в TPL // create filters $filters = new FilterSet(); $vars['filters'] = $filters; $this->fillProductsFilterPrices($filters, $result, $queryFilters); $this->fillProductsFilterFeatures($searchInCategories, $filters, $result, $queryFilters, $this->app()->getProductsMenuSiteId()); // stores filters // extract products from search result for find all stores $productSkus = []; foreach ($result->getProducts() as $product) { $productSkus[$product->productSku] = $product->productSku; } $allAvailStores = []; foreach ($this->catalog()->products()->findAllStoresByProductSkus($productSkus) as $availStore) { $allAvailStores[$availStore->StoreID] = $availStore; } $this->fillProductsFilterStores($allAvailStores, $filters, $result, $queryFilters); // END stores filters // receipt terms if ($result->hasProducts()) { $avgPrice = $this->catalog()->prices()->getAveragePriceForSiteCategory($category->getId(), 1 ? : $this->auth()->getUser()->getCurrentAgent()->getPriceColumnId()); if (1200 >= $avgPrice) { $this->fillProductsFilterReceptTerms($filters, $result, $queryFilters, $this->sites()->currentSite()->getId()); } } // END receipt terms // filter urls if ($filters->hasFilters('feature')) { $filtersBaseUri = new Uri($filtersCategoryUrl); $filtersBaseUri->setHost(null); $filtersBaseUri->setScheme(null); $filtersBaseUri->setPort(null); $filtersBaseUri->removeFromPath('page-', false); $filtersBaseUri->clearQuery(); $countAllSelected = 0; foreach ($filters->getFilters('feature') as $filter) { $countAllSelected += $filter->countSelected(); } foreach ($filters->getFilters('feature') as $filter) { $isBrandFilter = ('Производитель' == $filter->getTitle()); $countFilterSelected = $filter->countSelected(); foreach ($filter->getValues() as $featureValue) { // add link $featureValueUri = clone $filtersBaseUri; if ($isBrandFilter && !$tag) { if (0 == $countAllSelected) { $featureValueUri->appendToPath(StringUtils::translit($featureValue->getTitle())); $featureValue->setMode($featureValue::MODE_DIRECT_URL); } elseif (1 == $filter->countSelected()) { $firstSelectedValue = $filter->getFirstSelectedValue(); $featureValueUri->removeFromPath(StringUtils::translit($firstSelectedValue->getTitle())); $featureValueUrlQuery = $queryFilters->copy()->removeParam('page')->features->addTypeValue($filter->getId(), $featureValue->getId())->getFilterQuery()->toQuery(); $featureValueUri->setQuery($featureValueUrlQuery); } else { $featureValueUri->removeFromPath('brand-', false); $featureValueUrlQuery = $queryFilters->copy()->removeParam('page')->features->addTypeValue($filter->getId(), $featureValue->getId())->getFilterQuery()->toQuery(); $featureValueUri->setQuery($featureValueUrlQuery); } } else { $featureValueUrlQuery = $queryFilters->copy()->removeParam('page')->features->addTypeValue($filter->getId(), $featureValue->getId())->getFilterQuery()->toQuery(); $featureValueUri->setQuery($featureValueUrlQuery); } $featureValue->setUrl($featureValueUri->toString()); // remove link if ($featureValue->selected()) { $featureValueRemoveUri = clone $filtersBaseUri; if ($isBrandFilter && !$tag) { if (1 == $countFilterSelected) { $featureValueRemoveUri->removeFromPath(StringUtils::translit($featureValue->getTitle())); } elseif (2 == $countFilterSelected) { $otherSelectedValue = $filter->getFirstSelectedValue([ $featureValue->getId() ]); $featureValueRemoveUri->removeFromPath(StringUtils::translit($featureValue->getTitle())); $featureValueRemoveUri->appendToPath(StringUtils::translit($otherSelectedValue->getTitle())); } else { $featureValueRemoveUrlQuery = $queryFilters->copy()->removeParam('page')->features->removeTypeValue($filter->getId(), $featureValue->getId())->getFilterQuery()->toQuery(); $featureValueRemoveUri->setQuery($featureValueRemoveUrlQuery); } } else { $featureValueRemoveUrlQuery = $queryFilters->copy()->removeParam('page')->features->removeTypeValue($filter->getId(), $featureValue->getId())->getFilterQuery()->toQuery(); $featureValueRemoveUri->setQuery($featureValueRemoveUrlQuery); } $featureValue->setRemoveUrl($featureValueRemoveUri->toString()); } } } } // END filter urls $brandsFilter = null; if ($filters->hasFilters('feature')) { foreach ($filters->getFilters('feature') as $filter) { if ((0 == strcasecmp('Производитель', $filter->getTitle())) && $filter->hasValues()) { $brandsFilter = $filter; break; } } } $siteCategoriesWithCustomSorting = [ 15117, 15177, 15178, 15196 ]; if ($brandsFilter && !in_array($category->getId(), $siteCategoriesWithCustomSorting)) { $brandsFilter->sortValuesBy(function (ValueSetValue $val1, ValueSetValue $val2) { return -Integer::compare($val1->getCount(), $val2->getCount()); }); $maxVisibleCount = $brandsFilter->getMaxVisibleCount(); $brandsFilter->sortValuesPartBy(function (ValueSetValue $val1, ValueSetValue $val2) { return strcasecmp($val1->getTitle(), $val2->getTitle()); }, $maxVisibleCount); } // END create filters // stores filter urls if ($filters->hasFilters('stores')) { $filtersBaseUri = new Uri($filtersCategoryUrl); $filtersBaseUri->setHost(null); $filtersBaseUri->setScheme(null); $filtersBaseUri->setPort(null); $filtersBaseUri->removeFromPath('page-', false); $filtersBaseUri->clearQuery(); foreach ($filters->getFilters('stores') as $filter) { foreach ($filter->getValues() as $featureValue) { // add link $featureValueUri = clone $filtersBaseUri; $featureValueUrlQuery = $queryFilters->copy()->removeParam('page')->stores->addValue($featureValue->getId())->getFilterQuery()->toQuery(); $featureValueUri->setQuery($featureValueUrlQuery); $featureValue->setUrl($featureValueUri->toString()); // remove link if ($featureValue->selected()) { $featureValueRemoveUri = clone $filtersBaseUri; $featureValueRemoveUrlQuery = $queryFilters->copy()->removeParam('page')->stores->removeValue($featureValue->getId())->getFilterQuery()->toQuery(); $featureValueRemoveUri->setQuery($featureValueRemoveUrlQuery); $featureValue->setRemoveUrl($featureValueRemoveUri->toString()); } } } } // END stores filter urls // filters tags if (0 < count($result->getTags())) { $categoryUrl = (isset($mainMenu[$category->getId()]) ? $mainMenu[$category->getId()]->getUrl() : sprintf('/%s/', $category->getUid())); $tagFilter = [ 'title' => 'Мы подобрали', 'className' => 'tags', 'items' => [] ]; // $out = []; $searchTags = $result->getTags(); foreach ($tags as $tagId => $tagItem) { if (true || isset($searchTags[$tagId])) { $count = (isset($searchTags[$tagId]) ? $searchTags[$tagId] : 0); $tagItem = $tags[$tagId]; if ($tagItem->isVisible() || (!$tagItem->isVisible() && $this->core()->isDev())) { $canShow = false; if (!$categoryBrandModel) { $canShow = true; } else { if ($tagItem->hasCondition('properties')) { $propertiesCondition = $tagItem->getCondition('properties'); if ($propertiesCondition->isMatch($categoryBrandModel->getBrandPropertyId(), $categoryBrandModel->getBrandPropertyValueId())) { $canShow = true; } } } if ($canShow) { $tagFilter['items'][$tagId] = [ 'title' => $tagItem->getAnchor(), 'url' => sprintf('%s%s/', $categoryUrl, $tagItem->getUrlPart()), 'selected' => ($tag && ($tag->getId() == $tagItem->getId())) ]; } } } } if (0 < count($tagFilter['items'])) { $customFilters[] = $tagFilter; } } // END filters tags // price ranges if ($filters && $filters->hasFilters('price')) { $priceFilter = $filters->getFilter('price'); if ($priceFilter->getMin() && $priceFilter->getMax()) { $ranges = []; $slides = 4; $step = floor((($priceFilter->getMax() - $priceFilter->getMin()) / $slides) * 0.001) * 1000; $prevTo = 0; for ($i = 0; $i < $slides; $i++) { $from = 0; $to = 0; $title = ''; if (0 == $i) { // first $from = $priceFilter->getMin(); $to = $from + $step; $to = floor($to * 0.001) * 1000; $prevTo = $to; $title = sprintf('%s — %s р.', StringUtils::formatPrice($from), StringUtils::formatPrice($to)); } elseif (($slides - 1) == $i) { // last $from = $prevTo; $to = $priceFilter->getMax(); $title = sprintf('> %s р.', StringUtils::formatPrice($from)); } else { $from = $prevTo; $to = $from + $step; $prevTo = $to; $title = sprintf('%s — %s р.', StringUtils::formatPrice($from), StringUtils::formatPrice($to)); } $ranges[] = [ 'from' => $from, 'to' => $to, 'title' => $title ]; } $vars['priceRanges'] = $ranges; } } // END price ranges // extract products from search result $productIds = []; foreach ($result->getProducts() as $product) { $productIds[$product->productId] = $product->productId; } $catalogProducts = []; if (0 < count($productIds)) { $subcategories = $this->catalog()->categories()->findDescendantOrSelf($category->getId(), $this->app()->getProductsMenuSiteId()); $products = $this->catalog()->products()->findAllByProductIds($productIds); $productsSettings = $this->catalog()->products()->findAllSettingsByProductsIds($productIds); $prices = $this->catalog()->prices()->findAllByProductIds($productIds, $this->app()->getCityIdForPrice()); $images = $this->catalog()->products()->findImagesByProductIds($productIds); $ratings = $this->catalog()->ratings()->findByProductIds($productIds); $productsToSiteCategories = $this->catalog()->categories()->getPrimarySiteCategoriesForProducts($productIds, $this->sites()->currentSite()->getId()); $availProducts = $this->catalog()->products()->getProductsAvailability($productIds, $this->app()->getCurrentCityId()); if ($useSchedulers) { $availStores = []; foreach ($this->catalog()->products()->getAvailStoreByProductIds($productIds) as $availStore) { if (!isset($availStores[$availStore->getProductId()])) { $availStores[$availStore->getProductId()] = []; } $availStores[$availStore->getProductId()][$availStore->getStoreId()] = $availStore->getAvailQuantity(); } $suppliers = []; foreach ($this->catalog()->products()->getSuppliersByProductIds($productIds) as $row) { if (!isset($suppliers[$row->getProductId()])) { $suppliers[$row->getProductId()] = []; } $suppliers[$row->getProductId()][] = [ 'CityID' => $row->getCityId(), 'SupplierID' => $row->getSupplierId(), 'Quantity' => $row->getQuantity(), 'ArrivalDate' => $row->getArrivalDate(), 'DeliveryDate' => $row->getDeliveryDate() ]; } } $pickupScheduler = $this->getServiceLocator()->get('SoloOrder\Service\Pickup\ProductScheduler'); $deliveryScheduler = $this->getServiceLocator()->get('SoloOrder\Service\Delivery\ProductScheduler'); $receiptHints = []; $benchmark = new Benchmark(); foreach ($result->getProducts() as $product) { $productId = $product->productId; if (isset($products[$productId])) { $productInfo = $products[$productId]; $productSettings = $productsSettings[$productId]; $obj = new Product(); $obj->setId($productInfo->getSku()); $obj->setName($product->productName); $obj->setShortName($productInfo->getShortName()); $obj->setWarranty($productSettings->getWarrantyPeriod()); $obj->setCategoryId($product->categoryId); $obj->setTag('is_service', $productInfo->isService()); $this->fillCatalogProductPrice($obj, $productId, $prices); $this->fillCatalogProductAvailability($obj, $product); $this->fillCatalogProductImage($obj, $productInfo, $images); // url $url = ''; $urlParams = [ 'product' => $productInfo->getSku(), 'uid' => $productInfo->getEngName() ]; $categoryId = $product->categoryId; if (isset($mainMenu[$categoryId])) { $menuCategory = $mainMenu[$categoryId]; $urlParams['category'] = trim($menuCategory->getUrl(), '/'); } elseif (isset($mainMenu[$category->getId()])) { $menuCategory = $mainMenu[$category->getId()]; $urlParams['category'] = trim($menuCategory->getUrl(), '/'); } $url = $this->urlBuilder()->buildProductUrl($urlParams); $obj->setUrl($url); // END url // settings if (isset($availProducts[$productId])) { $availProduct = $availProducts[$productId]; $obj->setTag('is_prepay', $availProduct->isSupplierPrepay()); if ((0 < $availProduct->getAvailQuantity()) || (0 < $availProduct->getSuborderQuantity())) { $obj->isAvailable(true); } } // END settings // rating if (isset($ratings[$productId])) { $rating = $ratings[$productId]; $obj->setRating($rating->getRating()); $obj->setVotesCount($rating->getVotesCount()); } // END rating if ($product->marketingActions && is_array($product->marketingActions)) { foreach ($product->marketingActions as $productMarketingAction) { $obj->addMarketingAction($productMarketingAction['id']); } } $obj->removeMarketingAction(100); $obj->setTag('productId', $productInfo->getId()); $obj->setTag('product', $productInfo); $catalogProducts[$obj->getId()] = $obj; } } $vars['productsSettings'] = $productsSettings; } $vars['products'] = $catalogProducts; $vars['receiptHints'] = $receiptHints; // END products // pagination $page = (!$queryFilters['page']->isEmpty() ? intval($queryFilters['page']->getValue()) : 1); $pages = $this->createPagination($result->getProducts()->getTotal(), $view->getProductsPerPage() - $numBanners, $page); $urlFilters = $queryFilters->copy(); foreach ($pages as $page) { $urlFilters->page->clear(); if (1 < $page->getNumber()) { $urlFilters->page->setValue($page->getNumber()); } $url = (isset($mainMenu[$category->getId()]) ? $mainMenu[$category->getId()]->getUrl() : ''); if ($tag) { $url .= $tag->getUrlPart() . '/'; $url .= '?' . $urlFilters->toQuery(); } elseif (!empty($this->params()->fromRoute('brand')) && $categoryBrandModel) { $url .= StringUtils::translit($categoryBrandModel->getBrandName()); if ($categoryBrandModel->getBrandPropertyId()) { $url .= '?' . $urlFilters->copy()->getParam('features')->removeTypeValue($categoryBrandModel->getBrandPropertyId(), $categoryBrandModel->getBrandPropertyValueId())->getFilterQuery()->toQuery(); } else { $url .= '?' . $urlFilters->toQuery(); } } else { $url .= '?' . $urlFilters->toQuery(); } $url = $this->normalizePaginationUrl($url); $page->setUrl($url); } $vars['pages'] = $pages; // END pagination $vars['customFilters'] = $customFilters; // breadcrumbs if (!$isAjax) { if (isset($mainMenu[$category->getId()]) && $mainMenu[$category->getId()]->hasParent()) { $parentCategory = $mainMenu[$category->getId()]->getParent(); while (null !== $parentCategory) { $this->breadcrumbs()->addFirst(new RDFBreadcrumbItem($parentCategory->getName(), $parentCategory->getUrl()))->setAlternateTitle($parentCategory->getName()); $parentCategory = $parentCategory->getParent(); } } $menuCategory = $mainMenu[$category->getId()]; $this->breadcrumbs()->add(new RDFBreadcrumbItem($menuCategory->getName(), $menuCategory->getUrl()))->setAlternateTitle($menuCategory->getName()); if (isset($queryFilters['query']) && !$queryFilters['query']->isEmpty()) { $breadcrumb = $this->breadcrumbs()->add( new RDFBreadcrumbItem(sprintf('Результаты поиска "%s"', $queryFilters['query']->getValue()), sprintf('/search/?q=%s', $queryFilters['query']->getValue()))); $breadcrumb->setAlternateTitle($breadcrumb->getTitle()); } if ($filters->hasFilters('price')) { $priceFilter = $filters->getFilter('price'); if ($priceFilter->hasSelection()) { $title = sprintf('%s — %s руб.', StringUtils::formatPrice($priceFilter->getFrom()), StringUtils::formatPrice($priceFilter->getTo())); $url = $queryFilters->copy()->removeParam('page')->removeParam('features')->toQuery(); if (!empty($url)) { $url = '?' . $url; } $breadcrumb = $this->breadcrumbs()->add(new RDFBreadcrumbItem($title, $url))->setAlternateTitle($title); } } if ($filters->hasFilters('feature')) { $featuresBreadcrumbs = []; $featuresBreadcrumbsQuery = $queryFilters->copy()->removeParam('page'); foreach (array_reverse($filters->getFilters('feature')) as $filter) { if ($filter->hasValues() && $filter->hasSelected()) { foreach (array_reverse($filter->getSelectedValues()) as $featureValue) { $title = $featureValue->getTitle(); $url = $featuresBreadcrumbsQuery->toQuery(); if ('Производитель' == $filter->getTitle()) { foreach ($categoryBrands as $categoryBrand) { if (($filter->getId() == $categoryBrand->getBrandPropertyId()) && ($featureValue->getId() == $categoryBrand->getBrandPropertyValueId())) { $categoryUrl = (isset($mainMenu[$category->getId()]) ? $mainMenu[$category->getId()]->getUrl() : sprintf('/%s/', $category->getUid())); $brandUid = StringUtils::translit($categoryBrand->getBrandName()); $url = $categoryUrl . $brandUid . '/'; } } $title = $category->getName() . ' ' . $featureValue->getTitle(); } else { if (!empty($url)) { $url = '?' . $url; } } $breadcrumb = new RDFBreadcrumbItem($title, $url); $breadcrumb->setAlternateTitle($breadcrumb->getTitle()); $featuresBreadcrumbs[] = $breadcrumb; $featuresBreadcrumbsQuery->features->removeTypeValue($filter->getId(), $featureValue->getId())->getFilterQuery(); } } } foreach (array_reverse($featuresBreadcrumbs) as $breadcrumb) { $this->breadcrumbs()->add($breadcrumb); } } if ($tag) { if ($tag->hasCondition('properties')) { $tagProperties = $tag->getCondition('properties')->getProperties(); foreach ($tagProperties as $tagPropertyId => $tagPropertyValueIds) { foreach ($categoryBrands as $categoryBrand) { if ($categoryBrand->getBrandPropertyId() == $tagPropertyId) { foreach ($tagPropertyValueIds as $tagPropertyValueId => $exists) { if ($exists && ($categoryBrand->getBrandPropertyValueId() == $tagPropertyValueId)) { $categoryUrl = (isset($mainMenu[$category->getId()]) ? $mainMenu[$category->getId()]->getUrl() : sprintf('/%s/', $category->getUid())); $brandUid = StringUtils::translit($categoryBrand->getBrandName()); $url = $categoryUrl . $brandUid . '/'; $title = $categoryBrand->getBrandName(); $breadcrumb = new RDFBreadcrumbItem($title, $url); $breadcrumb->setAlternateTitle($breadcrumb->getTitle()); $this->breadcrumbs()->add($breadcrumb); } } } } } } $breadcrumb = new RDFBreadcrumbItem($tag->getTitle(), ''); $breadcrumb->setAlternateTitle($breadcrumb->getTitle()); $this->breadcrumbs()->add($breadcrumb); } } // END breadcrumbs $hasSelectedFeature = false; $selectedFilterValuesCount = 0; if ($filters->hasFilters('feature')) { foreach ($filters->getFilters('feature') as $filter) { if ($filter->hasSelected()) { $hasSelectedFeature = true; $selectedFilterValuesCount += $filter->countSelected(); } } } $hasSorting = (!empty($this->params()->fromQuery('sort'))); // meta & title $metaParams = [ 'category_name' => $category->getName(), 'category_name_lower' => StringUtils::lcfirstRus($category->getName()), 'totalProducts' => $result->getProducts()->getTotal() ]; if ($tag) { $metaParams['category_name'] = $tag->getTitle(); $metaParams['category_name_lower'] = StringUtils::lcfirstRus($tag->getTitle()); } elseif ($categoryBrandModel) { $metaParams['category_name'] .= ' ' . $categoryBrandModel->getBrandName(); $metaParams['category_name_lower'] .= ' ' . $categoryBrandModel->getBrandName(); } $maxProducts = 6; $firstProducts = []; foreach ($catalogProducts as $catalogProduct) { if ($maxProducts > count($firstProducts)) { $firstProducts[] = sprintf('%s', $catalogProduct->getUrl(), $catalogProduct->getName()); } } $firstProductsText = ''; if (1 < count($firstProducts)) { $lastProduct = array_pop($firstProducts); $firstProductsText = implode(', ', $firstProducts) . ' и ' . $lastProduct; } else { $firstProductsText = reset($firstProducts); } $metaParams['first_products'] = $firstProductsText; $title = '{category_name} купить в калининграде в интернет магазине розетка39 дешево с доставкой по области и калининграду'; $description = '{category_name} купить в калининграде в интернет магазине розетка39 дешево с доставкой по области и калининграду'; $keywords = '{category_name}, купить, калининград, дешево, интернет, магазин, розетка39, розетка, доставка, область'; if ($tag) { if ($tag->getMetaTitle()) { $title = $tag->getMetaTitle(); } if ($tag->getMetaDescription()) { $description = $tag->getMetaDescription(); } if ($tag->getMetaKeywords()) { $keywords = $tag->getMetaKeywords(); } } $this->getLayout()->setTitle(StringUtils::format($title, $metaParams)); $this->getLayout()->addMetaDescription(StringUtils::format($description, $metaParams)); $this->getLayout()->addMetaKeywords(StringUtils::format($keywords, $metaParams)); $seoText = 'Ищете где в Калининграде купить {category_name_lower}? — Розетка39, вы по адресу!

В ассортименте магазина Розетка39 есть товары из категории {category_name_lower}: {totalProducts} в наличии.
{category_name} можно купить с доставкой по Калининграду и Калининградской области или купить {category_name_lower} в наших магазинах «Розетка39» в Калининграде.

Информируем, что {category_name_lower} можно купить за наличный расчет, по карте и даже в кредит (спасибо ПАО «Почта-Банк»), оформив заявку прямо на сайте.

{category_name} представлено, к примеру, такими товарами как: {first_products}.

Присмотритесь, у нас есть что купить. {category_name} — возврат 365 дней, где еще вы найдете такие условия на покупку {category_name} в Калининграде. '; $seoText = StringUtils::format($seoText, $metaParams); $vars['seoText'] = $seoText; $vars['showSeoText'] = true; // END meta & title $this->getLayout()->addBodyClass('catalogue'); $this->getLayout()->addBodyClass('short-header'); $this->getLayout()->addBodyClass('inner'); if ($this->core()->isDev()) { $rnd = mt_rand(1000, 10000000000); $this->getLayout()->addCssFile('catalogue.css?rnd=' . $rnd, 'css'); $this->getLayout()->addJsFile('catalogue.js?rnd=' . $rnd, 'js'); } else { $this->getLayout()->clearCssFiles()->addCssFile($this->getLayout()->bundles()->get('catalog.min.css')); $this->getLayout()->clearJsFiles()->addJsFile($this->getLayout()->bundles()->get('catalog.min.js')); } $vars['totalProducts'] = $result->getProducts()->getTotal(); if ($isAjax) { $out = [ 'success' => true, 'products' => $this->renderer()->render('catalog/category.products.tpl', $vars), 'sidebar' => $this->renderer()->render('catalog/sidebar.tpl', $vars), 'sorting' => $this->renderer()->render('catalog/category.sorting.tpl', $vars), 'pagination' => $this->renderer()->render('catalog/category.pagination.tpl', $vars), 'selectedfilters' => $this->renderer()->render('catalog/sidebar.selected-filters.tpl', $vars), 'pageNumber' => $pageNumber ]; return $this->outputJson($out); } else { return $this->outputVars($vars); } } public function setupViewAction() { $out = [ 'success' => false ]; $view = $this->getCatalogView(); if ($this->params()->fromQuery('scroll')) { switch ($this->params()->fromQuery('scroll')) { case 'pages': $this->catalog()->views()->setPaginationMode(PaginationMode::SPLIT_PAGES); break; case 'infinite': $this->catalog()->views()->setPaginationMode(PaginationMode::INFINITE); break; } } $out['view'] = $view; $out['success'] = true; return $this->outputJson($out); } }