@@ -28,6 +28,7 @@ class TemplateImageManager
2828 public function __construct (
2929 private readonly TemplateImageRepository $ templateImageRepository ,
3030 private readonly ConfigProvider $ configProvider ,
31+ private readonly ImageProvider $ imageProvider ,
3132 ) {
3233 }
3334
@@ -36,19 +37,77 @@ public function createImagesFromImagePaths(array $imagePaths, Template $template
3637 {
3738 $ templateImages = [];
3839 foreach ($ imagePaths as $ path ) {
40+ $ this ->removeExistingTemplateImage ($ template , $ path );
41+ [$ imageData , $ width , $ height , $ detectedMimeType ] = $ this ->extractImageData ($ path );
42+
3943 $ image = new TemplateImage ();
4044 $ image ->setTemplate ($ template );
4145 $ image ->setFilename ($ path );
42- $ image ->setMimeType ($ this ->guessMimeType ($ path ));
43- $ image ->setData (null );
46+ $ image ->setMimeType ($ detectedMimeType ?? $ this ->guessMimeType ($ path ));
47+ $ image ->setWidth ($ width );
48+ $ image ->setHeight ($ height );
49+ $ image ->setData ($ imageData );
4450
4551 $ this ->templateImageRepository ->persist ($ image );
4652 $ templateImages [] = $ image ;
4753 }
4854
55+ $ this ->ensurePoweredByImageExists ($ template );
56+
4957 return $ templateImages ;
5058 }
5159
60+ private function removeExistingTemplateImage (Template $ template , string $ path ): void
61+ {
62+ $ templateId = $ template ->getId ();
63+ if ($ templateId === null ) {
64+ return ;
65+ }
66+
67+ $ existing = $ this ->templateImageRepository ->findByTemplateIdAndFilename ($ templateId , $ path );
68+ if ($ existing !== null ) {
69+ $ this ->templateImageRepository ->remove ($ existing );
70+ }
71+ }
72+
73+ /**
74+ * @return array{0: ?string, 1: ?int, 2: ?int, 3: ?string}
75+ */
76+ private function extractImageData (string $ path ): array
77+ {
78+ // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
79+ $ contents = @file_get_contents ($ path );
80+ if ($ contents === false || $ contents === '' ) {
81+ return [null , null , null , null ];
82+ }
83+
84+ $ size = getimagesizefromstring ($ contents );
85+ if ($ size === false || empty ($ size [0 ]) || empty ($ size [1 ])) {
86+ return [null , null , null , null ];
87+ }
88+
89+ $ mimeType = strtolower ((string ) $ size ['mime ' ]);
90+
91+ return [base64_encode ($ contents ), (int ) $ size [0 ], (int ) $ size [1 ], $ mimeType ];
92+ }
93+
94+ private function ensurePoweredByImageExists (Template $ template ): void
95+ {
96+ if ($ this ->templateImageRepository ->poweredByImageExists ($ template )) {
97+ return ;
98+ }
99+
100+ $ image = new TemplateImage ();
101+ $ image ->setTemplate ($ template );
102+ $ image ->setFilename ('powerphplist.png ' );
103+ $ image ->setMimeType ('image/png ' );
104+ $ image ->setWidth (70 );
105+ $ image ->setHeight (30 );
106+ $ image ->setData ($ this ->imageProvider ->getPoweredByImage ());
107+
108+ $ this ->templateImageRepository ->persist ($ image );
109+ }
110+
52111 private function guessMimeType (string $ filename ): string
53112 {
54113 $ ext = strtolower (pathinfo ($ filename , PATHINFO_EXTENSION ));
@@ -57,9 +116,7 @@ private function guessMimeType(string $filename): string
57116
58117 public function extractAllImages (string $ html ): array
59118 {
60- $ fromRegex = array_keys (
61- $ this ->extractTemplateImagesFromContent ($ html )
62- );
119+ $ fromRegex = array_keys ($ this ->extractTemplateImagesFromContent ($ html ));
63120
64121 $ fromDom = $ this ->extractImagesFromHtml ($ html );
65122
@@ -68,7 +125,10 @@ public function extractAllImages(string $html): array
68125
69126 private function extractTemplateImagesFromContent (string $ content ): array
70127 {
71- $ regexp = sprintf ('/"([^"]+\.(%s))"/Ui ' , implode ('| ' , array_keys (self ::IMAGE_MIME_TYPES )));
128+ $ regexp = sprintf (
129+ '/"([^"]+\.(%s))"/Ui ' ,
130+ implode ('| ' , array_keys (self ::IMAGE_MIME_TYPES ))
131+ );
72132 preg_match_all ($ regexp , stripslashes ($ content ), $ images );
73133
74134 return array_count_values ($ images [1 ]);
@@ -170,9 +230,7 @@ private function decodeLogoImageData(?string $logoData): ?string
170230 return $ imageContent ;
171231 }
172232
173- $ fallbackContent = base64_decode ('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABGdBTUEAALGPC/ '
174- . 'xhBQAAAAZQTFRF////AAAAVcLTfgAAAAF0Uk5TAEDm2GYAAAABYktHRACIBR1IAAAACXBIWXMAAAsSAAALEgHS3X78 '
175- . 'AAAAB3RJTUUH0gQCEx05cqKA8gAAAApJREFUeJxjYAAAAAIAAUivpHEAAAAASUVORK5CYII= ' , true );
233+ $ fallbackContent = base64_decode ($ this ->imageProvider ->getFallbackLogo (), true );
176234
177235 return $ fallbackContent !== false ? $ fallbackContent : null ;
178236 }
0 commit comments