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