WebOrbiton
v1.0.0.0

StocketBase

97 lines · 3.1 KB
  1. <?php
  2. ​
  3. declare(strict_types=1);
  4. ​
  5. if (count(get_included_files()) === 1) {
  6. http_response_code(403);
  7. exit;
  8. }
  9. ​
  10. require_once __DIR__ . '/../includes/slugger.php';
  11. ​
  12. if (!Auth::hasRoleAtLeast(Auth::ROLE_STORE_OWNER)) {
  13. return;
  14. }
  15. ​
  16. $db = Database::site();
  17. ​
  18. $categoryId = (int) ($_POST['category_id'] ?? 0) ?: null;
  19. $name = trim((string) ($_POST['name'] ?? ''));
  20. $description = trim((string) ($_POST['description'] ?? ''));
  21. $parentId = (int) ($_POST['parent_id'] ?? 0) ?: null;
  22. $showInMenu = isset($_POST['show_in_menu']) ? 1 : 0;
  23. ​
  24. if ($name === '') {
  25. return;
  26. }
  27. ​
  28. $slug = Slugger::make($name);
  29. ​
  30. if ($categoryId !== null) {
  31. $previousMenu = $db->prepare('SELECT show_in_menu FROM categories WHERE id = :id LIMIT 1');
  32. try {
  33. $previousMenu->execute(['id' => $categoryId]);
  34. $wasInMenu = (int) $previousMenu->fetchColumn() === 1;
  35. } catch (PDOException $e) {
  36. $wasInMenu = true;
  37. }
  38. ​
  39. try {
  40. $statement = $db->prepare(
  41. 'UPDATE categories SET name = :name, slug = :slug, description = :description, parent_id = :parent_id, show_in_menu = :show_in_menu WHERE id = :id'
  42. );
  43. $statement->execute([
  44. 'name' => $name,
  45. 'slug' => $slug,
  46. 'description' => $description,
  47. 'parent_id' => $parentId,
  48. 'show_in_menu' => $showInMenu,
  49. 'id' => $categoryId,
  50. ]);
  51. ​
  52. if ($showInMenu === 1 && !$wasInMenu) {
  53. SiteFront::appendToCustomMenu('category', $categoryId);
  54. }
  55. } catch (PDOException $e) {
  56. error_log('StocketBase: save_category with show_in_menu failed, retrying without it: ' . $e->getMessage());
  57. $statement = $db->prepare(
  58. 'UPDATE categories SET name = :name, slug = :slug, description = :description, parent_id = :parent_id WHERE id = :id'
  59. );
  60. $statement->execute([
  61. 'name' => $name,
  62. 'slug' => $slug,
  63. 'description' => $description,
  64. 'parent_id' => $parentId,
  65. 'id' => $categoryId,
  66. ]);
  67. }
  68. } else {
  69. try {
  70. $statement = $db->prepare(
  71. 'INSERT INTO categories (name, slug, description, parent_id, show_in_menu, sort_order) VALUES (:name, :slug, :description, :parent_id, :show_in_menu, 0)'
  72. );
  73. $statement->execute([
  74. 'name' => $name,
  75. 'slug' => $slug,
  76. 'description' => $description,
  77. 'parent_id' => $parentId,
  78. 'show_in_menu' => $showInMenu,
  79. ]);
  80. ​
  81. if ($showInMenu === 1) {
  82. SiteFront::appendToCustomMenu('category', (int) $db->lastInsertId());
  83. }
  84. } catch (PDOException $e) {
  85. error_log('StocketBase: save_category with show_in_menu failed, retrying without it: ' . $e->getMessage());
  86. $statement = $db->prepare(
  87. 'INSERT INTO categories (name, slug, description, parent_id, sort_order) VALUES (:name, :slug, :description, :parent_id, 0)'
  88. );
  89. $statement->execute([
  90. 'name' => $name,
  91. 'slug' => $slug,
  92. 'description' => $description,
  93. 'parent_id' => $parentId,
  94. ]);
  95. }
  96. }
  97. ​