AbstractOptionRules
extends BaseComponent
in package
uses
ModalAwareTrait, PrivilegeGuardTrait
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
ModalWindowwith a checkbox list of the select options (pre-checked = current targets) and applies a diff throughaddTarget/removeTargetplusrecalcAlwaysVisible(AbstractParameterRuleManager). - "Delete" calls
delete()on the rule plusrecalcAlwaysVisible. 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 byrenderToString.
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
$container
public
Container
$container
Attributes
- #[Inject]
$parameterId
Select whose rules the component manages. Persistent, so it survives the `assignForm` submit.
public
int
$parameterId
= 0
Attributes
- #[Persistent]
$routerDispatcher
public
RouterDispatcher
$routerDispatcher
$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
= null
$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
= []
$parameterManager read-only
private
Manager
$parameterManager
$parameterRuleManager read-only
private
AbstractParameterRuleManager
$parameterRuleManager
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(AbstractParameterRuleManager $parameterRuleManager, Manager $parameterManager) : mixed
Parameters
- $parameterRuleManager : AbstractParameterRuleManager
- $parameterManager : Manager
createComponent()
public
createComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullcreateComponentAssignForm()
public
createComponentAssignForm() : Form
Return values
FormcreateComponentBulkAssignForm()
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
FormcreateComponentOptionRulesForm()
Per-option modal: checkbox list of rules (action = 1 of the select), pre-checked = controlling this option.
public
createComponentOptionRulesForm() : Form
Return values
FormgetAppContext()
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|nullhandleAssignRules()
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
Return values
boolinitializeAllContexts()
public
initializeAllContexts() : void
injectDeviceDetector()
public
injectDeviceDetector(DeviceDetector $detector) : void
Parameters
- $detector : DeviceDetector
onAssignFormError()
public
onAssignFormError(Form $form) : void
Parameters
- $form : Form
onAssignFormSuccess()
public
onAssignFormSuccess(Form $form) : void
Parameters
- $form : Form
onBulkAssignFormError()
public
onBulkAssignFormError(Form $form) : void
Parameters
- $form : Form
onBulkAssignFormSuccess()
public
onBulkAssignFormSuccess(Form $form) : void
Parameters
- $form : Form
onCreate()
public
onCreate() : void
onOptionRulesFormError()
public
onOptionRulesFormError(Form $form) : void
Parameters
- $form : Form
onOptionRulesFormSuccess()
public
onOptionRulesFormSuccess(Form $form) : void
Parameters
- $form : Form
render()
public
render([int|null $parameterId = null ]) : void
Parameters
- $parameterId : int|null = null
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|nullgetModalWindow()
protected
getModalWindow() : ModalWindow
Return values
ModalWindowgetTranslator()
protected
getTranslator() : ITranslator
Return values
ITranslatorisTargetAllowed()
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
booloperatorsDomain()
Domain of operator texts (`admin.bazaar.operators` / `admin.comcat.operators`).
protected
abstract operatorsDomain() : string
Return values
stringrequirePrivilege()
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
-
AdminPageentity (hydrated, hence justobject)
Return values
string|nullsetTemplateFile()
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|nulldisplayName()
Parameter name in the current language (falls back to the first non-empty one), like `parameterDisplayName`.
private
displayName(ParameterInterface $parameter) : string
Parameters
- $parameter : ParameterInterface
Return values
stringloadRules()
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: listoperatorLabel()
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
stringoptionItems()
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
stringoptionNameById()
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
stringparseOptionIds()
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
stringrequireHostEditPrivilege()
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>ruleSummary()
Summarizes the rule conditions for the list and modal: "<source> <operator> <values>" joined by " + ".
private
ruleSummary(AdminParameterRuleInterface $rule) : string
Parameters
- $rule : AdminParameterRuleInterface
Return values
stringruleSummaryById()
Summarizes the rule by id (for the modal header).
private
ruleSummaryById(int $ruleId) : string
Parameters
- $ruleId : int
Return values
stringshowModal()
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