Skip to content

Commit 8a93f7c

Browse files
reloxx13andi34
authored andcommitted
add collage limit calculator
1 parent 89d6c57 commit 8a93f7c

File tree

4 files changed

+81
-60
lines changed

4 files changed

+81
-60
lines changed

api/admin.php

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
$defaultConfig = $configurationService->getDefaultConfiguration();
3131

3232
$data = ArrayUtility::replaceBooleanValues($_POST);
33-
$action = isset($data['type']) ? $data['type'] : null;
33+
$action = $data['type'] ?? null;
3434

3535
// Reset
3636
if ($action === 'reset') {
@@ -257,59 +257,11 @@
257257
// Collage json config
258258
$newConfig['collage']['limit'] = $newConfig['collage']['limit'] ?? $defaultConfig['collage']['limit'];
259259
if ($newConfig['collage']['enabled']) {
260-
$collageConfigFilePath = Collage::getCollageConfigPath($newConfig['collage']['layout'], $newConfig['collage']['orientation']);
261-
262-
if ($collageConfigFilePath !== null) {
263-
$collageJson = json_decode((string)file_get_contents($collageConfigFilePath), true);
264-
265-
if (is_array($collageJson)) {
266-
if (isset($collageJson['layout']) && !empty($collageJson['layout'])) {
267-
$layoutConfigArray = $collageJson['layout'];
268-
269-
if (array_key_exists('placeholder', $collageJson)) {
270-
$newConfig['collage']['placeholder'] = $collageJson['placeholder'];
271-
}
272-
if (array_key_exists('placeholderposition', $collageJson)) {
273-
$newConfig['collage']['placeholderposition'] = $collageJson['placeholderposition'];
274-
}
275-
if (array_key_exists('placeholderpath', $collageJson)) {
276-
$newConfig['collage']['placeholderpath'] = $collageJson['placeholderpath'];
277-
}
278-
} else {
279-
$layoutConfigArray = $collageJson;
280-
}
281-
282-
// Calculate collage limit
283-
if (str_starts_with($newConfig['collage']['layout'], '2x')) {
284-
$newConfig['collage']['limit'] = (int) ceil(count($layoutConfigArray) / 2);
285-
} else {
286-
$newConfig['collage']['limit'] = count($layoutConfigArray);
287-
}
288-
289-
// If there is a collage placeholder whithin the correct range (0 < placeholderposition <= collage limit), we need to decrease the collage limit by 1
290-
if ($newConfig['collage']['placeholder']) {
291-
$collagePlaceholderPosition = (int) $newConfig['collage']['placeholderposition'];
292-
if ($collagePlaceholderPosition > 0 && $collagePlaceholderPosition <= $newConfig['collage']['limit']) {
293-
$newConfig['collage']['limit'] = $newConfig['collage']['limit'] - 1;
294-
} else {
295-
$newConfig['collage']['placeholder'] = false;
296-
$logger->debug('Placeholder position not in range. Placeholder disabled.');
297-
}
298-
299-
if ($newConfig['collage']['placeholderpath'] === '') {
300-
$newConfig['collage']['placeholder'] = false;
301-
$logger->debug('Collage Placeholder is empty. Collage Placeholder disabled.');
302-
}
303-
}
304-
} else {
305-
$newConfig['collage']['enabled'] = false;
306-
$logger->debug('No valid collage json found. Collage disabled.');
307-
}
308-
}
260+
$limitData = Collage::calculateLimit($newConfig['collage'], $logger);
261+
$newConfig['collage']['limit'] = $limitData['limit'];
262+
$newConfig['collage']['placeholder'] = $limitData['placeholderEnabled'];
309263
if ($newConfig['collage']['limit'] < 1) {
310264
$newConfig['collage']['enabled'] = false;
311-
$newConfig['collage']['limit'] = $defaultConfig['collage']['limit'];
312-
$logger->debug('Invalid collage limit, must be 1 or greater. Collage disabled.');
313265
}
314266
}
315267

api/applyEffects.php

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,10 @@
6060
}
6161
}
6262
}
63-
if (isset($_POST['collageLimit'])) {
64-
$config['collage']['limit'] = $_POST['collageLimit'];
65-
if ($config['collage']['placeholder'] && $config['collage']['limit'] < $config['collage']['placeholderposition']) {
66-
$logger->debug('Placeholder position out of range. Limit: ' . $config['collage']['limit'] . ' Position: ' . $config['collage']['placeholderposition']);
67-
$config['collage']['placeholderposition'] = 1;
68-
}
69-
}
63+
64+
$limitData = Collage::calculateLimit($config['collage'], $logger);
65+
$config['collage']['limit'] = $limitData['limit'];
66+
$config['collage']['placeholder'] = $limitData['placeholderEnabled'];
7067

7168
$vars['style'] = $_POST['style'];
7269

src/Collage.php

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
use Photobooth\Dto\CollageConfig;
66
use Photobooth\Enum\ImageFilterEnum;
77
use Photobooth\Factory\CollageConfigFactory;
8+
use Photobooth\Service\LoggerService;
89
use Photobooth\Utility\ImageUtility;
910
use Photobooth\Utility\PathUtility;
11+
use Psr\Log\LoggerInterface;
1012

1113
class Collage
1214
{
@@ -27,6 +29,73 @@ public static function reset(): void
2729
self::$layoutPath = '';
2830
}
2931

32+
/**
33+
* Calculate collage limit based on layout definition and placeholder settings.
34+
*
35+
* @return array{limit:int, placeholderEnabled:bool}
36+
*/
37+
public static function calculateLimit(
38+
array $collageConfig,
39+
?LoggerInterface $logger = null
40+
): array {
41+
$layout = (string) ($collageConfig['layout'] ?? '');
42+
$orientation = (string) ($collageConfig['orientation'] ?? 'landscape');
43+
$placeholderEnabled = (bool) ($collageConfig['placeholder'] ?? false);
44+
$placeholderPosition = (int) ($collageConfig['placeholderposition'] ?? 0);
45+
$placeholderPath = $collageConfig['placeholderpath'] ?? null;
46+
47+
$fallbackLimit = (int) ($collageConfig['limit'] ?? 1);
48+
if ($fallbackLimit < 1) {
49+
$fallbackLimit = 1;
50+
}
51+
$limit = $fallbackLimit;
52+
$logger = $logger ?? LoggerService::getInstance()->getLogger('main');
53+
54+
$collageConfigFilePath = self::getCollageConfigPath($layout, $orientation);
55+
56+
if ($collageConfigFilePath !== null) {
57+
$collageJson = json_decode((string) file_get_contents($collageConfigFilePath), true);
58+
if (is_array($collageJson)) {
59+
$layoutConfigArray = !empty($collageJson['layout'])
60+
? $collageJson['layout']
61+
: $collageJson;
62+
63+
if (str_starts_with($layout, '2x')) {
64+
$limit = (int) ceil(count($layoutConfigArray) / 2);
65+
} else {
66+
$limit = count($layoutConfigArray);
67+
}
68+
69+
if ($placeholderEnabled) {
70+
if ($placeholderPosition > 0 && $placeholderPosition <= $limit) {
71+
$limit--;
72+
} else {
73+
$placeholderEnabled = false;
74+
$logger->debug('Placeholder position not in range. Placeholder disabled.');
75+
}
76+
77+
if ($placeholderPath === null || $placeholderPath === '') {
78+
$placeholderEnabled = false;
79+
$logger->debug('Collage Placeholder is empty. Collage Placeholder disabled.');
80+
}
81+
}
82+
} else {
83+
$logger->debug('No valid collage json found. Collage disabled.');
84+
}
85+
}
86+
87+
if ($limit < 1) {
88+
$limit = $fallbackLimit;
89+
$placeholderEnabled = false;
90+
$logger->debug('Invalid collage limit, must be 1 or greater. Collage disabled.');
91+
}
92+
93+
return [
94+
'limit' => $limit,
95+
'placeholderEnabled' => $placeholderEnabled,
96+
];
97+
}
98+
3099
public static function getCollageConfigPath(string $collageLayout, string $pictureOrientation): ?string
31100
{
32101
self::$drawDashedLine =

template/components/collageSelection.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use Photobooth\Enum\CollageLayoutEnum;
44
use Photobooth\Service\LanguageService;
5+
use Photobooth\Collage;
56

67
function renderCollageOptionsFromEnumWithLimit(array $collageConfig): string
78
{
@@ -13,7 +14,9 @@ function renderCollageOptionsFromEnumWithLimit(array $collageConfig): string
1314

1415
foreach (CollageLayoutEnum::cases() as $layout) {
1516
if (in_array($layout, $collageConfig['layouts_enabled'])) {
16-
$limit = $layout->getLimitByValue($layout->value);
17+
$collageConfig['layout'] = $layout->value;
18+
$limitData = Collage::calculateLimit($collageConfig);
19+
$limit = $limitData['limit'];
1720

1821
$selected = ($layout->value === $collageConfig['layout']) ? ' selected' : '';
1922

0 commit comments

Comments
 (0)