router->url('banners-' . $key, $params, ['dynamic' => $dynamic, 'module' => 'banners']); } /** * Формируем список категорий Listings * @param string $moduleName модуль списка категорий * @param array $selectedID ID предвыбранных категорий * @param string $format * 'checkbox' - в формате * 'array' - в виде массива * @param string $fieldName имя поля * @return string|array HTML */ public function getCategories( string $moduleName, array $selectedID, string $format = 'checkbox', string $fieldName = 'category_id' ) { $categoriesList = []; if ($moduleName === 'business') { if (bff::businessEnabled() && Business::categoriesEnabled()) { $categoriesList = Business::model()->catsListing([ ':cond' => 'C.numlevel <= 2 AND C.id != ' . Business::CATS_ROOTID . ' AND C.enabled = 1', ]); array_unshift($categoriesList, [ 'id' => static::CATEGORY_ALL, 'title' => _t('', 'All Categories'), 'numlevel' => 1, 'pid' => Business::CATS_ROOTID, ]); } else { $moduleName = 'listings'; $ignoreVirtual = true; } } if ($moduleName === 'listings') { $filter = [ ':cond' => 'C.numlevel <= 2 AND C.id != ' . Listings::CATS_ROOTID . ' AND C.enabled = 1', ]; if (!empty($ignoreVirtual)) { $filter[':cond'] .= ' AND C.virtual_ptr IS NULL'; } $categoriesList = Listings::model()->catsListing($filter); array_unshift($categoriesList, [ 'id' => static::CATEGORY_ALL, 'title' => _t('', 'All Categories'), 'numlevel' => 1, 'pid' => Listings::CATS_ROOTID, ]); } $html = ''; if ($format === 'array') { return $categoriesList; } elseif ($format === 'checkbox') { # $className = ''; foreach ($categoriesList as $v) { if ($v['numlevel'] == 1) { $className = 'j-check-' . $v['id']; } $html .= ''; } } return $html; } /** * Получаем код баннера по ключу позиции (дополнительная фильтрация) * @see Banners::viewByPosition * @param array $bannersList @ref список банеров * @param array $positionData данные о позиции доп. параметры * @param $settings */ public function viewByPositionFilter(&$bannersList, $positionData, $settings) { # 2. Регион if ($positionData['filter_region']) { $regionData = Geo::filter(); if (!empty($regionData['numlevel'])) { # user OR settings $lvl = $regionData['numlevel']; foreach ($bannersList as $k => &$v) { if (empty($v['regions'])) { continue; } foreach ($v['regions'] as $vv) { if (! empty($vv['geo_region' . $lvl])) { if ($vv['geo_region' . $lvl] == $regionData['id']) { continue 2; } } else { foreach (array_reverse($regionData['parents'] ?? [], true) as $kkk => $vvv) { if (! empty($vv['geo_region' . ($vvv['numlevel'] ?? '')])) { if ($vv['geo_region' . $vvv['numlevel']] == $vvv['id']) { continue 3; } break; } } } } unset($bannersList[$k]); } unset($v); } else { # при отсутствии фильтрации по региону(все регионы), # игнорируем баннеры с определенным регионом foreach ($bannersList as $k => &$v) { if (! empty($v['regions'])) { unset($bannersList[$k]); } } unset($v); } } # 4. Категория if ($positionData['filter_category'] && sizeof($bannersList) > 0) { if ($positionData['filter_category_module'] == 'listings') { $catData = ListingsSearchFilterBlock::i()->categoryData; $catID = ($catData['id'] ?: 0); if (! $catID && ! empty($settings['cat'])) { $catID = $settings['cat']; $catData = $catID; } if ($catID > 0) { static $catParentsID = []; # todo foreach ($bannersList as $k => &$v) { if (!$v['category'] || $v['category'] == static::CATEGORY_ALL) { continue; } else { # простая проверка if (in_array($catID, $v['category'])) { continue; } # проверка на parent-категорию if (!isset($catParentsID[$catID])) { $catParentsID[$catID] = Listings::model()->catParentsID($catData); } if (array_intersect($catParentsID[$catID], $v['category'])) { continue; } } unset($bannersList[$k]); } unset($v); } else { # при отсутствии фильтрации по категории(все категории), # игнорируем баннеры с определенным категориями foreach ($bannersList as $k => &$v) { if ($v['category']) { unset($bannersList[$k]); } } unset($v); } } else { if ($positionData['filter_category_module'] == 'business' && bff::businessEnabled()) { $catData = bff::filterData('business-search-category'); $catID = (!empty($catData['id']) ? $catData['id'] : 0); $catsModel = (Business::categoriesEnabled() ? Business::model() : Listings::model()); if ($catID > 0) { static $catParentsID = []; # todo foreach ($bannersList as $k => &$v) { if (!$v['category'] || $v['category'] == static::CATEGORY_ALL) { continue; } else { # простая проверка if (in_array($catID, $v['category'])) { continue; } # проверка на parent-категорию if (!isset($catParentsID[$catID])) { $catParentsID[$catID] = $catsModel->catParentsID($catData); } if (array_intersect($catParentsID[$catID], $v['category'])) { continue; } } unset($bannersList[$k]); } unset($v); } else { # при отсутствии фильтрации по категории(все категории), # игнорируем баннеры с определенным категориями foreach ($bannersList as $k => &$v) { if ($v['category']) { unset($bannersList[$k]); } } unset($v); } } } } } }