Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 22 additions & 13 deletions docs/en/developers/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -162,27 +162,36 @@ Event::listen('sCommerce.ResolveProductDeposit', function (array $payload) {

### sCommerce.CheckoutValidationRules

Dispatched by `sCheckout::getValidationRules(array $data)` after base rules and selected delivery-method rules have been merged.
`getValidationRules(array $data, string $context = 'default')` is the single source
of standard, delivery and plugin rules. Normal checkout uses user, delivery
and payment fields; quick checkout uses quantity, phone and email fields.
Disabled delivery/payment features do not require their corresponding method.
Both sets include product array and integer quantity rules.

- `data`: the input data passed to `getValidationRules()`.
- `rules`: the final rules array, passed by reference. Add or replace keys, or use `unset()` to remove a rule.

Place the listener in `core/custom/packages/main/plugins/sCommerceEvents.php` when the main service provider loads that directory. Modify `rules` directly; returned arrays are not applied. Listeners see changes made by earlier listeners, so a later listener can overwrite them.
The Laravel Event payload contains `data`, `rules` passed by reference, and
`context` (`default` by default, `quick` for quick orders). Modify `rules` in place; return values are
ignored. Later listeners see earlier changes. A switch selects the base rules;
other contexts start with normal checkout rules and remain available to plugins.

```php
use Illuminate\Support\Facades\Event;

Event::listen('sCommerce.CheckoutValidationRules', function (array $params) {
$rules = &$params['rules'];
$data = $params['data'];

$rules['user.email'] = 'nullable|email|max:255';
$rules['user.first_name'] = ['required', 'string', 'max:100'];
unset($rules['user.middle_name']);
Event::listen('sCommerce.CheckoutValidationRules', function (array $params): void {
if ($params['context'] === 'default') $params['rules']['user.email'] = 'nullable|email';
$params['rules']['products'][] = function ($field, $items, $fail) {
// Project checks; call $fail('Message') to reject.
};
});
```

`setOrderData()` subsequently filters the rules to keys present in the submitted data. Adding `required` here does not make an omitted field mandatory in that partial update. Removing a rule also removes that field from this validation path; it does not automatically persist arbitrary fields. Use [`sCommerce.BeforeOrderCreate`](#scommercebeforeordercreate) to store project fields in the order `meta`. When no cart line requires shipping, `delivery.method` is already removed before this event. Quick-order validation uses its own rules and does not call this hook.
`setOrderData()` keeps its partial-update behavior: only rules for submitted
fields are applied. `processOrder()` validates prepared server order data
against the full same rule set before persistence and payment, including when
called directly. Quick checkout invokes the validator and this event once, after preparing
server product lines. Submitted quantities stay uncast in both input and lines;
integer conversion, single-product totals and deposits follow successful validation. Request-supplied `products` are ignored and replaced with
the actual product or cart lines; partial forms without products skip that rule.
The package contains no project-specific minimum attribute or policy class.

These three events use the exact names documented on this page, without the `evolution.` prefix. The previous price-event names `evolution.sCommerceResolveProductPriceMode` and `evolution.sCommerceResolveProductPrice` are no longer dispatched; update project listeners and sPricing together with sCommerce.

Expand Down
34 changes: 21 additions & 13 deletions docs/ru/developers/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,27 +190,35 @@ Event::listen('sCommerce.ResolveProductDeposit', function (array $payload) {

### sCommerce.CheckoutValidationRules

Вызывается в `sCheckout::getValidationRules(array $data)` после объединения базовых правил с правилами выбранного способа доставки.
`getValidationRules(array $data, string $context = 'default')` — единая точка
формирования стандартных правил, правил доставки и плагинов. Обычное
оформление проверяет пользователя, доставку и оплату; быстрое — количество,
телефон и email. Отключённые доставка/оплата не требуют соответствующего метода.
Оба набора содержат правила массива товаров и целого положительного количества.

- `data` — входные данные, переданные в `getValidationRules()`.
- `rules` — итоговый массив правил по ссылке. Можно добавлять и заменять ключи или удалять их через `unset()`.

Разместите слушатель в `core/custom/packages/main/plugins/sCommerceEvents.php`, если service provider пакета main загружает эту папку. Изменяйте `rules` напрямую: возвращённый массив не применяется. Каждый следующий слушатель видит изменения предыдущих и может их переопределить.
Laravel Event передаёт `data`, `rules` по ссылке и `context`
(по умолчанию `default`, для быстрого заказа — `quick`). Изменяйте `rules` непосредственно; результат возврата
игнорируется. Следующие слушатели видят предыдущие изменения. Базовый набор выбирается через switch; другие контексты получают правила обычного оформления и доступны плагинам.

```php
use Illuminate\Support\Facades\Event;

Event::listen('sCommerce.CheckoutValidationRules', function (array $params) {
$rules = &$params['rules'];
$data = $params['data'];

$rules['user.email'] = 'nullable|email|max:255';
$rules['user.first_name'] = ['required', 'string', 'max:100'];
unset($rules['user.middle_name']);
Event::listen('sCommerce.CheckoutValidationRules', function (array $params): void {
if ($params['context'] === 'default') $params['rules']['user.email'] = 'nullable|email';
$params['rules']['products'][] = function ($field, $items, $fail) {
// Правила проекта; $fail('Сообщение') отклоняет оформление.
};
});
```

`setOrderData()` затем оставляет только правила для ключей, присутствующих в переданных данных. Поэтому добавление `required` не делает отсутствующее поле обязательным при таком частичном обновлении. Удаление правила также исключает поле из этого пути валидации, а не обеспечивает сохранение произвольных полей. Чтобы сохранить поля проекта в `meta` заказа, используйте [`sCommerce.BeforeOrderCreate`](#scommercebeforeordercreate). Если ни одна строка корзины не требует доставки, `delivery.method` удаляется ещё до этого события. Быстрый заказ использует собственные правила и не вызывает этот хук.
`setOrderData()` сохраняет частичную проверку только переданных полей.
`processOrder()` проверяет подготовленные серверные данные тем же полным
набором правил до записи и оплаты, в том числе при прямом вызове. Быстрое
оформление вызывает валидатор и это событие один раз после подготовки серверных
позиций. Количество во вводе и позициях сохраняется без приведения к int;
преобразование, сумма отдельного товара и залог рассчитываются после проверки. `products` из запроса игнорируется: используются фактический товар или
корзина. Частичная форма без товаров не запускает правило products.
Атрибута минимума и отдельного класса политики проекта в пакете нет.

Для этих трёх событий используйте точные имена с этой страницы, без префикса `evolution.`. Предыдущие ценовые события `evolution.sCommerceResolveProductPriceMode` и `evolution.sCommerceResolveProductPrice` больше не вызываются; обновляйте слушатели проекта и sPricing вместе с sCommerce.

Expand Down
1 change: 1 addition & 0 deletions docs/uk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ php artisan migrate
- [Початок роботи](./getting-started.md)
- [Керування магазином](./admin/index.md)
- [Розробнику](./developers/index.md)
- [Події валідації оформлення](developers/events.md#scommercecheckoutvalidationrules)
- [API / sApi](./developers/api.md)
- [CSV-імпорт та експорт](./admin/import-export.md)

Expand Down
3 changes: 2 additions & 1 deletion docs/uk/attributes/physical-properties.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@
Копіювання товару переносить фізичні параметри звичайним копіюванням атрибутів,
без статичних полів. Перед дублюванням менеджер зберігає джерельний товар, щоб перенести
його додатні колонки. CSV використовує атрибути; старі вхідні ключі також
перетворюються на явний запис атрибута. Кошик і швидке замовлення використовують
перетворюються на явний запис атрибута. Кошик повертає налаштовані поля товару та атрибути для відображення, без
автоматичного додавання всіх фізичних параметрів. Швидке замовлення використовує
`$product->physicalPayload()`. Вимірювання, яке неможливо прочитати, не потрапляє
в рядок і записується в лог, а покупка не зривається. Інтеграції доставки ніколи
не отримують вигаданого числа.
Expand Down
35 changes: 22 additions & 13 deletions docs/uk/developers/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,27 +190,36 @@ Event::listen('sCommerce.ResolveProductDeposit', function (array $payload) {

### sCommerce.CheckoutValidationRules

Викликається в `sCheckout::getValidationRules(array $data)` після об’єднання базових правил із правилами вибраного способу доставки.
`getValidationRules(array $data, string $context = 'default')` — єдина точка
формування стандартних правил, правил доставки та плагінів. Звичайне
оформлення перевіряє користувача, доставку й оплату; швидке — кількість,
телефон та email. Вимкнені доставка/оплата не вимагають відповідного методу.
Обидва набори містять правила масиву товарів і цілої додатної кількості.

- `data` — вхідні дані, передані в `getValidationRules()`.
- `rules` — підсумковий масив правил за посиланням. Можна додавати й замінювати ключі або видаляти їх через `unset()`.

Розмістіть слухач у `core/custom/packages/main/plugins/sCommerceEvents.php`, якщо service provider пакета main завантажує цю папку. Змінюйте `rules` безпосередньо: повернений масив не застосовується. Кожен наступний слухач бачить зміни попередніх і може їх перевизначити.
Laravel Event передає `data`, `rules` за посиланням та `context`
(типово `default`, для швидкого замовлення — `quick`). Змінюйте `rules` безпосередньо; повернення ігнорується.
Наступні слухачі бачать попередні зміни. Базовий набір обирається через switch; інші контексти отримують правила звичайного оформлення та доступні плагінам.

```php
use Illuminate\Support\Facades\Event;

Event::listen('sCommerce.CheckoutValidationRules', function (array $params) {
$rules = &$params['rules'];
$data = $params['data'];

$rules['user.email'] = 'nullable|email|max:255';
$rules['user.first_name'] = ['required', 'string', 'max:100'];
unset($rules['user.middle_name']);
Event::listen('sCommerce.CheckoutValidationRules', function (array $params): void {
if ($params['context'] === 'default') $params['rules']['user.email'] = 'nullable|email';
$params['rules']['products'][] = function ($field, $items, $fail) {
// Правила проєкту; $fail('Повідомлення') відхиляє оформлення.
};
});
```

`setOrderData()` потім залишає лише правила для ключів, наявних у переданих даних. Тому доданий `required` не робить відсутнє поле обов’язковим під час такого часткового оновлення. Видалення правила також виключає поле з цього шляху валідації, а не забезпечує збереження довільних полів. Щоб зберегти поля проєкту в `meta` замовлення, використовуйте [`sCommerce.BeforeOrderCreate`](#scommercebeforeordercreate). Якщо жоден рядок кошика не потребує доставки, `delivery.method` видаляється ще до цієї події. Швидке замовлення має власні правила та не викликає цей хук.
`setOrderData()` зберігає часткову валідацію лише переданих полів.
`processOrder()` перевіряє підготовлені серверні дані тим самим повним набором
правил перед записом і оплатою, зокрема за прямого виклику. Швидке оформлення
викликає валідатор і цю подію один раз після підготовки серверних позицій.
Кількість у введенні та позиціях залишається без приведення до int; перетворення,
сума окремого товару та заставна вартість розраховуються після успішної перевірки.
`products` із запиту ігнорується: використовуються фактичний товар або кошик.
Часткові форми без товарів не запускають правило для products.
Атрибута мінімуму та окремого класу політики проєкту в пакеті немає.

Для цих трьох подій використовуйте точні назви з цієї сторінки, без префікса `evolution.`. Попередні цінові події `evolution.sCommerceResolveProductPriceMode` і `evolution.sCommerceResolveProductPrice` більше не викликаються; оновлюйте проєктні слухачі та sPricing разом із sCommerce.

Expand Down
5 changes: 2 additions & 3 deletions src/Cart/sCart.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@
use Seiger\sCommerce\Services\sPriceResolver;

/**
* Build cart payloads from current product pricing, attributes and delivery measurements.
* Physical values are read explicitly from attributes, never legacy columns; unreadable ones are left out.
* Build cart payloads from configured product fields, pricing and displayed attributes.
*/
class sCart
{
Expand Down Expand Up @@ -362,7 +361,7 @@ private function getProductFields(object $product, array $pricing = []): ?array

$productFields = array_merge($product->only($this->productDetails), $pricing);

return array_merge($productFields, $attributes, $product->physicalPayload());
return array_merge($productFields, $attributes);
}

/**
Expand Down
Loading
Loading