repository = $repository; } public function list(): string { $sortableColumns = ['id', 'name', 'status', 'apilo_payment_type_id']; $filterDefinitions = [ [ 'key' => 'name', 'label' => 'Nazwa', 'type' => 'text', ], [ 'key' => 'status', 'label' => 'Aktywny', 'type' => 'select', 'options' => [ '' => '- aktywny -', '1' => 'tak', '0' => 'nie', ], ], ]; $listRequest = \admin\Support\TableListRequestFactory::fromRequest( $filterDefinitions, $sortableColumns, 'id' ); $sortDir = $listRequest['sortDir']; if (trim((string)\Shared\Helpers\Helpers::get('sort')) === '') { $sortDir = 'ASC'; } $result = $this->repository->listForAdmin( $listRequest['filters'], $listRequest['sortColumn'], $sortDir, $listRequest['page'], $listRequest['perPage'] ); $apiloPaymentTypes = $this->getApiloPaymentTypes(); $rows = []; $lp = ($listRequest['page'] - 1) * $listRequest['perPage'] + 1; foreach ($result['items'] as $item) { $id = (int)($item['id'] ?? 0); $name = trim((string)($item['name'] ?? '')); $status = (int)($item['status'] ?? 0); $apiloPaymentTypeId = $item['apilo_payment_type_id'] ?? null; $apiloLabel = '-'; if ($apiloPaymentTypeId !== null) { $apiloKey = (string)$apiloPaymentTypeId; if (isset($apiloPaymentTypes[$apiloKey])) { $apiloLabel = $apiloPaymentTypes[$apiloKey]; } } $rows[] = [ 'lp' => $lp++ . '.', 'name' => '' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '', 'status' => $status === 1 ? 'tak' : 'nie', 'apilo_payment_type' => htmlspecialchars((string)$apiloLabel, ENT_QUOTES, 'UTF-8'), '_actions' => [ [ 'label' => 'Edytuj', 'url' => '/admin/shop_payment_method/edit/id=' . $id, 'class' => 'btn btn-xs btn-primary', ], ], ]; } $total = (int)$result['total']; $totalPages = max(1, (int)ceil($total / $listRequest['perPage'])); $viewModel = new PaginatedTableViewModel( [ ['key' => 'lp', 'label' => 'Lp.', 'class' => 'text-center', 'sortable' => false], ['key' => 'name', 'sort_key' => 'name', 'label' => 'Nazwa', 'sortable' => true, 'raw' => true], ['key' => 'status', 'sort_key' => 'status', 'label' => 'Aktywny', 'class' => 'text-center', 'sortable' => true, 'raw' => true], ['key' => 'apilo_payment_type', 'sort_key' => 'apilo_payment_type_id', 'label' => 'Typ platnosci Apilo', 'class' => 'text-center', 'sortable' => true], ], $rows, $listRequest['viewFilters'], [ 'column' => $listRequest['sortColumn'], 'dir' => $sortDir, ], [ 'page' => $listRequest['page'], 'per_page' => $listRequest['perPage'], 'total' => $total, 'total_pages' => $totalPages, ], array_merge($listRequest['queryFilters'], [ 'sort' => $listRequest['sortColumn'], 'dir' => $sortDir, 'per_page' => $listRequest['perPage'], ]), $listRequest['perPageOptions'], $sortableColumns, '/admin/shop_payment_method/list/', 'Brak danych w tabeli.' ); return \Shared\Tpl\Tpl::view('shop-payment-method/payment-methods-list', [ 'viewModel' => $viewModel, ]); } public function edit(): string { $paymentMethod = $this->repository->find((int)\Shared\Helpers\Helpers::get('id')); if ($paymentMethod === null) { \Shared\Helpers\Helpers::alert('Metoda platnosci nie zostala znaleziona.'); header('Location: /admin/shop_payment_method/list/'); exit; } return \Shared\Tpl\Tpl::view('shop-payment-method/payment-method-edit', [ 'form' => $this->buildFormViewModel($paymentMethod, $this->getApiloPaymentTypes()), ]); } public function save(): void { $payload = $_POST; $paymentMethodId = isset($payload['id']) && $payload['id'] !== '' ? (int)$payload['id'] : (int)\Shared\Helpers\Helpers::get('id'); $id = $this->repository->save($paymentMethodId, $payload); if ($id !== null) { echo json_encode([ 'success' => true, 'id' => (int)$id, 'message' => 'Metoda platnosci zostala zapisana.', ]); exit; } echo json_encode([ 'success' => false, 'errors' => ['general' => 'Podczas zapisywania metody platnosci wystapil blad.'], ]); exit; } private function buildFormViewModel(array $paymentMethod, array $apiloPaymentTypes): FormEditViewModel { $id = (int)($paymentMethod['id'] ?? 0); $name = (string)($paymentMethod['name'] ?? ''); $apiloOptions = ['' => '--- wybierz typ platnosci apilo.com ---']; foreach ($apiloPaymentTypes as $apiloId => $apiloName) { $apiloOptions[(string)$apiloId] = $apiloName; } $data = [ 'id' => $id, 'description' => (string)($paymentMethod['description'] ?? ''), 'status' => (int)($paymentMethod['status'] ?? 0), 'apilo_payment_type_id' => $paymentMethod['apilo_payment_type_id'] ?? '', 'min_order_amount' => $paymentMethod['min_order_amount'] ?? '', 'max_order_amount' => $paymentMethod['max_order_amount'] ?? '', 'is_cod' => (int)($paymentMethod['is_cod'] ?? 0), ]; $fields = [ FormField::hidden('id', $id), FormField::custom( 'name_preview', \Shared\Html\Html::input([ 'label' => 'Nazwa', 'name' => 'name_preview', 'id' => 'name_preview', 'value' => $name, 'type' => 'text', 'readonly' => true, ]), ['tab' => 'settings'] ), FormField::textarea('description', [ 'label' => 'Opis', 'tab' => 'settings', 'rows' => 5, ]), FormField::number('min_order_amount', [ 'label' => 'Min. kwota zamowienia (PLN)', 'tab' => 'settings', 'step' => 0.01, ]), FormField::number('max_order_amount', [ 'label' => 'Maks. kwota zamowienia (PLN)', 'tab' => 'settings', 'step' => 0.01, ]), FormField::select('apilo_payment_type_id', [ 'label' => 'Typ platnosci Apilo', 'tab' => 'settings', 'options' => $apiloOptions, ]), FormField::switch('is_cod', [ 'label' => 'Platnosc przy odbiorze', 'tab' => 'settings', ]), FormField::switch('status', [ 'label' => 'Aktywny', 'tab' => 'settings', ]), ]; $tabs = [ new FormTab('settings', 'Ustawienia', 'fa-wrench'), ]; $actionUrl = '/admin/shop_payment_method/save/id=' . $id; $actions = [ FormAction::save($actionUrl, '/admin/shop_payment_method/list/'), FormAction::cancel('/admin/shop_payment_method/list/'), ]; return new FormEditViewModel( 'shop-payment-method-edit', 'Edycja metody platnosci: ' . $name, $data, $fields, $tabs, $actions, 'POST', $actionUrl, '/admin/shop_payment_method/list/', true, ['id' => $id] ); } private function getApiloPaymentTypes(): array { global $mdb; $integrationsRepository = new IntegrationsRepository( $mdb ); $rawSetting = $integrationsRepository -> getSetting( 'apilo', 'payment-types-list' ); $raw = null; if (is_array($rawSetting)) { $raw = $rawSetting; } elseif (is_string($rawSetting)) { $decoded = @unserialize($rawSetting); if (is_array($decoded)) { $raw = $decoded; } else { $decodedJson = json_decode($rawSetting, true); if (is_array($decodedJson)) { $raw = $decodedJson; } } } if (!is_array($raw)) { return []; } if (isset($raw['message']) && isset($raw['code'])) { return []; } if (isset($raw['items']) && is_array($raw['items'])) { $raw = $raw['items']; } elseif (isset($raw['data']) && is_array($raw['data'])) { $raw = $raw['data']; } $list = []; foreach ($raw as $key => $paymentType) { if (is_array($paymentType)) { if (isset($paymentType['id'], $paymentType['name'])) { $list[(string)$paymentType['id']] = (string)$paymentType['name']; continue; } } elseif (is_scalar($paymentType)) { if (is_int($key) || (is_string($key) && preg_match('/^-?\d+$/', $key) === 1)) { $list[(string)$key] = (string)$paymentType; } } } return $list; } }