153 lines
5.3 KiB
PHP
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',
|
|
],
|
|
];
|
|
}
|
|
}
|