Save.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Models\Config;
  10. use ForkBB\Models\Method;
  11. use ForkBB\Models\Config\Config;
  12. class Save extends Method
  13. {
  14. /**
  15. * Сохраняет изменения модели в БД
  16. * Удаляет кеш
  17. */
  18. public function save(): Config
  19. {
  20. $modified = $this->model->getModified();
  21. if (empty($modified)) {
  22. return $this->model;
  23. }
  24. $values = $this->model->getAttrs();
  25. foreach ($modified as $name) {
  26. if (\array_key_exists($name, $values)) {
  27. switch ($name[0]) {
  28. case 'a':
  29. $value = \json_encode($values[$name], \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE | \JSON_THROW_ON_ERROR);
  30. break;
  31. case 'b':
  32. $value = $values[$name] ? '1' : '0';
  33. break;
  34. case 'i':
  35. if (null !== $values[$name]) {
  36. $value = (string) $values[$name];
  37. break;
  38. }
  39. default:
  40. $value = $values[$name];
  41. break;
  42. }
  43. $vars = [
  44. ':value' => $value,
  45. ':name' => $name
  46. ];
  47. switch ($this->c->DB->getType()) {
  48. case 'mysql':
  49. $query = 'INSERT INTO ::config (conf_name, conf_value)
  50. VALUES (?s:name, ?s:value)
  51. ON DUPLICATE KEY UPDATE conf_value=?s:value';
  52. break;
  53. case 'sqlite':
  54. case 'pgsql':
  55. $query = 'INSERT INTO ::config (conf_name, conf_value)
  56. VALUES (?s:name, ?s:value)
  57. ON CONFLICT(conf_name) DO UPDATE SET conf_value=?s:value';
  58. break;
  59. default:
  60. $query = 'UPDATE ::config
  61. SET conf_value=?s:value
  62. WHERE conf_name=?s:name';
  63. $this->c->DB->exec($query, $vars);
  64. $query = 'INSERT INTO ::config (conf_name, conf_value)
  65. SELECT ?s:name, ?s:value
  66. FROM ::groups
  67. WHERE NOT EXISTS (
  68. SELECT 1
  69. FROM ::config
  70. WHERE conf_name=?s:name
  71. )
  72. LIMIT 1';
  73. break;
  74. }
  75. } else {
  76. $vars = [
  77. ':name' => $name
  78. ];
  79. $query = 'DELETE FROM ::config
  80. WHERE conf_name=?s:name';
  81. }
  82. $this->c->DB->exec($query, $vars);
  83. }
  84. return $this->model->reset();
  85. }
  86. }