Skip to content

Commit

Permalink
[WIP][FEATURE] Site Creator
Browse files Browse the repository at this point in the history
  • Loading branch information
benjaminkott committed Aug 9, 2021
1 parent 2ff1b43 commit b9b73d8
Show file tree
Hide file tree
Showing 20 changed files with 1,816 additions and 0 deletions.
51 changes: 51 additions & 0 deletions Classes/Controller/BackendController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php
declare(strict_types = 1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\Controller;

use BK2K\BootstrapPackage\SiteCreator\Service\SiteCreatorService;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Backend\Template\ModuleTemplate;
use TYPO3\CMS\Backend\Template\ModuleTemplateFactory;
use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

class BackendController extends ActionController
{
protected ?ModuleTemplate $moduleTemplate = null;
protected ModuleTemplateFactory $moduleTemplateFactory;
protected SiteCreatorService $siteCreatorService;

public function __construct(
ModuleTemplateFactory $moduleTemplateFactory,
SiteCreatorService $siteCreatorService
) {
$this->moduleTemplateFactory = $moduleTemplateFactory;
$this->siteCreatorService = $siteCreatorService;
}

public function initializeAction(): void
{
$this->moduleTemplate = $this->moduleTemplateFactory->create($this->getRequest());
$this->moduleTemplate->setTitle('DEMO');
}

public function indexAction(): ResponseInterface
{
$this->siteCreatorService->createSiteSetup();

return $this->htmlResponse();
}

protected function getRequest(): ServerRequestInterface
{
return $GLOBALS['TYPO3_REQUEST'];
}
}
83 changes: 83 additions & 0 deletions Classes/SiteCreator/Dto/AbstractEntity.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?php
declare(strict_types = 1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Dto;

/**
* AbstractEntity
*/
abstract class AbstractEntity
{
protected string $table;
protected ?string $parentStorage = null;

public string $id;
public ?Page $parent = null;
public array $parameterBag = [];

public function __construct(string $id = null)
{
if (!isset($this->table)) {
throw new \RuntimeException('Extending Entity needs to set $table.', 1622491079);
}
$this->id = $id ?? uniqid('NEW_CONTENT');
}

public function toDataHandler(): array
{
if ($this->parent !== null) {
$this->parameterBag['pid'] = $this->parent->id;
if ($this->parentStorage !== null) {
$key = array_search($this, $this->parent->{$this->parentStorage}, true);
if ($key !== 0) {
$this->parameterBag['pid'] = '-' . $this->parent->{$this->parentStorage}[((int) $key - 1)]->id;
}
}
} else {
$this->parameterBag['pid'] = 0;
}

$relations = $this->getDataHandlerRelations();

$data = [];
$data[$this->table][$this->id] = $this->parameterBag;

return array_merge_recursive($data, $relations);
}

protected function getDataHandlerRelations(): array
{
$relations = [];

foreach ($this->parameterBag as $parameter => $parameterValue) {
$fieldConfig = $GLOBALS['TCA'][$this->table]['columns'][$parameter]['config'];
if ($fieldConfig['type'] === 'inline') {
$foreignTable = $fieldConfig['foreign_table'];
$foreignField = $fieldConfig['foreign_field'];
$recordUids = [];
foreach ($parameterValue as $record => $recordData) {
$recordId = $recordData['id'] ?? uniqid('NEW_RECORD');
$recordUids[] = $recordId;
unset($recordData['id']);
if (!strpos($this->parameterBag['pid'], '-') === 0) {
$recordData['pid'] = $this->parameterBag['pid'];
} else {
$recordData['pid'] = $this->parent->id;
}
$recordData[$foreignField] = $this->id;
$relations[$foreignTable][$recordId] = $recordData;
}
$this->parameterBag[$parameter] = implode(',', $recordUids);
}
}

return $relations;
}
}
20 changes: 20 additions & 0 deletions Classes/SiteCreator/Dto/ContentBlock.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
declare(strict_types = 1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Dto;

/**
* ContentBlock
*/
class ContentBlock extends AbstractEntity
{
protected string $table = 'tt_content';
protected ?string $parentStorage = 'contentBlocks';
}
41 changes: 41 additions & 0 deletions Classes/SiteCreator/Dto/Page.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
declare(strict_types = 1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Dto;

/**
* Page
*/
class Page extends AbstractEntity
{
protected string $table = 'pages';
protected ?string $parentStorage = 'pages';

public array $pages = [];
public array $templates = [];
public array $contentBlocks = [];

public function toDataHandler(): array
{
$data = parent::toDataHandler();

foreach ($this->pages as $childPage) {
$data = array_merge_recursive($data, $childPage->toDataHandler());
}
foreach ($this->templates as $template) {
$data = array_merge_recursive($data, $template->toDataHandler());
}
foreach ($this->contentBlocks as $contentBlock) {
$data = array_merge_recursive($data, $contentBlock->toDataHandler());
}

return $data;
}
}
31 changes: 31 additions & 0 deletions Classes/SiteCreator/Dto/Site.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php
declare(strict_types = 1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Dto;

/**
* Site
*/
class Site
{
public string $title;
public string $description;
public array $pages = [];

public function toDataHandler(): array
{
$data = [];
foreach ($this->pages as $page) {
$data = array_merge_recursive($data, $page->toDataHandler());
}

return $data;
}
}
20 changes: 20 additions & 0 deletions Classes/SiteCreator/Dto/Template.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php
declare(strict_types = 1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Dto;

/**
* Template
*/
class Template extends AbstractEntity
{
protected string $table = 'sys_template';
protected ?string $parentStorage = 'templates';
}
32 changes: 32 additions & 0 deletions Classes/SiteCreator/Factory/ContentBlockFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Factory;

use BK2K\BootstrapPackage\SiteCreator\Dto\ContentBlock;

class ContentBlockFactory
{
/**
* @param array<string, mixed> $data
*/
public static function fromArray(array $data): ContentBlock
{
$contentBlock = new ContentBlock();
if (isset($data['id'])) {
$contentBlock->id = $data['id'];
unset($data['id']);
}
$contentBlock->parameterBag = $data;

return $contentBlock;
}
}
65 changes: 65 additions & 0 deletions Classes/SiteCreator/Factory/PageFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

declare(strict_types=1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Factory;

use BK2K\BootstrapPackage\SiteCreator\Dto\Page;

class PageFactory
{
/**
* @param array<string, mixed> $data
*/
public static function fromArray(array $data): Page
{
$page = new Page();

if (isset($data['id'])) {
$page->id = $data['id'];
unset($data['id']);
}

if (isset($data['pages'])) {
foreach ($data['pages'] as $childPageData) {
$childPage = self::fromArray($childPageData);
$childPage->parent = $page;
$page->pages[] = $childPage;
}
unset($data['pages']);
}

if (isset($data['templates'])) {
foreach ($data['templates'] as $templateData) {
$template = TemplateFactory::fromArray($templateData);
$template->parent = $page;
$page->templates[] = $template;
}
unset($data['templates']);
}

if (isset($data['contentBlocks'])) {
foreach ($data['contentBlocks'] as $contentBlockData) {
$contentBlock = ContentBlockFactory::fromArray($contentBlockData);
$contentBlock->parent = $page;
$page->contentBlocks[] = $contentBlock;
}
unset($data['contentBlocks']);
}

if (!isset($data['hidden'])) {
$data['hidden'] = 0;
}

$page->parameterBag = $data;

return $page;
}
}
32 changes: 32 additions & 0 deletions Classes/SiteCreator/Factory/SiteFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

/*
* This file is part of the package bk2k/bootstrap-package.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/

namespace BK2K\BootstrapPackage\SiteCreator\Factory;

use BK2K\BootstrapPackage\SiteCreator\Dto\Site;

class SiteFactory
{
/**
* @param array<string, mixed> $data
*/
public static function fromArray(array $data): Site
{
$site = new Site();
$site->title = $data['title'];
$site->description = $data['description'];
foreach ($data['pages'] as $page) {
$site->pages[] = PageFactory::fromArray($page);
}

return $site;
}
}
Loading

0 comments on commit b9b73d8

Please sign in to comment.