Zwischenstand vom 29.05.2026
This commit is contained in:
1 parent
b6d2142214
commit
dba154e572
36 files changed
+5113
-649
No files matched your search
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Evomedien\Vitec\Controller;
|
||||
|
||||
use Evomedien\Vitec\Service\OgImageGeneratorService;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use TYPO3\CMS\Backend\Attribute\AsController;
|
||||
use TYPO3\CMS\Backend\Routing\UriBuilder;
|
||||
use TYPO3\CMS\Backend\Template\ModuleTemplateFactory;
|
||||
use TYPO3\CMS\Core\Http\JsonResponse;
|
||||
use TYPO3\CMS\Core\Http\RedirectResponse;
|
||||
use TYPO3\CMS\Core\Messaging\FlashMessage;
|
||||
use TYPO3\CMS\Core\Messaging\FlashMessageService;
|
||||
use TYPO3\CMS\Core\Page\PageRenderer;
|
||||
use TYPO3\CMS\Core\Type\ContextualFeedbackSeverity;
|
||||
use TYPO3\CMS\Core\Utility\GeneralUtility;
|
||||
|
||||
/**
|
||||
* Backend module controller for OG Image generation.
|
||||
*/
|
||||
#[AsController]
|
||||
final class OgImageController
|
||||
{
|
||||
public function __construct(
|
||||
private readonly ModuleTemplateFactory $moduleTemplateFactory,
|
||||
private readonly OgImageGeneratorService $ogImageGeneratorService,
|
||||
private readonly FlashMessageService $flashMessageService,
|
||||
private readonly PageRenderer $pageRenderer,
|
||||
private readonly UriBuilder $uriBuilder,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Renders the OG image builder form.
|
||||
*/
|
||||
public function indexAction(ServerRequestInterface $request): ResponseInterface
|
||||
{
|
||||
$this->pageRenderer->addJsFile(
|
||||
'EXT:vitec/Resources/Public/Javascript/og-image-preview.js'
|
||||
);
|
||||
|
||||
$moduleTemplate = $this->moduleTemplateFactory->create($request);
|
||||
|
||||
$moduleTemplate->assignMultiple([
|
||||
'formData' => $this->getDefaultFormData(),
|
||||
'savedImages' => $this->ogImageGeneratorService->getSavedImages(),
|
||||
'presets' => $this->getPresets(),
|
||||
'backgroundImages' => $this->ogImageGeneratorService->getBackgroundImages(),
|
||||
]);
|
||||
|
||||
return $moduleTemplate->renderResponse('OgImage/Index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles form submission and generates the OG image.
|
||||
*/
|
||||
public function generateAction(ServerRequestInterface $request): ResponseInterface
|
||||
{
|
||||
$parsedBody = $request->getParsedBody();
|
||||
$formData = $parsedBody['ogimage'] ?? [];
|
||||
|
||||
[$success, $message, $filePath] = $this->ogImageGeneratorService->generate($formData);
|
||||
|
||||
$severity = $success
|
||||
? ContextualFeedbackSeverity::OK
|
||||
: ContextualFeedbackSeverity::ERROR;
|
||||
|
||||
$flashMessage = GeneralUtility::makeInstance(
|
||||
FlashMessage::class,
|
||||
$message,
|
||||
$success ? 'OG Image created' : 'Generation failed',
|
||||
$severity,
|
||||
true
|
||||
);
|
||||
$this->flashMessageService
|
||||
->getMessageQueueByIdentifier()
|
||||
->addMessage($flashMessage);
|
||||
|
||||
$moduleUrl = (string)$this->uriBuilder->buildUriFromRoute('web_vitecogimage');
|
||||
return new RedirectResponse($moduleUrl, 303);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a base64 PNG preview without saving to disk (AJAX).
|
||||
*/
|
||||
public function previewAction(ServerRequestInterface $request): ResponseInterface
|
||||
{
|
||||
$parsedBody = $request->getParsedBody();
|
||||
$formData = $parsedBody['ogimage'] ?? [];
|
||||
|
||||
[$success, $message, $dataUri] = $this->ogImageGeneratorService->generatePreview($formData);
|
||||
|
||||
return new JsonResponse([
|
||||
'success' => $success,
|
||||
'message' => $message,
|
||||
'dataUri' => $dataUri,
|
||||
]);
|
||||
}
|
||||
|
||||
// ──────────────────────────────────────────────────────────────────
|
||||
// Helpers
|
||||
// ──────────────────────────────────────────────────────────────────
|
||||
|
||||
private function getDefaultFormData(): array
|
||||
{
|
||||
return [
|
||||
'bg_type' => 'color',
|
||||
'bg_color' => '#1a1a2e',
|
||||
'bg_image' => '',
|
||||
'overlay_opacity' => 40,
|
||||
'title' => 'Your Page Title',
|
||||
'title_color' => '#ffffff',
|
||||
'title_size' => 64,
|
||||
'subtitle' => 'A short description of your page',
|
||||
'subtitle_color' => '#cccccc',
|
||||
'subtitle_size' => 32,
|
||||
'label_text' => 'VITEC',
|
||||
'label_bg_color' => '#e63946',
|
||||
'label_text_color' => '#ffffff',
|
||||
'label_position' => 'top-left',
|
||||
'logo_path' => '',
|
||||
'output_format' => 'jpg',
|
||||
'output_quality' => 90,
|
||||
];
|
||||
}
|
||||
|
||||
private function getPresets(): array
|
||||
{
|
||||
return [
|
||||
'dark-blue' => [
|
||||
'label' => 'Dark Blue',
|
||||
'bg_color' => '#1a1a2e',
|
||||
'title_color' => '#ffffff',
|
||||
'subtitle_color' => '#aaaacc',
|
||||
],
|
||||
'light' => [
|
||||
'label' => 'Clean Light',
|
||||
'bg_color' => '#f8f9fa',
|
||||
'title_color' => '#212529',
|
||||
'subtitle_color' => '#6c757d',
|
||||
],
|
||||
'brand-red' => [
|
||||
'label' => 'VITEC Brand Red',
|
||||
'bg_color' => '#1f1f1f',
|
||||
'title_color' => '#ffffff',
|
||||
'subtitle_color' => '#e63946',
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user