ew_bloggy/Classes/Backend/View/PostHeaderRenderer.php
2025-01-21 20:22:57 +01:00

88 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
/*
* This file is developed by evoWeb.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*/
namespace Evoweb\EwBloggy\Backend\View;
use Evoweb\EwBloggy\Constants;
use Evoweb\EwBloggy\Domain\Model\Post;
use Evoweb\EwBloggy\Domain\Repository\PostRepository;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
use TYPO3\CMS\Core\Type\Bitmask\Permission;
use TYPO3\CMS\Core\View\ViewFactoryData;
use TYPO3\CMS\Core\View\ViewFactoryInterface;
use TYPO3\CMS\Fluid\View\FluidViewAdapter;
readonly class PostHeaderRenderer
{
public function __construct(
private ViewFactoryInterface $viewFactory,
private PostRepository $postRepository,
) {
}
public function render(ServerRequestInterface $request): string
{
$pageUid = (int)($request->getParsedBody()['id'] ?? $request->getQueryParams()['id'] ?? 0);
$pageInfo = $this->getPageRecord($pageUid);
if ($pageInfo === null || $pageInfo['doktype'] !== Constants::DOKTYPE_BLOG_POST) {
return '';
}
$post = $this->getPostByUid($pageUid);
$view = $this->getView($request);
$view->assign('post', $post);
return $view->render();
}
protected function getPostByUid(int $pageUid): Post
{
$query = $this->postRepository->createQuery();
$querySettings = $query->getQuerySettings();
$querySettings->setIgnoreEnableFields(true);
$querySettings->setRespectStoragePage(false);
$this->postRepository->setDefaultQuerySettings($querySettings);
return $this->postRepository->findOneBy(['uid' => $pageUid]);
}
protected function getPageRecord(int $pageUid): ?array
{
$pagePermsClause = $this->getBackendUser()?->getPagePermsClause(Permission::PAGE_SHOW) ?? '';
return BackendUtility::getRecord('pages', $pageUid, 'doktype', $pagePermsClause);
}
protected function getView(ServerRequestInterface $request): FluidViewAdapter
{
$viewFactoryData = new ViewFactoryData(
['EXT:ew_bloggy/Resources/Private/Templates'],
['EXT:ew_bloggy/Resources/Private/Partials'],
['EXT:ew_bloggy/Resources/Private/Layouts'],
request: $request,
);
/** @var FluidViewAdapter $view */
$view = $this->viewFactory->create($viewFactoryData);
$view->getRenderingContext()->setControllerName('PageLayout');
$view->getRenderingContext()->setControllerAction('Header');
return $view;
}
protected function getBackendUser(): ?BackendUserAuthentication
{
return $GLOBALS['BE_USER'] ?? null;
}
}