CoolCMS API

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 (insertDatetime desc)
  • visited: most visited (viewsDetail desc)
  • hot: most replies in the last HOT_WINDOW_DAYS days

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

$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]

$componentParameters

protected array<string, mixed> $componentParameters = []

component parameters set by setComponentParameter()

$translatorDomain

protected string|null $translatorDomain = 'front.bazaar.components.advertTabList'

$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

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>

createComponent()

public createComponent(string $name) : IComponent|null
Parameters
$name : string
Return values
IComponent|null

getComponentParameter()

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
Container

getSettings()

public getSettings() : array<int, array<string, mixed>>
Return values
array<int, array<string, mixed>>

handleTab()

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
phpstan-assert-if-true

class-string $className

Return values
bool

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

setComponentParameter()

Sets a component parameter.

public setComponentParameter(string $name, mixed $value) : void
Parameters
$name : string
$value : mixed

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
template
Return values
T

frontPresenter()

Returns the front presenter the component is attached to (null outside the front end or when detached).

protected frontPresenter() : BasePresenter|null
Return values
BasePresenter|null

getTranslator()

protected getTranslator() : ITranslator
Return values
ITranslator

setTemplateFile()

protected setTemplateFile(string $dir, string $filename) : void
Parameters
$dir : string
$filename : string

setTranslator()

protected setTranslator(ITranslator $translator) : self
Parameters
$translator : ITranslator
Return values
self

createMultiplierComponent()

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|null

createStandardComponent()

Creates a standard component (not a multiplier).

private createStandardComponent(string $name) : IComponent|null
Parameters
$name : string
Return values
IComponent|null

loadAdverts()

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>
Return values
array<int, BaseFilter>
On this page

Search results