PaymentItems
extends BaseComponent
in package
uses
ModalAwareTrait, PrivilegeGuardTrait, OwnerContextGuardTrait
Renders and manages the payments (topping) of one company profile ({@see PaymentItem}) in the company profile edit form.
Keyed by advertId; the edit form renders it in the payments tab, a sibling of the other
tabs.
Usage:
{control paymentItems $advertId}
The list is a flat table of items. Adding and editing run in the shared admin
ModalWindow (mounted in
@layout.latte): the add! and edit! signals render _modal.latte to a string, fill the
modal with it and open it from PHP (showModal()). The form submits over ajax (.ajax);
after saving, the modal stays open (confirmation) and the list ({snippet itemList}) is
redrawn. advertId travels in a hidden field, not a persistent parameter, because the form
link('this') does not carry it.
Saving goes through the Admin PaymentItemManager, the ApiBridge and the Api manager.
The admin save sends the meta recalcTopedUntil, so the Api afterSave sets the company profile
toped_until absolutely: it can shorten it or set it to null on deactivation, a shorter
validity or zero active items. The other (front and gateway) paths stay monotonic and only extend.
Table of Contents
Properties
- $container : Container
- $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
- $adding : bool
- Whether a new payment is being added (modal with an empty form).
- $advertId : int
- Company profile whose payments the component manages. Not a persistent parameter: every signal passes it explicitly (`{link add! advertId => ...}`) and the hidden field `advertId` carries it into the submit.
- $editId : int|null
- Edited item (set by `handleEdit()` and the submit for the modal re-render); null when adding.
- $justSaved : bool
- Whether a payment was just saved; the modal stays open and shows a confirmation instead of the form.
- $ownerContextProvider : callable(): mixed|null
- $paymentItemManager : PaymentItemManager
- $tariffManager : TariffManager
Methods
- __call() : mixed
- Dispatches `renderXyz()` to `render('Xyz', ...$args)`.
- __construct() : mixed
- createComponent() : IComponent|null
- createComponentPaymentForm() : Form
- 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
- handleAdd() : void
- Opens the shared modal for adding a payment.
- handleDelete() : void
- Hard-deletes a payment item (the entity has no `deleted` flag).
- handleEdit() : void
- Opens the shared modal for editing a payment.
- hasServiceByType() : bool
- Returns whether the container has a service of the given type.
- initializeAllContexts() : void
- injectDeviceDetector() : void
- onCreate() : void
- onPaymentFormError() : void
- Handles failed validation (missing tariff, expired CSRF token) by redrawing the modal body with the errors.
- onPaymentFormSuccess() : void
- render() : void
- setAppContext() : $this
- setComponentParameter() : void
- Sets a component parameter.
- setCurrencyContext() : $this
- setLanguageContext() : $this
- setLocalizationContext() : $this
- setOwnerContext() : static
- Sets the host callback returning the id of the owner currently being edited (advert or post).
- setSettingContext() : $this
- setThemeContext() : $this
- setup() : void
- setupAppContext() : void
- typedComponent() : T
- Returns a subcomponent with a verified type.
- contextOwnerId() : int|null
- Owner id from the host context; null when the host edits nothing (fail-closed).
- 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.
- requireContextOwner() : int
- Signal gate: an owner id from a hand-built URL is usable only when it equals the host context; otherwise 403.
- 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
- submittedOwnerId() : int|null
- Owner for a form submit: the host context, or null when it is missing or the posted hidden id differs from it (a forged form of another record).
- 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).
- findItem() : PaymentItem|null
- Returns one item by id (for the edit prefill, the managed update on submit and the delete), only within the edited company profile.
- loadItems() : array<int, PaymentItem>
- Returns the company profile payments, newest first by insert time.
- renderModalContent() : string
- Renders the modal content (form or confirmation) to a string for `ModalWindow`.
- showModal() : void
- Fills and opens the shared admin `ModalWindow` with the current state (form or confirmation).
- tariffOptions() : array<int, NotTranslate>
- Returns a map of `tariffId` to tariff name (current language, falling back to the first non-empty one) for the select and the list.
- tr() : NotTranslate
- Returns a translated text wrapped in `NotTranslate`.
Properties
$container
public
Container
$container
Attributes
- #[Inject]
$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
= 'admin.comcat.components.paymentItems'
$adding
Whether a new payment is being added (modal with an empty form).
private
bool
$adding
= false
$advertId
Company profile whose payments the component manages. Not a persistent parameter: every signal passes it explicitly (`{link add! advertId => ...}`) and the hidden field `advertId` carries it into the submit.
private
int
$advertId
= 0
$editId
Edited item (set by `handleEdit()` and the submit for the modal re-render); null when adding.
private
int|null
$editId
= null
$justSaved
Whether a payment was just saved; the modal stays open and shows a confirmation instead of the form.
private
bool
$justSaved
= false
$ownerContextProvider
private
callable(): mixed|null
$ownerContextProvider
= null
$paymentItemManager read-only
private
PaymentItemManager
$paymentItemManager
$tariffManager read-only
private
TariffManager
$tariffManager
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(PaymentItemManager $paymentItemManager, TariffManager $tariffManager) : mixed
Parameters
- $paymentItemManager : PaymentItemManager
- $tariffManager : TariffManager
createComponent()
public
createComponent(string $name) : IComponent|null
Parameters
- $name : string
Return values
IComponent|nullcreateComponentPaymentForm()
public
createComponentPaymentForm() : 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|nullhandleAdd()
Opens the shared modal for adding a payment.
public
handleAdd(int $advertId) : void
Parameters
- $advertId : int
handleDelete()
Hard-deletes a payment item (the entity has no `deleted` flag).
public
handleDelete(int $advertId, int $id) : void
The link is not ajax (the styled data-grid-confirm does not combine with naja .ajax),
so after the delete it redirects (PRG) to the edit form; the browser keeps the link fragment
#adv-tab-payments after the 302, so the payments tab stays open.
NOTE: after the delete, the Api PaymentItemManager::delete() recomputes the company profile
toped_until absolutely downwards (a deleted active item no longer tops the company profile; zero
active items give null). The delete and the recompute run atomically in one transaction;
the gateway and front paths stay monotonic.
Parameters
- $advertId : int
- $id : int
Attributes
- #[Requires]
- $methods: 'POST'
handleEdit()
Opens the shared modal for editing a payment.
public
handleEdit(int $advertId, int $id) : void
Parameters
- $advertId : int
- $id : 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
onCreate()
public
onCreate() : void
onPaymentFormError()
Handles failed validation (missing tariff, expired CSRF token) by redrawing the modal body with the errors.
public
onPaymentFormError(Form $form) : void
Parameters
- $form : Form
onPaymentFormSuccess()
public
onPaymentFormSuccess(Form $form, ArrayHash<string|int, mixed> $values) : void
Parameters
- $form : Form
- $values : ArrayHash<string|int, mixed>
render()
public
render([int|null $advertId = null ]) : void
Parameters
- $advertId : 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
$thissetOwnerContext()
Sets the host callback returning the id of the owner currently being edited (advert or post).
public
setOwnerContext(callable(): mixed $provider) : static
It is called on every use, so a value from an earlier request never lingers.
Parameters
- $provider : callable(): mixed
Return values
staticsetSettingContext()
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
TcontextOwnerId()
Owner id from the host context; null when the host edits nothing (fail-closed).
protected
contextOwnerId() : int|null
Return values
int|nullfrontPresenter()
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
boolrequireContextOwner()
Signal gate: an owner id from a hand-built URL is usable only when it equals the host context; otherwise 403.
protected
requireContextOwner(int $ownerId) : int
Parameters
- $ownerId : int
Return values
intrequirePrivilege()
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
selfsubmittedOwnerId()
Owner for a form submit: the host context, or null when it is missing or the posted hidden id differs from it (a forged form of another record).
protected
submittedOwnerId(mixed $postedOwnerId) : int|null
Parameters
- $postedOwnerId : mixed
Return values
int|nullcreateMultiplierComponent()
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|nullfindItem()
Returns one item by id (for the edit prefill, the managed update on submit and the delete), only within the edited company profile.
private
findItem(int $id) : PaymentItem|null
A foreign item and a missing host context both count as not found.
Parameters
- $id : int
Return values
PaymentItem|nullloadItems()
Returns the company profile payments, newest first by insert time.
private
loadItems() : array<int, PaymentItem>
Return values
array<int, PaymentItem>renderModalContent()
Renders the modal content (form or confirmation) to a string for `ModalWindow`.
private
renderModalContent() : string
Return values
stringshowModal()
Fills and opens the shared admin `ModalWindow` with the current state (form or confirmation).
private
showModal() : void
Idempotent: it is called again after the submit and redraws only the body (the modal stays open).
tariffOptions()
Returns a map of `tariffId` to tariff name (current language, falling back to the first non-empty one) for the select and the list.
private
tariffOptions() : array<int, NotTranslate>
There are few tariffs, so all are loaded at once.
Return values
array<int, NotTranslate>tr()
Returns a translated text wrapped in `NotTranslate`.
private
tr(string $key) : NotTranslate
IMPORTANT: the result goes into setPrompt() and setRequired() on a field with
setTranslator(null). The prompt and items respect the per-control override, but Nette
getLabel() and Validator::formatMessage() (the rule error message) always take the
translator from the form. Without NotTranslate the ready text would be translated again as
a key and Tracy would report a missing translation.
Parameters
- $key : string