src/Entity/Redaktor/Redaktor.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\Entity\Redaktor;
  3. use App\Entity\EntityId;
  4. use App\Entity\ObjectFileHandlingInterface;
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Symfony\Component\Filesystem\Filesystem;
  7. use Symfony\Component\Finder\Finder;
  8. use Symfony\Component\OptionsResolver\OptionsResolver;
  9. use Webmozart\Assert\Assert;
  10. #[ORM\Entity]
  11. #[ORM\Table(name: 'redaktor')]
  12. class Redaktor implements ObjectFileHandlingInterface
  13. {
  14. public const int MAX_LENGTH_VORNAME = 64;
  15. public const int MAX_LENGTH_NACHNAME = 64;
  16. public const int MAX_LENGTH_KURZZEICHEN = 8;
  17. public const int MAX_LENGTH_FUNKTION = 32;
  18. public const int MAX_LENGTH_EMAIL = 64;
  19. public const int MAX_WIDTH_PORTRAIT_IMAGE = 1024;
  20. #[ORM\Column(name: 'vorname', type: 'string', length: 64, nullable: true)]
  21. private ?string $vorname = null;
  22. #[ORM\Column(name: 'nachname', type: 'string', length: 64, nullable: true)]
  23. private ?string $nachname = null;
  24. #[ORM\Column(name: 'kurzzeichen', type: 'string', length: 8, nullable: true)]
  25. private ?string $kurzzeichen = null;
  26. #[ORM\Column(name: 'funktion', type: 'string', length: 32, nullable: true)]
  27. private ?string $funktion = null;
  28. #[ORM\Column(name: 'email', type: 'string', length: 64, nullable: true)]
  29. private ?string $email = null;
  30. #[ORM\Column(name: 'sort', type: 'integer', nullable: true)]
  31. private int $sort = 100000;
  32. #[ORM\Column(name: 'is_visible_on_frontend', type: 'boolean', nullable: true)]
  33. private bool $isVisibleOnFrontend;
  34. #[ORM\Column(name: 'portrait_image', type: 'json', nullable: true)]
  35. private array $portraitImage = [];
  36. public function __construct(
  37. #[ORM\Id]
  38. #[ORM\Column(name: "id", type: "entityId")]
  39. #[ORM\GeneratedValue(strategy: "NONE")]
  40. private EntityId $id,
  41. string $vorname,
  42. string $nachname,
  43. bool $isVisibleOnFrontend
  44. )
  45. {
  46. $this->setVorname($vorname);
  47. $this->setNachname($nachname);
  48. $this->setIsVisibleOnFrontend($isVisibleOnFrontend); // letzte position
  49. }
  50. public function change(array $options): void
  51. {
  52. $resolver = new OptionsResolver();
  53. $resolver->setRequired(['nachname', 'vorname', 'is_visible_on_frontend', 'portrait_image', 'kurzzeichen', 'funktion', 'email']);
  54. $resolver->setAllowedTypes('portrait_image', RedaktorPortraitImage::class);
  55. $options = $resolver->resolve($options);
  56. $this->setNachname($options['nachname']);
  57. $this->setVorname($options['vorname']);
  58. $this->setIsVisibleOnFrontend($options['is_visible_on_frontend']);
  59. $this->setPortraitImage($options['portrait_image']);
  60. $this->setKurzzeichen($options['kurzzeichen']);
  61. $this->setFunktion($options['funktion']);
  62. $this->setEmail($options['email']);
  63. }
  64. public function id(): EntityId
  65. {
  66. return $this->id;
  67. }
  68. public function vorname(): ?string
  69. {
  70. return $this->vorname;
  71. }
  72. private function setVorname(?string $vorname): void
  73. {
  74. Assert::minLength($vorname, 1);
  75. Assert::maxLength($vorname, self::MAX_LENGTH_VORNAME);
  76. $this->vorname = $vorname;
  77. }
  78. private function setIsVisibleOnFrontend(bool $isVisibleOnFrontend): void
  79. {
  80. Assert::boolean($isVisibleOnFrontend);
  81. $this->isVisibleOnFrontend = $isVisibleOnFrontend;
  82. }
  83. private function setPortraitImage(RedaktorPortraitImage $image): void
  84. {
  85. $this->portraitImage['filename'] = $image->getFilename();
  86. $this->portraitImage['alt'] = $image->getAlt();
  87. $this->portraitImage['caption'] = $image->getCaption();
  88. }
  89. public function portraitImage(): RedaktorPortraitImage
  90. {
  91. if ($this->portraitImage && array_key_exists('filename', $this->portraitImage)) {
  92. $fileName = $this->portraitImage['filename'];
  93. $alt = array_key_exists('alt', $this->portraitImage) ? $this->portraitImage['alt'] : '';
  94. $caption = array_key_exists('caption', $this->portraitImage) ? $this->portraitImage['caption'] : '';
  95. return RedaktorPortraitImage::create($fileName, $alt, $caption, $this->baseObjectServerDirPath(), $this->baseObjectWebDirPath());
  96. }
  97. return RedaktorPortraitImage::createNonExistImage();
  98. }
  99. public function nachname(): ?string
  100. {
  101. return $this->nachname;
  102. }
  103. private function setNachname(?string $nachname): void
  104. {
  105. Assert::minLength($nachname, 1);
  106. Assert::maxLength($nachname, self::MAX_LENGTH_NACHNAME);
  107. $this->nachname = $nachname;
  108. }
  109. public function kurzzeichen(): ?string
  110. {
  111. return $this->kurzzeichen;
  112. }
  113. private function setKurzzeichen(?string $kurzzeichen): void
  114. {
  115. Assert::maxLength($kurzzeichen, self::MAX_LENGTH_KURZZEICHEN);
  116. $this->kurzzeichen = $kurzzeichen;
  117. }
  118. public function funktion(): ?string
  119. {
  120. return $this->funktion;
  121. }
  122. private function setFunktion(?string $funktion): void
  123. {
  124. Assert::maxLength($funktion, self::MAX_LENGTH_FUNKTION);
  125. $this->funktion = $funktion;
  126. }
  127. public function email(): ?string
  128. {
  129. return $this->email;
  130. }
  131. private function setEmail(?string $email): void
  132. {
  133. Assert::maxLength($email, self::MAX_LENGTH_EMAIL);
  134. $this->email = $email;
  135. }
  136. public function sort(): int
  137. {
  138. return $this->sort;
  139. }
  140. public function isVisibleOnFrontend(): bool
  141. {
  142. return $this->isVisibleOnFrontend;
  143. }
  144. public function fullName(): string
  145. {
  146. return $this->vorname.' '.$this->nachname;
  147. }
  148. #[\Override]
  149. public function baseObjectServerDirPath(): string
  150. {
  151. return __DIR__.'/../../../var/data/public/redaktor/'.$this->id;
  152. }
  153. #[\Override]
  154. public function baseObjectWebDirPath(): string
  155. {
  156. return '/data/redaktor/'.$this->id;
  157. }
  158. #[\Override]
  159. public function removeUnusedFiles(): void
  160. {
  161. $serverPath = $this->baseObjectServerDirPath();
  162. // Auflistung aller effektiv benötigter Filenamen dieses Objects, damit diese erhalten bleiben
  163. $usedFiles_ = [];
  164. if ($this->portraitImage()->getFilename()) {
  165. $usedFiles_[] = $this->portraitImage()->getFilename();
  166. }
  167. // Ende
  168. // Lösche alle Files aus dem Objektverzeichnis, welche nicht im Objekt vorhanden sind
  169. $fs = new Filesystem();
  170. if ($fs->exists($serverPath)) {
  171. $finder = new Finder();
  172. $finder->files()->in($serverPath);
  173. foreach ($finder as $file) {
  174. if (!in_array($file->getFilename(), $usedFiles_)) {
  175. $fs->remove($file->getRealPath());
  176. }
  177. }
  178. }
  179. // Ende
  180. }
  181. }