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);
}
}