db = $db; } /** * Pobiera baner po ID wraz z tłumaczeniami * * @param int $bannerId ID banera * @return array|null Dane banera lub null */ public function find(int $bannerId): ?array { $banner = $this->db->get('pp_banners', '*', ['id' => $bannerId]); if (!$banner) { return null; } $results = $this->db->select('pp_banners_langs', '*', ['id_banner' => $bannerId]); if (is_array($results)) { foreach ($results as $row) { $banner['languages'][$row['id_lang']] = $row; } } return $banner; } /** * Usuwa baner * * @param int $bannerId ID banera * @return bool Czy usunięto */ public function delete(int $bannerId): bool { $result = $this->db->delete('pp_banners', ['id' => $bannerId]); return $result !== false; } /** * Zapisuje baner (insert lub update) * * @param array $data Dane banera * @return int|false ID banera lub false */ public function save(array $data) { $bannerId = $data['id'] ?? null; $bannerData = [ 'name' => $data['name'], 'status' => $data['status'] == 'on' ? 1 : 0, 'date_start' => $data['date_start'] != '' ? $data['date_start'] : null, 'date_end' => $data['date_end'] != '' ? $data['date_end'] : null, 'home_page' => $data['home_page'] == 'on' ? 1 : 0, ]; if (!$bannerId) { $this->db->insert('pp_banners', $bannerData); $bannerId = $this->db->id(); if (!$bannerId) { return false; } } else { $this->db->update('pp_banners', $bannerData, ['id' => (int)$bannerId]); } $this->saveTranslations($bannerId, $data['src'], $data['url'], $data['html'], $data['text']); return (int)$bannerId; } /** * Zwraca liste banerow do panelu admin z filtrowaniem, sortowaniem i paginacja. * * @return array{items: array>, total: int} */ public function listForAdmin( array $filters, string $sortColumn = 'name', string $sortDir = 'ASC', int $page = 1, int $perPage = 15 ): array { $sortColumn = trim($sortColumn); $sortDir = strtoupper(trim($sortDir)); $allowedSortColumns = [ 'name' => 'b.name', 'status' => 'b.status', 'home_page' => 'b.home_page', 'date_start' => 'b.date_start', 'date_end' => 'b.date_end', ]; $sortSql = $allowedSortColumns[$sortColumn] ?? 'b.name'; $sortDir = $sortDir === 'DESC' ? 'DESC' : 'ASC'; $page = max(1, $page); $perPage = min(self::MAX_PER_PAGE, max(1, $perPage)); $offset = ($page - 1) * $perPage; $where = ['1=1']; $params = []; $name = trim((string)($filters['name'] ?? '')); if (strlen($name) > 255) { $name = substr($name, 0, 255); } if ($name !== '') { $where[] = 'b.name LIKE :name'; $params[':name'] = '%' . $name . '%'; } if (($filters['status'] ?? '') !== '' && ($filters['status'] === '0' || $filters['status'] === '1')) { $where[] = 'b.status = :status'; $params[':status'] = (int)$filters['status']; } $whereSql = implode(' AND ', $where); $sqlCount = " SELECT COUNT(0) FROM pp_banners AS b WHERE {$whereSql} "; $stmtCount = $this->db->query($sqlCount, $params); $countRows = $stmtCount ? $stmtCount->fetchAll() : []; $total = isset($countRows[0][0]) ? (int)$countRows[0][0] : 0; $sql = " SELECT b.id, b.name, b.status, b.home_page, b.date_start, b.date_end FROM pp_banners AS b WHERE {$whereSql} ORDER BY {$sortSql} {$sortDir}, b.id {$sortDir} LIMIT {$perPage} OFFSET {$offset} "; $stmt = $this->db->query($sql, $params); $items = $stmt ? $stmt->fetchAll() : []; return [ 'items' => is_array($items) ? $items : [], 'total' => $total, ]; } /** * Zapisuje tłumaczenia banera */ private function saveTranslations(int $bannerId, array $src, array $url, array $html, array $text): void { foreach ($src as $langId => $val) { $translationData = [ 'id_banner' => $bannerId, 'id_lang' => $langId, 'src' => $src[$langId], 'url' => $url[$langId], 'html' => $html[$langId], 'text' => $text[$langId], ]; $existingId = $this->db->get('pp_banners_langs', 'id', ['AND' => ['banner_id' => $bannerId, 'lang_id' => $langId]]); if ($existingId) { $this->db->update('pp_banners_langs', $translationData, ['id' => $existingId]); } else { $this->db->insert('pp_banners_langs', $translationData); } } } }