ProductStatisticsControl
extends BaseComponent
in package
Statistics of one product broken down by its product sets: content of the `:Admin:Eshop:Product:statistics` action ({@see \App\UI\Admin\Eshop\Presenters\ProductPresenter}).
Renders one shared date-range filter, three charts (StatisticsChartControl) and a
summary table. All four parts must cover the same range, so this component owns the filter
and passes the range to the charts in extraParams with their own filter turned off
(StatisticsChartConfig::$showFilter).
The range lives in #[Persistent] properties on the component, not on the presenter: on
the presenter they would leak into every link it builds (grid, edit, ...).
Table of Contents
Constants
- CHARTS : array<string|int, mixed> = ['views' => ['product-views', 'line', false], '...
- Page charts: instance key => [Api action in kebab case, chart type, is monetary].
- DEFAULT_FROM_MODIFIER : string = '-6 months'
- Default range is the last 6 months (same as `StatisticsChartControl`).
Properties
- $container : Container
- $from : string
- $granularity : string
- $routerDispatcher : RouterDispatcher
- $to : string
- $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
- $apiBridge : ApiBridge
- $productId : int
- $statisticsChartFactory : StatisticsChartFactory
Methods
- __call() : mixed
- Dispatches `renderXyz()` to `render('Xyz', ...$args)`.
- __construct() : mixed
- createComponent() : IComponent|null
- filterFormSucceeded() : void
- Handles the plain (non-AJAX) filter: stores the persistent state and redirects to `this`.
- 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
- hasServiceByType() : bool
- Returns whether the container has a service of the given type.
- initializeAllContexts() : void
- injectDeviceDetector() : void
- onCreate() : void
- render() : void
- setAppContext() : $this
- setComponentParameter() : void
- Sets a component parameter.
- setCurrencyContext() : $this
- setLanguageContext() : $this
- setLocalizationContext() : $this
- setProductId() : self
- setSettingContext() : $this
- setThemeContext() : $this
- setup() : void
- setupAppContext() : void
- typedComponent() : T
- Returns a subcomponent with a verified type.
- createComponentChart() : Multiplier<string|int, StatisticsChartControl>
- Builds the three charts from one configuration.
- createComponentFilterForm() : Form
- 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).
-
fetchSummary()
: array{rows: list
>, totals: array , failed: bool} - Loads the summary table data from `api/eshop/statistics/product-summary`.
Constants
CHARTS
Page charts: instance key => [Api action in kebab case, chart type, is monetary].
private
array<string|int, mixed>
CHARTS
= ['views' => ['product-views', 'line', false], 'soldQuantity' => ['product-sold-quantity', 'bar', false], 'revenue' => ['product-revenue', 'line', true]]
DEFAULT_FROM_MODIFIER
Default range is the last 6 months (same as `StatisticsChartControl`).
private
string
DEFAULT_FROM_MODIFIER
= '-6 months'
Properties
$container
public
Container
$container
Attributes
- #[Inject]
$from
public
string
$from
= ''
Attributes
- #[Persistent]
$granularity
public
string
$granularity
= 'month'
Attributes
- #[Persistent]
$routerDispatcher
public
RouterDispatcher
$routerDispatcher
$to
public
string
$to
= ''
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
= 'admin.eshop.components.productStatistics'
$apiBridge read-only
private
ApiBridge
$apiBridge
$productId
private
int
$productId
= 0
$statisticsChartFactory read-only
private
StatisticsChartFactory
$statisticsChartFactory
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(ApiBridge $apiBridge, StatisticsChartFactory $statisticsChartFactory) : mixed
Parameters
- $apiBridge : ApiBridge
- $statisticsChartFactory : StatisticsChartFactory
createComponent()
public
createComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullfilterFormSucceeded()
Handles the plain (non-AJAX) filter: stores the persistent state and redirects to `this`.
public
filterFormSucceeded(Form $form, ArrayHash $values) : void
Parameters
- $form : Form
- $values : ArrayHash
getAppContext()
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|nullhasServiceByType()
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() : void
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
$thissetProductId()
public
setProductId(int $productId) : self
Parameters
- $productId : int
Return values
selfsetSettingContext()
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
TcreateComponentChart()
Builds the three charts from one configuration.
protected
createComponentChart() : Multiplier<string|int, StatisticsChartControl>
Range and granularity go in extraParams, so the charts hold no state of their own and
the filter of this component is the single source of truth.
Return values
Multiplier<string|int, StatisticsChartControl>createComponentFilterForm()
protected
createComponentFilterForm() : Form
Return values
FormfrontPresenter()
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|nullfetchSummary()
Loads the summary table data from `api/eshop/statistics/product-summary`.
private
fetchSummary() : array{rows: list>, totals: array, failed: bool}
A bridge failure must not break the page: the table is replaced by a message
(failed is true) and the charts above it still render.