CoolCMS API

AbstractOptionRules extends BaseComponent
in package
uses ModalAwareTrait, PrivilegeGuardTrait

AbstractYes

Admin immediate-save management of option rules (`SHOW_SELECT_OPTIONS`, action = 1) of one SELECT.

Rendered in the parameter edit by {control optionRules $parameter->getId()}. Shared parent of the Bazaar, Comcat and Eshop components: module entities appear only as object (see AbstractParameterRuleManager). The leaf supplies $translatorDomain and operatorsDomain(); the module OptionRulesFactory injects the managers.

It reads stored rules (loadRules()) and offers immediate actions on targets:

  • "Edit options" opens the shared ModalWindow with a checkbox list of the select options (pre-checked = current targets) and applies a diff through addTarget/removeTarget plus recalcAlwaysVisible (AbstractParameterRuleManager).
  • "Delete" calls delete() on the rule plus recalcAlwaysVisible. Authoring conditions (source, operator, values with a Picker) stays in the presenter's staged editor, because a picker does not belong in a modal rendered by renderToString.

IMPORTANT: $parameterId is persistent (id of the select) and must survive the submit of assignForm; otherwise the option checkbox list would be built without its items before validation. link('this') carries it as a persistent param; ruleId travels in a hidden field.

Table of Contents

Properties

$container  : Container
$parameterId  : int
Select whose rules the component manages. Persistent, so it survives the `assignForm` submit.
$routerDispatcher  : RouterDispatcher
$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
$assignOptionId  : int|null
Option whose rules are being edited in the modal (per-option axis); null when inactive.
$assignRuleId  : int|null
Rule whose target options are being edited in the modal (per-rule axis); null when inactive.
$bulkOptionIds  : array<int, int>
Options selected for bulk rule assignment (per-selection axis); empty when inactive.
$optionNameCache  : array<int, string>
Cache of option (child parameter) names by id for rule summaries within one render.
$parameterManager  : Manager
$parameterRuleManager  : AbstractParameterRuleManager

Methods

__call()  : mixed
Dispatches `renderXyz()` to `render('Xyz', ...$args)`.
__construct()  : mixed
createComponent()  : IComponent|null
createComponentAssignForm()  : Form
createComponentBulkAssignForm()  : Form
Bulk modal (per-selection): a checkbox list of rules (unified pool); a checked rule is added to every selected option. It is not prefilled (a "common state" makes no sense across a heterogeneous selection), it only adds. Selected options travel in the hidden `optionIds` (the state does not survive the submit); `parameterId` is persistent and rule items do not depend on it, they draw from the global pool.
createComponentOptionRulesForm()  : Form
Per-option modal: checkbox list of rules (action = 1 of the select), pre-checked = controlling this option.
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
handleAssignRules()  : void
Opens the modal editing rules that control the given option (per-option axis).
handleBulkAssignRules()  : void
Opens the modal for bulk assigning a rule to several selected options (per-selection axis).
handleDeleteRule()  : void
Deletes the rule (DB FK cascade removes conditions, values and targets) and recomputes `always_visible`.
handleEditTargets()  : void
Opens the modal editing target options of a rule (per-rule axis).
hasServiceByType()  : bool
Returns whether the container has a service of the given type.
initializeAllContexts()  : void
injectDeviceDetector()  : void
onAssignFormError()  : void
onAssignFormSuccess()  : void
onBulkAssignFormError()  : void
onBulkAssignFormSuccess()  : void
onCreate()  : void
onOptionRulesFormError()  : void
onOptionRulesFormSuccess()  : void
render()  : void
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).
getModalWindow()  : ModalWindow
getTranslator()  : ITranslator
isTargetAllowed()  : bool
Returns whether the logged-in user may open the given admin target. For visibility (tiles, autocomplete, buttons); it does not throw.
operatorsDomain()  : string
Domain of operator texts (`admin.bazaar.operators` / `admin.comcat.operators`).
requirePrivilege()  : void
Throws 403 when the logged-in user lacks the given admin privilege.
resolvePageTarget()  : string|null
Returns the RBAC key of the target page: `<presenter>:<action>`, e.g. `:Admin:System:User:show`.
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).
displayName()  : string
Parameter name in the current language (falls back to the first non-empty one), like `parameterDisplayName`.
loadRules()  : array<int, array{ruleId: int, summary: string, targetOptionIds: list, targetNames: list, targetCount: int}>
Returns stored SHOW_SELECT_OPTIONS rules targeting this select as display rows (condition summary plus target options).
operatorLabel()  : string
Returns the operator (validator) label for the rule summary.
optionItems()  : array<int, string>
Returns the options (child parameters) of this select as checkbox list items (id to name).
optionName()  : string
Option name for the per-option modal header.
optionNameById()  : string
Returns the option (child parameter) name by id; falls back from {@see ruleSummary()} when the hydrator does not load the 3-level relation `conditionsCollection.valuesCollection.option` (the relation stays null while the mirror column `option_id` is filled). The condition source is another parameter than this select, so {@see optionItems()} does not know its options and the name is resolved through the ParameterManager. Lazily cached across all rules of one render.
parseOptionIds()  : array<int, int>
Parses a CSV ("2,5,7") from the client into a list of positive option ids (deduplicated, order kept).
renderModalContent()  : string
Renders the modal content into a string for ModalWindow.
requireHostEditPrivilege()  : void
IMPORTANT: server-side gate for every signal and submit of the component: the host `edit` privilege of the hosting presenter (`:Admin:<Module>:Parameter:edit`). The component can be invoked on every host action (even `show`), so the gate of the `edit` action does not cover it, and hiding the buttons is no protection. Rules are a global pool on purpose, so there is no `ruleId` binding to the target, only the privilege. Call it as the first statement.
ruleItems()  : array<int, string>
Returns checkbox list items of the per-option modal: the unified pool (every rule; the effect derives from the target). Checking a rule assigns it to the option (it gets an option target and exposes the option), so a rule created elsewhere (e.g. in display rules) can be reused. Maps ruleId to summary.
ruleSummary()  : string
Summarizes the rule conditions for the list and modal: "<source> <operator> <values>" joined by " + ".
ruleSummaryById()  : string
Summarizes the rule by id (for the modal header).
showModal()  : void
Fills the shared admin ModalWindow with the current state and opens it.
tr()  : string
Translates a key in the component domain to a final string (also for fields with `setTranslator(null)`).

Properties

$parameterId

Select whose rules the component manages. Persistent, so it survives the `assignForm` submit.

public int $parameterId = 0
Attributes
#[Persistent]

$componentParameters

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

component parameters set by setComponentParameter()

$assignOptionId

Option whose rules are being edited in the modal (per-option axis); null when inactive.

private int|null $assignOptionId = null

$assignRuleId

Rule whose target options are being edited in the modal (per-rule axis); null when inactive.

private int|null $assignRuleId = null

$bulkOptionIds

Options selected for bulk rule assignment (per-selection axis); empty when inactive.

private array<int, int> $bulkOptionIds = []

$optionNameCache

Cache of option (child parameter) names by id for rule summaries within one render.

private array<int, string> $optionNameCache = []

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

createComponentBulkAssignForm()

Bulk modal (per-selection): a checkbox list of rules (unified pool); a checked rule is added to every selected option. It is not prefilled (a "common state" makes no sense across a heterogeneous selection), it only adds. Selected options travel in the hidden `optionIds` (the state does not survive the submit); `parameterId` is persistent and rule items do not depend on it, they draw from the global pool.

public createComponentBulkAssignForm() : Form
Return values
Form

createComponentOptionRulesForm()

Per-option modal: checkbox list of rules (action = 1 of the select), pre-checked = controlling this option.

public createComponentOptionRulesForm() : Form
Return values
Form

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

handleAssignRules()

Opens the modal editing rules that control the given option (per-option axis).

public handleAssignRules(int $parameterId, int $optionId) : void

parameterId is passed explicitly: the link is built in the left column (main form) before the component on the right renders, so the persistent param would still be 0 in the link.

Parameters
$parameterId : int
$optionId : int

handleBulkAssignRules()

Opens the modal for bulk assigning a rule to several selected options (per-selection axis).

public handleBulkAssignRules(int $parameterId[, string $optionIds = '' ]) : void

optionIds is a CSV list of ids from the client ("select all" bar); parameterId is passed explicitly for the same reason as in the per-option variant.

Parameters
$parameterId : int
$optionIds : string = ''

handleDeleteRule()

Deletes the rule (DB FK cascade removes conditions, values and targets) and recomputes `always_visible`.

public handleDeleteRule(int $ruleId) : void

The link is a plain request (styled data-grid-confirm), so a redirect back follows the delete.

Parameters
$ruleId : int
Attributes
#[Requires]
$methods: 'POST'

handleEditTargets()

Opens the modal editing target options of a rule (per-rule axis).

public handleEditTargets(int $ruleId) : void
Parameters
$ruleId : int

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([int|null $parameterId = null ]) : void
Parameters
$parameterId : int|null = null

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

isTargetAllowed()

Returns whether the logged-in user may open the given admin target. For visibility (tiles, autocomplete, buttons); it does not throw.

protected isTargetAllowed(string|null $key) : bool

IMPORTANT: fail-closed like requirePrivilege(): an empty key and a presenter without isAllowed() both mean no. A component that skips this question lists the target to everyone.

Parameters
$key : string|null
Return values
bool

operatorsDomain()

Domain of operator texts (`admin.bazaar.operators` / `admin.comcat.operators`).

protected abstract operatorsDomain() : string
Return values
string

requirePrivilege()

Throws 403 when the logged-in user lacks the given admin privilege.

protected requirePrivilege(string $key) : void

Call it as the first statement of a mutating signal, before loading data, so the check cannot be bypassed by something being written first.

Parameters
$key : string

resolvePageTarget()

Returns the RBAC key of the target page: `<presenter>:<action>`, e.g. `:Admin:System:User:show`.

protected static resolvePageTarget(object|null $page) : string|null

Same interpretation as Menu::filterByPrivileges(), BasePresenter::authorizeListing() and PrivilegeCheckTrait::checkCurrentPrivilege(). The key is derived from the page target only, never from a file or class name.

Returns null when the page is missing or has no presenter, so there is nothing to allow.

Parameters
$page : object|null

AdminPage entity (hydrated, hence just object)

Return values
string|null

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

loadRules()

Returns stored SHOW_SELECT_OPTIONS rules targeting this select as display rows (condition summary plus target options).

private loadRules() : array<int, array{ruleId: int, summary: string, targetOptionIds: list, targetNames: list, targetCount: int}>

Mirrors the read pattern of the presenter's loadOptionRules.

Return values
array<int, array{ruleId: int, summary: string, targetOptionIds: list, targetNames: list, targetCount: int}>

operatorLabel()

Returns the operator (validator) label for the rule summary.

private operatorLabel(string $validator) : string

Comparison operators use a math symbol (the compact "Price >= 5000" instead of a long text); MIN and MAX are inclusive bounds, hence the inclusive symbols, not strict ones. Other operators (length, contains, filled, regex...) have no readable symbol and keep the text from the operator domain shared with the rule editor.

Parameters
$validator : string
Return values
string

optionItems()

Returns the options (child parameters) of this select as checkbox list items (id to name).

private optionItems() : array<int, string>
Return values
array<int, string>

optionName()

Option name for the per-option modal header.

private optionName(int $optionId) : string
Parameters
$optionId : int
Return values
string

optionNameById()

Returns the option (child parameter) name by id; falls back from {@see ruleSummary()} when the hydrator does not load the 3-level relation `conditionsCollection.valuesCollection.option` (the relation stays null while the mirror column `option_id` is filled). The condition source is another parameter than this select, so {@see optionItems()} does not know its options and the name is resolved through the ParameterManager. Lazily cached across all rules of one render.

private optionNameById(int $optionId) : string
Parameters
$optionId : int
Return values
string

parseOptionIds()

Parses a CSV ("2,5,7") from the client into a list of positive option ids (deduplicated, order kept).

private parseOptionIds(string $csv) : array<int, int>
Parameters
$csv : string
Return values
array<int, int>

renderModalContent()

Renders the modal content into a string for ModalWindow.

private renderModalContent() : string
Return values
string

requireHostEditPrivilege()

IMPORTANT: server-side gate for every signal and submit of the component: the host `edit` privilege of the hosting presenter (`:Admin:<Module>:Parameter:edit`). The component can be invoked on every host action (even `show`), so the gate of the `edit` action does not cover it, and hiding the buttons is no protection. Rules are a global pool on purpose, so there is no `ruleId` binding to the target, only the privilege. Call it as the first statement.

private requireHostEditPrivilege() : void

ruleItems()

Returns checkbox list items of the per-option modal: the unified pool (every rule; the effect derives from the target). Checking a rule assigns it to the option (it gets an option target and exposes the option), so a rule created elsewhere (e.g. in display rules) can be reused. Maps ruleId to summary.

private ruleItems() : array<int, string>
Return values
array<int, string>

ruleSummaryById()

Summarizes the rule by id (for the modal header).

private ruleSummaryById(int $ruleId) : string
Parameters
$ruleId : int
Return values
string

showModal()

Fills the shared admin ModalWindow with the current state and opens it.

private showModal() : void

tr()

Translates a key in the component domain to a final string (also for fields with `setTranslator(null)`).

private tr(string $key) : string
Parameters
$key : string
Return values
string
On this page

Search results