CoolCMS API

PaymentItems extends BaseComponent
in package
uses ModalAwareTrait, PrivilegeGuardTrait, OwnerContextGuardTrait

Renders and manages the payments (topping) of one advert ({@see PaymentItem}) in the advert 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 advert 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
Advert 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 advert.
loadItems()  : array<int, PaymentItem>
Returns the advert 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

$componentParameters

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

component parameters set by setComponentParameter()

$translatorDomain

protected string|null $translatorDomain = 'admin.bazaar.components.paymentItems'

$adding

Whether a new payment is being added (modal with an empty form).

private bool $adding = false

$advertId

Advert 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

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

handleAdd()

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 advert toped_until absolutely downwards (a deleted active item no longer tops the advert; 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
phpstan-assert-if-true

class-string $className

Return values
bool

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

setComponentParameter()

Sets a component parameter.

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

setOwnerContext()

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
static

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

contextOwnerId()

Owner id from the host context; null when the host edits nothing (fail-closed).

protected contextOwnerId() : int|null
Return values
int|null

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

requireContextOwner()

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
int

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

submittedOwnerId()

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

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

findItem()

Returns one item by id (for the edit prefill, the managed update on submit and the delete), only within the edited advert.

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

renderModalContent()

Renders the modal content (form or confirmation) to a string for `ModalWindow`.

private renderModalContent() : string
Return values
string

showModal()

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
Return values
NotTranslate
On this page

Search results