N°8771 - Add Symfony form component to iTop core

- WIP
This commit is contained in:
Benjamin Dalsass
2025-10-23 12:11:02 +02:00
parent 239814a38c
commit 5dea3f5299
10 changed files with 243 additions and 0 deletions

View File

@@ -0,0 +1,57 @@
<?php
namespace Combodo\iTop\Forms\Block;
abstract class AbstractFormBlock
{
private array $aOptions = [];
private array $aSubFormBlocks = [];
private array $aFormInputs = [];
private array $aFormOutputs = [];
public function __construct(array $aOptions = [])
{
$this->aOptions = $aOptions;
}
public function GetOptions(): array
{
return $this->aOptions;
}
public function AddSubFormBlock(AbstractFormBlock $oSubFormBlock): void
{
$this->aSubFormBlocks[] = $oSubFormBlock;
}
public function GetSubFormBlocks(): array
{
return $this->aSubFormBlocks;
}
public function AddInput(FormInput $oFormInput): void
{
$this->aFormInputs[$oFormInput->GetName()] = $oFormInput;
}
public function GetInput(string $sName): FormInput
{
return $this->aFormInputs[$sName];
}
public function AddOutput(FormOutput $oFormOutput): void
{
$this->aFormOutputs[$oFormOutput->GetName()] = $oFormOutput;
}
public function GetOutput(string $sName): FormOutput
{
return $this->aFormOutputs[$sName];
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Combodo\iTop\Forms\Block\Base;
use Combodo\iTop\Forms\Block\FormBlock;
class ChoiceFormBlock extends FormBlock
{
public function __construct(array $aOptions = [])
{
parent::__construct($aOptions);
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace Combodo\iTop\Forms\Block\Base;
use Combodo\iTop\Forms\Block\FormBlock;
class StringFormBlock extends FormBlock
{
}

View File

@@ -0,0 +1,20 @@
<?php
namespace Combodo\iTop\Forms\Block\DataModel;
use Combodo\iTop\Forms\Block\FormBlock;
use Combodo\iTop\Forms\Block\FormInput;
class AttributeChoiceFormBlock extends FormBlock
{
public function __construct(array $aOptions = [])
{
parent::__construct($aOptions);
$this->AddInput(new FormInput('class_name', 'string'));
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Combodo\iTop\Forms\Block\DataModel;
use Combodo\iTop\Forms\Block\FormBlock;
use Combodo\iTop\Forms\Block\FormOutput;
class OqlFormBlock extends FormBlock
{
public function __construct(array $aOptions = [])
{
parent::__construct($aOptions);
$this->AddOutput(new FormOutput('selected_class', 'string'));
}
}

View File

@@ -0,0 +1,10 @@
<?php
namespace Combodo\iTop\Forms\Block;
class FormBlock extends AbstractFormBlock
{
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Combodo\iTop\Forms\Block;
class FormInput
{
private string $sName;
private string $sType;
public function __construct(string $sName, string $sType)
{
$this->sName = $sName;
$this->sType = $sName;
}
public function GetName(): string
{
return $this->sName;
}
public function SetName(string $sName): void
{
$this->sName = $sName;
}
public function GetType(): string
{
return $this->sType;
}
public function SetType(string $sType): void
{
$this->sType = $sType;
}
}

View File

@@ -0,0 +1,48 @@
<?php
namespace Combodo\iTop\Forms\Block;
use Combodo\iTop\Forms\Converter\AbstractConverter;
class FormOutput
{
private string $sName;
private string $sType;
private AbstractConverter $oConverter;
public function __construct(string $sName, string $sType, AbstractConverter $oConverter = null)
{
$this->sName = $sName;
$this->sType = $sName;
$this->oConverter = $oConverter;
}
public function GetName(): string
{
return $this->sName;
}
public function SetName(string $sName): void
{
$this->sName = $sName;
}
public function GetType(): string
{
return $this->sType;
}
public function SetType(string $sType): void
{
$this->sType = $sType;
}
public function GetOutputValue(mixed $oData): mixed
{
$this->oConverter->Convert($oData);
}
}

View File

@@ -0,0 +1,8 @@
<?php
namespace Combodo\iTop\Forms\Converter;
abstract class AbstractConverter
{
abstract public function Convert(mixed $oData): mixed;
}

View File

@@ -0,0 +1,16 @@
<?php
namespace Combodo\iTop\Forms\Converter;
class OqlToClassName extends AbstractConverter
{
public function Convert(mixed $oData): ?string
{
if($oData === null)
return null;
// extract selected class
preg_match('/SELECT\s+(\w+)/', $oData, $aMatches);
return $aMatches[1] ?? null;
}
}