Wizard

In Wizard folder we add all our custom states for the wizard, in this example we add a custom state for FE user generation.

All states are declared in TypoScript Setup for the wizard to know about them.

declare(strict_types=1);

namespace Oktopuce\SiteGeneratorCustomized\Wizard;

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Core\Log\LogLevel;
use TYPO3\CMS\Core\DataHandling\DataHandler;
use Oktopuce\SiteGenerator\Wizard\SiteGeneratorWizard;
use Oktopuce\SiteGenerator\Wizard\SiteGeneratorStateInterface;
use Oktopuce\SiteGenerator\Wizard\StateBase;
use Oktopuce\SiteGeneratorCustomized\Dto\SiteGeneratorDto;

/**
* StateCreateFeGroup
*/
class StateCreateFeGroup extends StateBase implements SiteGeneratorStateInterface
{
   /**
   * Create FE user group
   *
   * @param SiteGeneratorWizard $context
   * @return void
   */
   public function process(SiteGeneratorWizard $context): void
   {
      $settings = $context->getSettings();

      // Create FE group
      $groupId = $this->createFeGroup($context->getSiteData(), (int)$settings['siteGenerator']['wizard']['pidFeGroup'], (int)$settings['siteGenerator']['wizard']['baseFeGroupUid']);
      $context->getSiteData()->setFeGroupId($groupId);
   }

   /**
   * Create FE group
   *
   * @param SiteGeneratorDto $siteData New site data
   * @param int $pidFeGroup Pid for FE group creation
   * @param int $baseFeGroupUid Base Workgroup UID
   * @throws \Exception
   *
   * @return int The uid of the group created
   */
   protected function createFeGroup(SiteGeneratorDto $siteData, int $pidFeGroup, int $baseFeGroupUid): int
   {
      // Create a new FE group with specific subgroup
      $data = [];
      $newUniqueId = 'NEW' . uniqid();
      $groupName = $siteData->getCustomizedData() . ' - ' . $siteData->getTitle();
      $data['fe_groups'][$newUniqueId] = [
            'pid' => $pidFeGroup,
            'title' => $groupName,
            'subgroup' => $baseFeGroupUid
      ];

      /* @var $tce DataHandler */
      $tce = GeneralUtility::makeInstance(DataHandler::class);
      $tce->start($data, []);
      $tce->process_datamap();

      // Retrieve uid of user group created
      $groupId = $tce->substNEWwithIDs[$newUniqueId];

      if ($groupId > 0) {
            $this->log(LogLevel::NOTICE, 'Create FE group successful (uid = ' . $groupId);
            $siteData->addMessage($this->translate('generate.success.feGroupCreated', [$groupName, $groupId]));
      }
      else {
            $this->log(LogLevel::ERROR, 'Create FE group error');
            throw new \Exception($this->translate('wizard.feGroup.error'));
      }

      return ($groupId);
   }
}

Caution

All states must extend StateBase and implements SiteGeneratorStateInterface. The process method is mandatory.

Hint

You can add information to sys_log with the method log() :

$this->log(LogLevel::NOTICE, 'My message');

The addMessage() method is used to add a message that will be displayed at the end of the process.

$siteData->addMessage('- My message');