v1.0.0.1
StocketBase
- <?php
-
- declare(strict_types=1);
-
- function featuredBannerArticles(PDO $db, array $settings): array
- {
- $featuredBannerArticles = [];
- if (($settings['featured_banner_enabled'] ?? '0') !== '1') {
- return $featuredBannerArticles;
- }
-
- if (($settings['featured_banner_mode'] ?? 'static') === 'static') {
- $featuredIds = [];
- for ($featuredIndex = 1; $featuredIndex <= 5; $featuredIndex++) {
- $featuredId = (int) ($settings['featured_banner_product_' . $featuredIndex] ?? 0);
- if ($featuredId > 0 && !in_array($featuredId, $featuredIds, true)) {
- $featuredIds[] = $featuredId;
- }
- }
-
- if (!empty($featuredIds)) {
- $placeholders = implode(',', array_fill(0, count($featuredIds), '?'));
- $featuredStatement = $db->prepare(
- "SELECT a.*, c.name AS category_name FROM products a LEFT JOIN categories c ON c.id = a.category_id WHERE a.status = 'published' AND a.id IN ($placeholders)"
- );
- $featuredStatement->execute($featuredIds);
- $featuredById = [];
- foreach ($featuredStatement->fetchAll() as $featuredArticle) {
- $featuredById[(int) $featuredArticle['id']] = $featuredArticle;
- }
- foreach ($featuredIds as $featuredId) {
- if (isset($featuredById[$featuredId])) {
- $featuredBannerArticles[] = $featuredById[$featuredId];
- }
- }
- }
-
- return $featuredBannerArticles;
- }
-
- $windowValue = max(1, min(720, (int) ($settings['featured_banner_auto_window_value'] ?? 24)));
- $windowUnit = ($settings['featured_banner_auto_window_unit'] ?? 'hours') === 'minutes' ? 'minutes' : 'hours';
- $windowMinutes = $windowUnit === 'hours' ? $windowValue * 60 : $windowValue;
- $cutoff = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
- ->modify('-' . $windowMinutes . ' minutes')
- ->format('Y-m-d H:i:s');
- $automaticStatement = $db->prepare(
- "SELECT a.*, c.name AS category_name FROM products a LEFT JOIN categories c ON c.id = a.category_id
- WHERE a.status = 'published' AND a.published_at >= :cutoff
- ORDER BY a.views_count DESC, a.published_at DESC, a.id DESC"
- );
- $automaticStatement->execute(['cutoff' => $cutoff]);
- $automaticArticles = $automaticStatement->fetchAll();
- $categoryMode = $settings['featured_banner_auto_category_mode'] ?? 'mixed';
-
- if ($categoryMode === 'one_per_category') {
- $usedCategories = [];
- foreach ($automaticArticles as $automaticArticle) {
- $categoryKey = (string) ($automaticArticle['category_id'] ?? 'none');
- if (isset($usedCategories[$categoryKey])) {
- continue;
- }
- $usedCategories[$categoryKey] = true;
- $featuredBannerArticles[] = $automaticArticle;
- if (count($featuredBannerArticles) === 5) {
- break;
- }
- }
- } elseif ($categoryMode === 'mixed') {
- $byCategory = [];
- foreach ($automaticArticles as $automaticArticle) {
- $categoryKey = (string) ($automaticArticle['category_id'] ?? 'none');
- $byCategory[$categoryKey][] = $automaticArticle;
- }
- while (count($featuredBannerArticles) < 5 && !empty($byCategory)) {
- foreach ($byCategory as $categoryKey => $categoryArticles) {
- if (!empty($categoryArticles)) {
- $featuredBannerArticles[] = array_shift($byCategory[$categoryKey]);
- }
- if (empty($byCategory[$categoryKey])) {
- unset($byCategory[$categoryKey]);
- }
- if (count($featuredBannerArticles) === 5) {
- break;
- }
- }
- }
- } else {
- $featuredBannerArticles = array_slice($automaticArticles, 0, 5);
- }
-
- return $featuredBannerArticles;
- }
-
- function featuredExcludedIds(array $settings, array $featuredBannerArticles): array
- {
- if (($settings['featured_banner_enabled'] ?? '0') !== '1' || ($settings['featured_banner_hide_duplicates'] ?? '0') !== '1') {
- return [];
- }
-
- return array_values(array_map(static fn (array $article): int => (int) $article['id'], $featuredBannerArticles));
- }
-