AdvertTabList
extends BaseComponent
in package
uses
AdvertListTrait
Advert panel with switchable tabs: the main page of the template7 template.
Usage:
{control frontBazaarAdvertTabList:box, 8}
Tabs switch via the tab! signal (AJAX snippet through Naja; without JS a full reload via
the persistent parameter):
last: newest (insertDatetimedesc)visited: most visited (viewsDetaildesc)hot: most replies in the lastHOT_WINDOW_DAYSdays
Rendering is delegated to the shared
AdvertListRenderer like
LastAdvertList/TopAdvertList; the card HTML comes from the design system, not from here.
Table of Contents
Constants
- ADVERT_INCLUDES : mixed = ['parameterRels.parameter.translations', 'asset...
- Includes same as `LastAdvertList`: the card needs categories, assets and the author.
- ALLOWED_STYLES : mixed = ['Style_1', 'Style_2', 'Style_3', 'Style_4', 'S...
- List styles allowed in the `tab!` signal (the `AdvertListRenderer` styles, `Style_1`...`Style_9`). The style goes into the template path, so an unknown value (`../...`) falls back to the default.
- HOT_WINDOW_DAYS : mixed = 30
- "Hot" tab window in days. Replies have no denormalized count on the advert, so they are counted from the replies table; the window keeps the query flat as history grows.
- MAX_NUMBER_CAP : mixed = 48
- Cap on the advert count from the signal (forged `maxNumber=100000`).
- TABS : mixed = ['last', 'visited', 'hot']
- Allowed tabs in render order.
Properties
- $container : Container
- $routerDispatcher : RouterDispatcher
- $tab : string
- Active tab. Persistent for the non-JS fallback (reload with `?...-tab=...`) and so the AJAX render after the signal knows what to draw.
- $translator : ITranslator
- $appContext : AppContext
- $componentParameters : array<string, mixed>
- $currencyContext : CurrencyContext|null
- $deviceDetector : DeviceDetector|null
- $languageContext : LanguageContext|null
- $localizationContext : LocalizationContext|null
- $settingContext : SettingContext
- $themeContext : ThemeContext|null
- $translatorDomain : string|null
- $advertListRendererFactory : AdvertListRendererFactory
- $advertManager : AdvertManager
- $lastRenderArgs : array{string, int}|null
- Arguments of the last full render; the AJAX snippet phase calls `render()` without arguments (same note in `CategoryList`).
- $responseManager : ResponseManager
Methods
- __call() : mixed
- Dispatches `renderXyz()` to `render('Xyz', ...$args)`.
- __construct() : mixed
- createComponent() : IComponent|null
- createComponentAdvertListRenderer() : AdvertListRenderer
- getAppContext() : AppContext
- getComponentParameter() : mixed
- Returns a component parameter, or null when it is not set.
- getContainer() : Container
- getCurrencyContext() : CurrencyContext|null
- getLanguageContext() : LanguageContext|null
- getLocalizationContext() : LocalizationContext|null
- getRouterDispatcher() : RouterDispatcher
- getSettingContext() : SettingContext
- getSettings() : array<int, array<string, mixed>>
- getThemeContext() : ThemeContext|null
- handleTab() : void
- Tab switch signal. Data is loaded only by the new snippet render.
- hasServiceByType() : bool
- Returns whether the container has a service of the given type.
- initializeAllContexts() : void
- injectDeviceDetector() : void
- onCreate() : void
- render() : void
- renderBox() : void
- Box list: `.list.list--box` (`AdvertListRenderer` Style_2).
- setAppContext() : $this
- setComponentParameter() : void
- Sets a component parameter.
- setCurrencyContext() : $this
- setLanguageContext() : $this
- setLocalizationContext() : $this
- setSettingContext() : $this
- setThemeContext() : $this
- setup() : void
- setupAppContext() : void
- typedComponent() : T
- Returns a subcomponent with a verified type.
- frontPresenter() : BasePresenter|null
- Returns the front presenter the component is attached to (null outside the front end or when detached).
- getTranslator() : ITranslator
- setTemplateFile() : void
- setTranslator() : self
- createMultiplierComponent() : Multiplier<string|int, IComponent>
- Creates a multiplier for the component.
- createNewComponentInstance() : IComponent|null
- Creates a new component instance without adding it to the presenter; used by the multiplier.
- createStandardComponent() : IComponent|null
- Creates a standard component (not a multiplier).
- loadAdverts() : array<int, object>
- loadByOrder() : array<int, object>
- loadHot() : array<int, object>
- "Hot": adverts with the most replies in the `HOT_WINDOW_DAYS` window.
- prepareAdvertFilters() : array<int, BaseFilter>
- Visibility conditions of the list, same logic as `LastAdvertList`: when the presenter has `prepareFilters()`, it rules; otherwise a safe fail-closed set (no deleted, banned, unpaid or sold advert on the main page).
Constants
ADVERT_INCLUDES
Includes same as `LastAdvertList`: the card needs categories, assets and the author.
private
mixed
ADVERT_INCLUDES
= ['parameterRels.parameter.translations', 'assetRels.asset.translations', 'categoryRels.category.translations', 'user']
ALLOWED_STYLES
List styles allowed in the `tab!` signal (the `AdvertListRenderer` styles, `Style_1`...`Style_9`). The style goes into the template path, so an unknown value (`../...`) falls back to the default.
private
mixed
ALLOWED_STYLES
= ['Style_1', 'Style_2', 'Style_3', 'Style_4', 'Style_5', 'Style_6', 'Style_7', 'Style_8', 'Style_9']
HOT_WINDOW_DAYS
"Hot" tab window in days. Replies have no denormalized count on the advert, so they are counted from the replies table; the window keeps the query flat as history grows.
private
mixed
HOT_WINDOW_DAYS
= 30
MAX_NUMBER_CAP
Cap on the advert count from the signal (forged `maxNumber=100000`).
private
mixed
MAX_NUMBER_CAP
= 48
TABS
Allowed tabs in render order.
private
mixed
TABS
= ['last', 'visited', 'hot']
Properties
$container
public
Container
$container
Attributes
- #[Inject]
$routerDispatcher
public
RouterDispatcher
$routerDispatcher
$tab
Active tab. Persistent for the non-JS fallback (reload with `?...-tab=...`) and so the AJAX render after the signal knows what to draw.
public
string
$tab
= 'last'
Attributes
- #[Persistent]
$translator
public
ITranslator
$translator
Tags
$appContext
protected
AppContext
$appContext
$componentParameters
protected
array<string, mixed>
$componentParameters
= []
component parameters set by setComponentParameter()
$currencyContext
protected
CurrencyContext|null
$currencyContext
= NULL
$deviceDetector
protected
DeviceDetector|null
$deviceDetector
= NULL
$languageContext
protected
LanguageContext|null
$languageContext
= NULL
$localizationContext
protected
LocalizationContext|null
$localizationContext
= NULL
$settingContext
protected
SettingContext
$settingContext
$themeContext
protected
ThemeContext|null
$themeContext
= NULL
$translatorDomain
protected
string|null
$translatorDomain
= 'front.bazaar.components.advertTabList'
$advertListRendererFactory read-only
private
AdvertListRendererFactory
$advertListRendererFactory
$advertManager read-only
private
AdvertManager
$advertManager
$lastRenderArgs
Arguments of the last full render; the AJAX snippet phase calls `render()` without arguments (same note in `CategoryList`).
private
array{string, int}|null
$lastRenderArgs
= null
$responseManager read-only
private
ResponseManager
$responseManager
Methods
__call()
Dispatches `renderXyz()` to `render('Xyz', ...$args)`.
public
__call(string $name, array<string|int, mixed> $args) : mixed
Called only when the component has no renderXyz() method of its own.
Parameters
- $name : string
- $args : array<string|int, mixed>
__construct()
public
__construct(AdvertManager $advertManager, ResponseManager $responseManager, AdvertListRendererFactory $advertListRendererFactory) : mixed
Parameters
- $advertManager : AdvertManager
- $responseManager : ResponseManager
- $advertListRendererFactory : AdvertListRendererFactory
createComponent()
public
createComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullcreateComponentAdvertListRenderer()
public
createComponentAdvertListRenderer() : AdvertListRenderer
Return values
AdvertListRenderergetAppContext()
public
getAppContext() : AppContext
Return values
AppContextgetComponentParameter()
Returns a component parameter, or null when it is not set.
public
getComponentParameter(string $name) : mixed
Parameters
- $name : string
getContainer()
public
getContainer() : Container
Return values
ContainergetCurrencyContext()
public
getCurrencyContext() : CurrencyContext|null
Return values
CurrencyContext|nullgetLanguageContext()
public
getLanguageContext() : LanguageContext|null
Return values
LanguageContext|nullgetLocalizationContext()
public
getLocalizationContext() : LocalizationContext|null
Return values
LocalizationContext|nullgetRouterDispatcher()
public
getRouterDispatcher() : RouterDispatcher
Return values
RouterDispatchergetSettingContext()
public
getSettingContext() : SettingContext
Return values
SettingContextgetSettings()
public
getSettings() : array<int, array<string, mixed>>
Return values
array<int, array<string, mixed>>getThemeContext()
public
getThemeContext() : ThemeContext|null
Return values
ThemeContext|nullhandleTab()
Tab switch signal. Data is loaded only by the new snippet render.
public
handleTab(string $tab[, string $style = 'Style_2' ][, int $maxNumber = 8 ]) : void
An unknown value falls back to the default; the persistent parameter can be forged in the URL.
Parameters
- $tab : string
- $style : string = 'Style_2'
- $maxNumber : int = 8
hasServiceByType()
Returns whether the container has a service of the given type.
public
hasServiceByType(string $className) : bool
The name is composed dynamically (module plus component), so class_exists() runs first, and
a true result guarantees a valid type.
Parameters
- $className : string
Tags
Return values
boolinitializeAllContexts()
public
initializeAllContexts() : void
injectDeviceDetector()
public
injectDeviceDetector(DeviceDetector $detector) : void
Parameters
- $detector : DeviceDetector
onCreate()
public
onCreate() : void
render()
public
render([string $style = 'Style_2' ][, int $maxNumber = 8 ]) : void
Parameters
- $style : string = 'Style_2'
- $maxNumber : int = 8
renderBox()
Box list: `.list.list--box` (`AdvertListRenderer` Style_2).
public
renderBox([int $maxNumber = 8 ]) : void
Parameters
- $maxNumber : int = 8
setAppContext()
public
setAppContext(AppContext $appContext) : $this
Parameters
- $appContext : AppContext
Return values
$thissetComponentParameter()
Sets a component parameter.
public
setComponentParameter(string $name, mixed $value) : void
Parameters
- $name : string
- $value : mixed
setCurrencyContext()
public
setCurrencyContext(CurrencyContext|null $currencyContext) : $this
Parameters
- $currencyContext : CurrencyContext|null
Return values
$thissetLanguageContext()
public
setLanguageContext(LanguageContext|null $languageContext) : $this
Parameters
- $languageContext : LanguageContext|null
Return values
$thissetLocalizationContext()
public
setLocalizationContext(LocalizationContext|null $localizationContext) : $this
Parameters
- $localizationContext : LocalizationContext|null
Return values
$thissetSettingContext()
public
setSettingContext(SettingContext $settingContext) : $this
Parameters
- $settingContext : SettingContext
Return values
$thissetThemeContext()
public
setThemeContext(ThemeContext|null $themeContext) : $this
Parameters
- $themeContext : ThemeContext|null
Return values
$thissetup()
public
setup(BasePresenter|BasePresenter $presenter) : void
Parameters
- $presenter : BasePresenter|BasePresenter
setupAppContext()
public
setupAppContext(AppContext $appContext) : void
Parameters
- $appContext : AppContext
typedComponent()
Returns a subcomponent with a verified type.
public
typedComponent(string $name, T> $type) : T
Use it instead of an inline @var above $this['x'] (which does not narrow the type) and
instead of the generic IComponent that $this['x'] returns. See
Form::typedComponent().
Parameters
- $name : string
- $type : T>
Tags
Return values
TfrontPresenter()
Returns the front presenter the component is attached to (null outside the front end or when detached).
protected
frontPresenter() : BasePresenter|null
Return values
BasePresenter|nullgetTranslator()
protected
getTranslator() : ITranslator
Return values
ITranslatorsetTemplateFile()
protected
setTemplateFile(string $dir, string $filename) : void
Parameters
- $dir : string
- $filename : string
setTranslator()
protected
setTranslator(ITranslator $translator) : self
Parameters
- $translator : ITranslator
Return values
selfcreateMultiplierComponent()
Creates a multiplier for the component.
private
createMultiplierComponent(string $name) : Multiplier<string|int, IComponent>
Parameters
- $name : string
Return values
Multiplier<string|int, IComponent>createNewComponentInstance()
Creates a new component instance without adding it to the presenter; used by the multiplier.
private
createNewComponentInstance(string $baseName[, int|string|null $uniqueKey = null ]) : IComponent|null
Parameters
- $baseName : string
- $uniqueKey : int|string|null = null
Return values
IComponent|nullcreateStandardComponent()
Creates a standard component (not a multiplier).
private
createStandardComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullloadAdverts()
private
loadAdverts(string $tab, int $maxNumber) : array<int, object>
Parameters
- $tab : string
- $maxNumber : int
Return values
array<int, object>loadByOrder()
private
loadByOrder(array<string, bool> $orderBy, int $maxNumber) : array<int, object>
Parameters
- $orderBy : array<string, bool>
- $maxNumber : int
Return values
array<int, object>loadHot()
"Hot": adverts with the most replies in the `HOT_WINDOW_DAYS` window.
private
loadHot(int $maxNumber) : array<int, object>
Two steps: (1) replies from the window become counts per advert in PHP, (2) adverts are
fetched via InFilter plus visibility filters and sorted by count. Visibility filters apply
only to adverts: a deleted or sold advert with many replies must not clog the selection, so
more candidates are taken (3x the limit) and only the result is trimmed.
Parameters
- $maxNumber : int
Return values
array<int, object>prepareAdvertFilters()
Visibility conditions of the list, same logic as `LastAdvertList`: when the presenter has `prepareFilters()`, it rules; otherwise a safe fail-closed set (no deleted, banned, unpaid or sold advert on the main page).
private
prepareAdvertFilters() : array<int, BaseFilter>