Skouter mortgage estimates. Web application with view written in PHP and Vue, but controller and models in Go.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

AdminForm.php 4.1 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /**
  3. * @package Grav\Plugin\Admin
  4. *
  5. * @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Plugin\Admin;
  9. use ArrayAccess;
  10. use Exception;
  11. use Grav\Common\Data\Blueprint;
  12. use Grav\Common\Data\Data;
  13. use Grav\Framework\Form\Interfaces\FormFlashInterface;
  14. use Grav\Framework\Form\Interfaces\FormInterface;
  15. use Grav\Framework\Form\Traits\FormTrait;
  16. use InvalidArgumentException;
  17. use JsonSerializable;
  18. /**
  19. * Class AdminForm
  20. * @package Grav\Plugin\Admin
  21. */
  22. class AdminForm implements FormInterface, JsonSerializable
  23. {
  24. use FormTrait;
  25. /** @var string */
  26. protected $nonce_name;
  27. /** @var string */
  28. protected $nonce_action;
  29. /** @var callable */
  30. protected $submitMethod;
  31. /**
  32. * AdminForm constructor.
  33. *
  34. * @param string $name
  35. * @param array $options
  36. */
  37. public function __construct(string $name, array $options)
  38. {
  39. $this->name = $name;
  40. $this->nonce_name = $options['nonce_name'] ?? 'admin-nonce';
  41. $this->nonce_action = $options['nonce_action'] ?? 'admin-form';
  42. $this->setId($options['id'] ?? $this->getName());
  43. $this->setUniqueId($options['unique_id'] ?? $this->getName());
  44. $this->setBlueprint($options['blueprint']);
  45. $this->setSubmitMethod($options['submit_method'] ?? null);
  46. $this->setFlashLookupFolder('tmp://admin/forms/[SESSIONID]');
  47. if (!empty($options['reset'])) {
  48. $this->getFlash()->delete();
  49. }
  50. $this->initialize();
  51. }
  52. /**
  53. * @return $this
  54. */
  55. public function initialize(): AdminForm
  56. {
  57. $this->messages = [];
  58. $this->submitted = false;
  59. $this->unsetFlash();
  60. /** @var FormFlashInterface $flash */
  61. $flash = $this->getFlash();
  62. if ($flash->exists()) {
  63. $data = $flash->getData();
  64. if (null !== $data) {
  65. $data = new Data($data, $this->getBlueprint());
  66. $data->setKeepEmptyValues(true);
  67. $data->setMissingValuesAsNull(true);
  68. }
  69. $this->data = $data;
  70. $this->files = $flash->getFilesByFields(false);
  71. } else {
  72. $this->data = new Data([], $this->getBlueprint());
  73. $this->files = [];
  74. }
  75. return $this;
  76. }
  77. /**
  78. * @return string
  79. */
  80. public function getNonceName(): string
  81. {
  82. return $this->nonce_name;
  83. }
  84. /**
  85. * @return string
  86. */
  87. public function getNonceAction(): string
  88. {
  89. return $this->nonce_action;
  90. }
  91. /**
  92. * @return string
  93. */
  94. public function getScope(): string
  95. {
  96. return 'data.';
  97. }
  98. /**
  99. * @param Blueprint $blueprint
  100. */
  101. public function setBlueprint(Blueprint $blueprint): void
  102. {
  103. if (null === $blueprint) {
  104. throw new InvalidArgumentException('Blueprint is required');
  105. }
  106. $this->blueprint = $blueprint;
  107. }
  108. /**
  109. * @param string $field
  110. * @param mixed $value
  111. */
  112. public function setData(string $field, $value): void
  113. {
  114. $this->getData()->set($field, $value);
  115. }
  116. /**
  117. * @return Blueprint
  118. */
  119. public function getBlueprint(): Blueprint
  120. {
  121. return $this->blueprint;
  122. }
  123. /**
  124. * @param callable|null $submitMethod
  125. */
  126. public function setSubmitMethod(?callable $submitMethod): void
  127. {
  128. if (null === $submitMethod) {
  129. throw new InvalidArgumentException('Submit method is required');
  130. }
  131. $this->submitMethod = $submitMethod;
  132. }
  133. /**
  134. * @param array $data
  135. * @param array $files
  136. * @return void
  137. * @throws Exception
  138. */
  139. protected function doSubmit(array $data, array $files): void
  140. {
  141. $method = $this->submitMethod;
  142. $method($data, $files);
  143. $this->reset();
  144. }
  145. /**
  146. * Filter validated data.
  147. *
  148. * @param ArrayAccess|Data|null $data
  149. * @return void
  150. */
  151. protected function filterData($data = null): void
  152. {
  153. if ($data instanceof Data) {
  154. $data->filter(true, true);
  155. }
  156. }
  157. }