product.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. // Αρχείο: /var/www/html/hockey-cms/product.php
  3. if (session_status() === PHP_SESSION_NONE) { session_start(); }
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. require_once __DIR__ . '/config/database.php';
  6. // --- Μηχανισμός Αλλαγής Γλώσσας (Language Switcher) ---
  7. if (isset($_GET['lang']) && in_array($_GET['lang'], ['el', 'en'])) {
  8. $_SESSION['lang'] =$_GET['lang'];
  9. }
  10. $current_lang =$_SESSION['lang'] ?? 'el';
  11. // Δυναμική ανάγνωση ενεργού theme από τη βάση
  12. $active_theme = 'default';
  13. try {
  14. $stmt =$pdo->query("SELECT value FROM settings WHERE `key` = 'active_theme'");
  15. $res =$stmt->fetchColumn();
  16. if ($res) { $active_theme =$res; }
  17. } catch (Exception $e) {}
  18. $theme_dir = __DIR__ . '/themes/' .$active_theme;
  19. if (!is_dir($theme_dir)) {
  20. $active_theme = 'default';$theme_dir = __DIR__ . '/themes/default';
  21. }
  22. $loader = new \Twig\Loader\FilesystemLoader($theme_dir);
  23. $twig = new \Twig\Environment($loader, [
  24. 'cache' => false,
  25. ]);
  26. // Περνάμε Session και Γλώσσα στο Twig (για το header)
  27. $twig->addGlobal('session',$_SESSION);
  28. $twig->addGlobal('current_lang',$current_lang);
  29. // --- Φόρτωση Δυναμικών Κειμένων ανάλογα τη γλώσσα ---
  30. $siteTexts = [];
  31. try {
  32. $text_column = ($current_lang === 'en') ? 'text_value_en' : 'text_value_el';
  33. $textsStmt =$pdo->query("SELECT text_key, {$text_column} as text_value FROM site_texts");
  34. while ($row = $textsStmt->fetch(PDO::FETCH_ASSOC)) {$siteTexts[$row['text_key']] =$row['text_value'];
  35. }
  36. } catch (Exception $e) {}
  37. $twig->addGlobal('text',$siteTexts);
  38. // --- Φόρτωση Logo Site ---
  39. $site_logo = '';
  40. try {
  41. $logoStmt =$pdo->prepare("SELECT value FROM settings WHERE `key` = 'site_logo'");
  42. $logoStmt->execute();
  43. $site_logo =$logoStmt->fetchColumn();
  44. } catch (Exception $e) {}
  45. $twig->addGlobal('site_logo',$site_logo);
  46. // 1. Παίρνουμε το ID του προϊόντος από το URL
  47. $product_id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
  48. if ($product_id === 0) {
  49. die("Δεν επιλέχθηκε προϊόν.");
  50. }
  51. try {
  52. // 2. Φέρνουμε τα στοιχεία του προϊόντος, την κατηγορία (Δίγλωσσα) και τον πωλητή
  53. $stmt =$pdo->prepare("
  54. SELECT p.*, c.name_el as cat_name_el, c.name_en as cat_name_en, u.username as seller_name, pi.image_path
  55. FROM products p
  56. LEFT JOIN categories c ON p.category_id = c.id
  57. LEFT JOIN users u ON p.seller_id = u.id
  58. LEFT JOIN product_images pi ON (p.id = pi.product_id AND pi.is_primary = 1)
  59. WHERE p.id = ?
  60. ");
  61. $stmt->execute([$product_id]);
  62. $product =$stmt->fetch(PDO::FETCH_ASSOC);
  63. if (!$product) {
  64. die("Το προϊόν δεν βρέθηκε.");
  65. }
  66. // Ορισμός της σωστής γλώσσας για το όνομα της κατηγορίας του προϊόντος
  67. $product['cat_name'] = ($current_lang === 'en' && !empty($product['cat_name_en'])) ? $product['cat_name_en'] :$product['cat_name_el'];
  68. // 3. Φέρνουμε τα Δυναμικά Χαρακτηριστικά (Attributes) - Δίγλωσσα
  69. $attrStmt =$pdo->prepare("
  70. SELECT a.name as name_el, a.name_en, a.unit, pav.value
  71. FROM product_attribute_values pav
  72. JOIN attributes a ON pav.attribute_id = a.id
  73. WHERE pav.product_id = ?
  74. ORDER BY a.name
  75. ");
  76. $attrStmt->execute([$product_id]);
  77. $attributesRaw =$attrStmt->fetchAll(PDO::FETCH_ASSOC);
  78. // Μεταφράζουμε τα χαρακτηριστικά δυναμικά
  79. $attributes = [];
  80. foreach ($attributesRaw as $attr) {$attr['name'] = ($current_lang === 'en' && !empty($attr['name_en'])) ? $attr['name_en'] :$attr['name_el'];
  81. $attributes[] =$attr;
  82. }
  83. // 4. Φέρνουμε τις Κατηγορίες για το Sidebar μενού - Δίγλωσσα
  84. $categoriesRaw =$pdo->query("SELECT * FROM categories ORDER BY sort_order ASC, name_el ASC")->fetchAll(PDO::FETCH_ASSOC);
  85. $categories = [];
  86. foreach ($categoriesRaw as $cat) {$cat['display_name'] = ($current_lang === 'en' && !empty($cat['name_en'])) ? $cat['name_en'] :$cat['name_el'];
  87. $categories[] =$cat;
  88. }
  89. // 5. Render μέσω Twig του template
  90. echo $twig->render('product.html.twig', [
  91. 'site_title' => 'Hockey Gear CMS',
  92. 'categories' => $categories,
  93. 'product' => $product,
  94. 'attributes' => $attributes
  95. ]);
  96. } catch (Exception $e) {
  97. die("Σφάλμα συστήματος: " . $e->getMessage());
  98. }