Files
VITEC-website/packages/vitec/Classes/Controller/OgImageController.php
2026-05-29 11:14:02 +02:00

153 lines
5.3 KiB
PHP

<?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',
],
];
}
}