login.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. // Αρχείο: /var/www/html/hockey-cms/login.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. // Αν ο χρήστης είναι ήδη συνδεδεμένος, τον στέλνουμε ανάλογα με τον ρόλο του
  7. if (isset($_SESSION['user_id'])) {
  8. if (isset($_SESSION['role_id']) && ($_SESSION['role_id'] == 1 || ($_SESSION['is_seller'] ?? 0) == 1)) {
  9. header("Location: admin/index.php");
  10. } else {
  11. header("Location: index.php");
  12. }
  13. exit;
  14. }
  15. // --- Μηχανισμός Αλλαγής Γλώσσας ---
  16. if (isset($_GET['lang']) && in_array($_GET['lang'], ['el', 'en'])) {
  17. $_SESSION['lang'] = $_GET['lang'];
  18. }
  19. $current_lang = $_SESSION['lang'] ?? 'el';
  20. // --- Εύρεση Ενεργού Theme (Χωρίς backticks για αποφυγή σφαλμάτων) ---
  21. $active_theme = 'default';
  22. try {
  23. $stmt = $pdo->query("SELECT * FROM settings");
  24. while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  25. if (isset($row['key']) && $row['key'] === 'active_theme' && !empty($row['value'])) {
  26. $active_theme = trim($row['value']);
  27. }
  28. }
  29. } catch (Exception $e) {}
  30. $theme_dir = __DIR__ . '/themes/' . $active_theme;
  31. if (!is_dir($theme_dir)) {
  32. $active_theme = 'default';
  33. $theme_dir = __DIR__ . '/themes/default';
  34. }
  35. // --- Αρχικοποίηση Twig ---
  36. $loader = new \Twig\Loader\FilesystemLoader($theme_dir);
  37. $twig = new \Twig\Environment($loader, ['cache' => false]);
  38. $twig->addGlobal('session', $_SESSION);
  39. $twig->addGlobal('current_lang', $current_lang);
  40. // --- Φόρτωση Δυναμικών Κειμένων Site ---
  41. $siteTexts = [];
  42. try {
  43. $text_column = ($current_lang === 'en') ? 'text_value_en' : 'text_value_el';
  44. $textsStmt = $pdo->query("SELECT text_key, {$text_column} as text_value FROM site_texts");
  45. while ($row = $textsStmt->fetch(PDO::FETCH_ASSOC)) {
  46. $siteTexts[$row['text_key']] = $row['text_value'];
  47. }
  48. } catch (Exception $e) {}
  49. $twig->addGlobal('text', $siteTexts);
  50. // --- Φόρτωση Logo Site ---
  51. $site_logo = '';
  52. try {
  53. $stmtSettings = $pdo->query("SELECT * FROM settings");
  54. while ($row = $stmtSettings->fetch(PDO::FETCH_ASSOC)) {
  55. if (isset($row['key']) && $row['key'] === 'site_logo') {
  56. $site_logo = $row['value'];
  57. }
  58. }
  59. } catch (Exception $e) {}
  60. $twig->addGlobal('site_logo', $site_logo);
  61. // --- Μεταφράσεις για τη φόρμα σύνδεσης ---
  62. $translations = [
  63. 'el' => [
  64. 'page_title' => 'Σύνδεση - Hockey CMS',
  65. 'heading' => 'Καλώς ήρθατε',
  66. 'subheading' => 'Συνδεθείτε στον λογαριασμό σας',
  67. 'username' => 'Email ή Username',
  68. 'password' => 'Κωδικός Πρόσβασης',
  69. 'btn_login' => 'Σύνδεση',
  70. 'btn_google' => 'Σύνδεση με Google',
  71. 'register_text' => 'Δεν έχετε λογαριασμό;',
  72. 'register_link' => 'Εγγραφείτε εδώ',
  73. 'err_empty' => 'Παρακαλώ συμπληρώστε όλα τα πεδία.',
  74. 'err_invalid' => 'Λάθος στοιχεία σύνδεσης.'
  75. ],
  76. 'en' => [
  77. 'page_title' => 'Login - Hockey CMS',
  78. 'heading' => 'Welcome Back',
  79. 'subheading' => 'Sign in to your account',
  80. 'username' => 'Email or Username',
  81. 'password' => 'Password',
  82. 'btn_login' => 'Sign In',
  83. 'btn_google' => 'Sign in with Google',
  84. 'register_text' => "Don't have an account?",
  85. 'register_link' => 'Register here',
  86. 'err_empty' => 'Please fill in all fields.',
  87. 'err_invalid' => 'Invalid login credentials.'
  88. ]
  89. ];
  90. $t = $translations[$current_lang];
  91. $error = '';
  92. // --- Διαχείριση POST (Κλασικό Login) ---
  93. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  94. $username = trim($_POST['username'] ?? '');
  95. $password = $_POST['password'] ?? '';
  96. if (empty($username) || empty($password)) {
  97. $error = $t['err_empty'];
  98. } else {
  99. $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? OR email = ?");
  100. $stmt->execute([$username, $username]);
  101. $user = $stmt->fetch(PDO::FETCH_ASSOC);
  102. if ($user && password_verify($password, $user['password'])) {
  103. session_regenerate_id(true);
  104. $_SESSION['user_id'] = $user['id'];
  105. $_SESSION['username'] = $user['username'];
  106. $_SESSION['role_id'] = $user['role_id'];
  107. $_SESSION['first_name'] = $user['first_name'] ?? '';
  108. $_SESSION['is_seller'] = $user['is_seller'] ?? 0;
  109. if ($user['role_id'] == 1 || $user['is_seller'] == 1) {
  110. header("Location: admin/index.php");
  111. } else {
  112. header("Location: index.php");
  113. }
  114. exit;
  115. } else {
  116. $error = $t['err_invalid'];
  117. }
  118. }
  119. }
  120. // Render μέσω Twig από τον φάκελο του ενεργού theme
  121. echo $twig->render('login.html.twig', [
  122. 't' => $t,
  123. 'current_lang' => $current_lang,
  124. 'error' => $error,
  125. 'site_title' => 'Hockey Gear CMS'
  126. ]);