Віджети доставки
Віджети доставки дають змогу гнучко налаштовувати поля форми оформлення замовлення для різних способів доставки в sCommerce. Кожен спосіб доставки може мати власний Blade-шаблон, який відмалює потрібні поля.
Огляд
Починаючи з версії 1.x, sCommerce підтримує користувацькі віджети доставки на основі Blade-шаблонів. Це дозволяє:
- налаштовувати форму оформлення замовлення для кожного способу доставки;
- створювати проєктні реалізації доставки;
- інтегрувати сторонні сервіси (Нова Пошта, UPS тощо);
- підтримувати єдиний стиль серед усіх способів доставки.
Пошук шаблону
Шаблони шукаються у такому порядку:
-
Шаблони проєкту (найвищий пріоритет)
views/delivery/{delivery-name}.blade.php -
Шаблони з кастомного пакета
core/custom/packages/seiger/scommerce/views/delivery/{delivery-name}.blade.php -
Шаблони з пакета постачальника (найнижчий пріоритет)
core/vendor/seiger/scommerce/views/delivery/{delivery-name}.blade.php
Достатньо скопіювати файл у каталог із вищим пріоритетом, щоб перевизначити шаблон доставки.
Доступні змінні
Усі шаблони віджетів доставки отримують такі змінні:
$delivery
Масив із даними про спосіб доставки:
$delivery['name']— унікальний ідентифікатор (наприклад,courier,pickup);$delivery['title']— локалізована назва;$delivery['description']— локалізований опис.
$checkout
Масив із поточними даними оформлення:
$checkout['user']— інформація про користувача;$checkout['user']['address']— адреса (місто, вулиця, будинок, приміщення тощо);$checkout['cart']— дані кошика;- інша пов’язана інформація.
$settings
Масив із налаштуваннями способу доставки з адмінпанелі:
- набір ключів залежить від способу доставки;
- приклад кур’єра:
$settings['cities'],$settings['info']; - приклад самовивозу:
$settings['locations'].
Створення власного віджета доставки
Крок 1. Клас доставки
Створіть клас, що наслідує BaseDeliveryMethod:
<?php namespace App\Delivery;
use Seiger\sCommerce\Delivery\BaseDeliveryMethod;
class CustomDelivery extends BaseDeliveryMethod
{
public function getName(): string
{
return 'custom';
}
public function getType(): string
{
return "<b>Custom Delivery</b> (custom)";
}
public function getValidationRules(): array
{
return [
'delivery.custom.address' => 'required|string|max:255',
'delivery.custom.phone' => 'required|string',
];
}
public function calculateCost(array $order): float
{
return 50.00; // Фіксована вартість або власний розрахунок
}
public function defineFields(): array
{
return [
// Поля налаштувань для адмінпанелі
];
}
public function prepareSettings(array $data): string
{
return json_encode($data, JSON_UNESCAPED_UNICODE);
}
}
Крок 2. Шаблон віджета
Створіть Blade-шаблон для віджета доставки.
Файл: views/delivery/custom.blade.php
{{--
Custom Delivery Widget
Доступні змінні: $delivery, $checkout, $settings
--}}
<label class="form-label">
<input
type="text"
name="delivery[{{$delivery['name']}}][address]"
value="{{old('delivery.'.$delivery['name'].'.address', '')}}"
placeholder="Введіть адресу доставки"
required
/>
<span>Адреса доставки</span>
</label>
<label class="form-label">
<input
type="tel"
name="delivery[{{$delivery['name']}}][phone]"
placeholder="Номер телефону"
required
/>
<span>Контактний телефон</span>
</label>
Крок 3. Реєстрація способу доставки
Спосіб доставки буде зареєстровано автоматично, якщо його додати до бази з правильним іменем класу.
Приклади
Кур’єр
Шаблон за промовчанням: core/vendor/seiger/scommerce/views/delivery/courier.blade.php
Можливості:
- поле міста з швидким вибором;
- поля для вулиці, будинку, квартири;
- вибір отримувача (самостійно / інша особа).
Щоб кастомізувати, скопіюйте файл у views/delivery/courier.blade.php.
Самовивіз
Шаблон за промовчанням: core/vendor/seiger/scommerce/views/delivery/pickup.blade.php
Можливості:
- перемикачі для вибору пункту самовивозу;
- відображення всіх налаштованих адрес.
Кастомізація: views/delivery/pickup.blade.php.
Приклад інтеграції з Новою Поштою
Приклад: core/custom/packages/seiger/scommerce/views/delivery/nova-poshta.blade.php
Можливості:
- автодоповнення міста через API Нової Пошти;
- вибір відділення за містом;
- поля даних отримувача;
- приклад інтеграції JavaScript.
Правила іменування полів
Використовуйте формат:
name="delivery[{{$delivery['name']}}][field_name]"
Це гарантує коректну структуру даних для:
- валідації;
- збереження в замовленні;
- підтримки кількох способів доставки.
Використання віджетів у checkout
У шаблоні оформлення достатньо вивести віджет:
@foreach($deliveries as $delivery)
<div data-delivery="{{$delivery['name']}}">
{{-- Інформаційне повідомлення з налаштувань --}}
@if(isset($delivery['info']) && trim($delivery['info']))
<div class="message-info">
{!! nl2br(e($delivery['info'])) !!}
</div>
@endif
{{-- Віджет доставки --}}
{!! $delivery['widget'] !!}
</div>
@endforeach
У змінній $delivery['widget'] вже міститься згенерований HTML із шаблону доставки.
Розширені можливості
Додавання JavaScript
Використовуйте директиву @push('scripts'), щоб підключити скрипт:
<div id="delivery-{{$delivery['name']}}">
{{-- Ваші поля --}}
</div>
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
console.log('Delivery widget initialized');
});
</script>
@endpush
Умовні поля через Alpine.js
<div x-data="{ showAdvanced: false }">
<label>
<input type="checkbox" x-model="showAdvanced">
Показати додаткові опції
</label>
<div x-show="showAdvanced" x-transition>
{{-- Додаткові поля --}}
</div>
</div>
Інтеграція API
<div id="delivery-api-widget-{{$delivery['name']}}"></div>
@push('scripts')
<script src="https://api.delivery-service.com/widget.js"></script>
<script>
DeliveryServiceWidget.init({
container: '#delivery-api-widget-{{$delivery['name']}}',
apiKey: '{{$settings['api_key'] ?? ''}}',
onSelect: function(data) {
// Обробка вибору доставки
}
});
</script>
@endpush
Найкращі практики
- Завжди валідуюйте дані — визначайте правила у
getValidationRules(). - Використовуйте перекладні ключі — застосовуйте
__('key')для мультимовності. - Зберігайте введені дані — хелпер
old()допомагає відновити значення. - Пе ревіряйте існування налаштувань — переконайтеся, що ключі є в
$settings. - Зосереджуйте віджет на одній задачі — один віджет = один спосіб доставки.
- Документуйте складну логіку — додавайте коментарі.
- Тестуйте в різних браузерах — забезпечте сумісність.
Усунення проблем
Віджет не відображається
- Перевірте, чи існує шаблон у доступних шляхах.
- Переконайтеся, що клас доставки реалізує
DeliveryMethodInterface. - Перевірте лог
storage/logs/scommerce.log.