WebOrbiton
v1.0.0.0

StocketBase

103 lines · 4.3 KB
  1. <?php
  2. ​
  3. declare(strict_types=1);
  4. ​
  5. function featuredBannerArticles(PDO $db, array $settings): array
  6. {
  7. $featuredBannerArticles = [];
  8. if (($settings['featured_banner_enabled'] ?? '0') !== '1') {
  9. return $featuredBannerArticles;
  10. }
  11. ​
  12. if (($settings['featured_banner_mode'] ?? 'static') === 'static') {
  13. $featuredIds = [];
  14. for ($featuredIndex = 1; $featuredIndex <= 5; $featuredIndex++) {
  15. $featuredId = (int) ($settings['featured_banner_product_' . $featuredIndex] ?? 0);
  16. if ($featuredId > 0 && !in_array($featuredId, $featuredIds, true)) {
  17. $featuredIds[] = $featuredId;
  18. }
  19. }
  20. ​
  21. if (!empty($featuredIds)) {
  22. $placeholders = implode(',', array_fill(0, count($featuredIds), '?'));
  23. $featuredStatement = $db->prepare(
  24. "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)"
  25. );
  26. $featuredStatement->execute($featuredIds);
  27. $featuredById = [];
  28. foreach ($featuredStatement->fetchAll() as $featuredArticle) {
  29. $featuredById[(int) $featuredArticle['id']] = $featuredArticle;
  30. }
  31. foreach ($featuredIds as $featuredId) {
  32. if (isset($featuredById[$featuredId])) {
  33. $featuredBannerArticles[] = $featuredById[$featuredId];
  34. }
  35. }
  36. }
  37. ​
  38. return $featuredBannerArticles;
  39. }
  40. ​
  41. $windowValue = max(1, min(720, (int) ($settings['featured_banner_auto_window_value'] ?? 24)));
  42. $windowUnit = ($settings['featured_banner_auto_window_unit'] ?? 'hours') === 'minutes' ? 'minutes' : 'hours';
  43. $windowMinutes = $windowUnit === 'hours' ? $windowValue * 60 : $windowValue;
  44. $cutoff = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
  45. ->modify('-' . $windowMinutes . ' minutes')
  46. ->format('Y-m-d H:i:s');
  47. $automaticStatement = $db->prepare(
  48. "SELECT a.*, c.name AS category_name FROM products a LEFT JOIN categories c ON c.id = a.category_id
  49. WHERE a.status = 'published' AND a.published_at >= :cutoff
  50. ORDER BY a.views_count DESC, a.published_at DESC, a.id DESC"
  51. );
  52. $automaticStatement->execute(['cutoff' => $cutoff]);
  53. $automaticArticles = $automaticStatement->fetchAll();
  54. $categoryMode = $settings['featured_banner_auto_category_mode'] ?? 'mixed';
  55. ​
  56. if ($categoryMode === 'one_per_category') {
  57. $usedCategories = [];
  58. foreach ($automaticArticles as $automaticArticle) {
  59. $categoryKey = (string) ($automaticArticle['category_id'] ?? 'none');
  60. if (isset($usedCategories[$categoryKey])) {
  61. continue;
  62. }
  63. $usedCategories[$categoryKey] = true;
  64. $featuredBannerArticles[] = $automaticArticle;
  65. if (count($featuredBannerArticles) === 5) {
  66. break;
  67. }
  68. }
  69. } elseif ($categoryMode === 'mixed') {
  70. $byCategory = [];
  71. foreach ($automaticArticles as $automaticArticle) {
  72. $categoryKey = (string) ($automaticArticle['category_id'] ?? 'none');
  73. $byCategory[$categoryKey][] = $automaticArticle;
  74. }
  75. while (count($featuredBannerArticles) < 5 && !empty($byCategory)) {
  76. foreach ($byCategory as $categoryKey => $categoryArticles) {
  77. if (!empty($categoryArticles)) {
  78. $featuredBannerArticles[] = array_shift($byCategory[$categoryKey]);
  79. }
  80. if (empty($byCategory[$categoryKey])) {
  81. unset($byCategory[$categoryKey]);
  82. }
  83. if (count($featuredBannerArticles) === 5) {
  84. break;
  85. }
  86. }
  87. }
  88. } else {
  89. $featuredBannerArticles = array_slice($automaticArticles, 0, 5);
  90. }
  91. ​
  92. return $featuredBannerArticles;
  93. }
  94. ​
  95. function featuredExcludedIds(array $settings, array $featuredBannerArticles): array
  96. {
  97. if (($settings['featured_banner_enabled'] ?? '0') !== '1' || ($settings['featured_banner_hide_duplicates'] ?? '0') !== '1') {
  98. return [];
  99. }
  100. ​
  101. return array_values(array_map(static fn (array $article): int => (int) $article['id'], $featuredBannerArticles));
  102. }
  103. ​