diff --git a/sources/Forms/Block/AbstractFormBlock.php b/sources/Forms/Block/AbstractFormBlock.php index 67e926fe8..14455a1a8 100644 --- a/sources/Forms/Block/AbstractFormBlock.php +++ b/sources/Forms/Block/AbstractFormBlock.php @@ -7,13 +7,14 @@ namespace Combodo\iTop\Forms\Block; use Combodo\iTop\Forms\Block\Base\FormBlock; +use Combodo\iTop\Forms\IFormBlock; use Combodo\iTop\Forms\IO\AbstractFormIO; +use Combodo\iTop\Forms\IO\Converter\AbstractConverter; use Combodo\iTop\Forms\IO\Format\RawFormat; use Combodo\iTop\Forms\IO\FormInput; use Combodo\iTop\Forms\IO\FormOutput; use Combodo\iTop\Forms\Register\IORegister; use Combodo\iTop\Forms\Register\OptionsRegister; -use Combodo\iTop\Forms\IFormBlock; /** * Abstract form block. @@ -187,21 +188,6 @@ abstract class AbstractFormBlock implements IFormBlock */ public function AddInput(string $sName, string $sType): AbstractFormBlock { - // Check name validity - if (preg_match('/(?\w+)/', $sName, $aMatches)) { - $sParsedName = $aMatches['name']; - if ($sParsedName !== $sName) { - $sName = json_encode($sName); - $sParsedName = json_encode($sParsedName); - $sBlockName = json_encode($this->getName()); - Throw new FormBlockException("Input $sName does not match $sParsedName for block $sBlockName."); - } - } else { - $sName = json_encode($sName); - $sBlockName = json_encode($this->getName()); - Throw new FormBlockException("Input $sName is not valid for block $sBlockName."); - } - // Name is valid $this->oIORegister->AddInput($sName, $sType); return $this; } diff --git a/sources/Forms/Block/Base/CollectionBlock.php b/sources/Forms/Block/Base/CollectionBlock.php index f4be6e6fe..c45079e27 100644 --- a/sources/Forms/Block/Base/CollectionBlock.php +++ b/sources/Forms/Block/Base/CollectionBlock.php @@ -72,10 +72,6 @@ class CollectionBlock extends AbstractTypeFormBlock $sBlockEntryOptions = $this->GetOption('block_entry_options'); $this->oPrototypeBlock = new ($sBlockEntryType)('prototype', $sBlockEntryOptions); - // $this->HandleBlockDependencies(); -// $this->oBlock->SetParent($this->GetParent()); -// $oBlock->DependsOn('company', 'company', AbstractFormBlock::OUTPUT_VALUE); - $oOptionsRegister->SetOption('entry_type', $this->oPrototypeBlock->GetFormType()); $oOptionsRegister->SetOption('entry_options', $this->oPrototypeBlock->GetOptions()); } diff --git a/sources/Forms/Block/Base/FormBlock.php b/sources/Forms/Block/Base/FormBlock.php index 4e0936239..3a8e6eda4 100644 --- a/sources/Forms/Block/Base/FormBlock.php +++ b/sources/Forms/Block/Base/FormBlock.php @@ -9,10 +9,10 @@ namespace Combodo\iTop\Forms\Block\Base; use Combodo\iTop\Forms\Block\AbstractFormBlock; use Combodo\iTop\Forms\Block\AbstractTypeFormBlock; use Combodo\iTop\Forms\Block\FormBlockException; -use Combodo\iTop\Forms\FormType\Base\FormType; -use Combodo\iTop\Forms\Register\OptionsRegister; use Combodo\iTop\Forms\FormBuilder\DependencyMap; use Combodo\iTop\Forms\FormsException; +use Combodo\iTop\Forms\FormType\Base\FormType; +use Combodo\iTop\Forms\Register\OptionsRegister; use Exception; use ReflectionClass; use ReflectionException; @@ -43,8 +43,8 @@ class FormBlock extends AbstractTypeFormBlock // Build the form $this->BuildForm(); } - catch (Exception $ex) { - throw new FormsException('Unable to construct demonstrator form.', 0, $ex); + catch (Exception $e) { + throw new FormBlockException('Unable to construct form', 0, $e); } } @@ -72,6 +72,7 @@ class FormBlock extends AbstractTypeFormBlock * * @return $this * @throws ReflectionException + * @throws \Combodo\iTop\Forms\Block\FormBlockException */ public function Add(string $sName, string $sType, array $aSymfonyOptions, array $aOptions = []): AbstractFormBlock { diff --git a/sources/Forms/Block/DataModel/AttributeValueChoiceFormBlock.php b/sources/Forms/Block/DataModel/AttributeValueChoiceFormBlock.php index 0d5ce92a2..0d3eb157f 100644 --- a/sources/Forms/Block/DataModel/AttributeValueChoiceFormBlock.php +++ b/sources/Forms/Block/DataModel/AttributeValueChoiceFormBlock.php @@ -7,6 +7,7 @@ namespace Combodo\iTop\Forms\Block\DataModel; use Combodo\iTop\Forms\Block\Base\ChoiceFormBlock; +use Combodo\iTop\Forms\Block\FormBlockException; use Combodo\iTop\Forms\IO\Format\AttributeIOFormat; use Combodo\iTop\Forms\IO\Format\ClassIOFormat; use Combodo\iTop\Forms\IO\Format\RawFormat; @@ -47,7 +48,9 @@ class AttributeValueChoiceFormBlock extends ChoiceFormBlock $oIORegister->AddOutput(self::OUTPUT_VALUE, RawFormat::class); } - /** @inheritdoc */ + /** @inheritdoc + * @throws \Combodo\iTop\Forms\Block\FormBlockException + */ public function UpdateOptions(OptionsRegister $oOptionsRegister): void { parent::UpdateOptions($oOptionsRegister); @@ -55,13 +58,15 @@ class AttributeValueChoiceFormBlock extends ChoiceFormBlock $oClassName = $this->GetInputValue(self::INPUT_CLASS_NAME); $oAttribute = $this->GetInputValue(self::INPUT_ATTRIBUTE); - try{ + try { $oAttDef = MetaModel::GetAttributeDef(strval($oClassName), strval($oAttribute)); $aValues = $oAttDef->GetAllowedValues(); $oOptionsRegister->SetOption('choices', array_flip($aValues ?? [])); } - catch(Exception){} + catch (Exception $e) { + throw new FormBlockException('Update option failed for '.json_encode($this->GetName()), 0, $e); + } } } \ No newline at end of file diff --git a/sources/Forms/FormBuilder/DependencyHandler.php b/sources/Forms/FormBuilder/DependencyHandler.php index 18143b7b1..1aeb86a3c 100644 --- a/sources/Forms/FormBuilder/DependencyHandler.php +++ b/sources/Forms/FormBuilder/DependencyHandler.php @@ -137,10 +137,10 @@ class DependencyHandler $oFormBlock = $this->oFormBlock->Get($oForm->getName()); // Compute the block outputs with the data - try{ + try { $oFormBlock->ComputeOutputs($sEventType, $oForm->getData()); } - catch(Exception $e){ + catch (Exception $e) { $oForm->addError(new FormError($e->getMessage())); } @@ -150,19 +150,19 @@ class DependencyHandler } - /** * @param FormInterface|FormBuilderInterface $oForm * @param string|null $sOutputBlock * @param string|null $sEventType * * @return void + * @throws \Combodo\iTop\Forms\Block\FormBlockException */ private function CheckDependencies(FormInterface|FormBuilderInterface $oForm, string $sOutputBlock = null, string $sEventType = null): void { $aImpactedBlocks = $this->aDependentBlocks; - if($sOutputBlock !== null){ - $aImpactedBlocks = $this->oDependenciesMap->GetBlocksImpactedBy($sOutputBlock, function(AbstractFormBlock $oBlock) use ($sEventType) { + if ($sOutputBlock !== null) { + $aImpactedBlocks = $this->oDependenciesMap->GetBlocksImpactedBy($sOutputBlock, function (AbstractFormBlock $oBlock) use ($sEventType) { return $oBlock instanceof AbstractTypeFormBlock; }); } @@ -213,9 +213,7 @@ class DependencyHandler // Add event $this->AddEvent('form.remove', $oDependentBlock->getName()); } - } - } /** diff --git a/sources/Forms/FormBuilder/FormTypeExtension.php b/sources/Forms/FormBuilder/FormTypeExtension.php index 51d9a9dd2..e40e92ea3 100644 --- a/sources/Forms/FormBuilder/FormTypeExtension.php +++ b/sources/Forms/FormBuilder/FormTypeExtension.php @@ -46,7 +46,6 @@ class FormTypeExtension extends AbstractTypeExtension $builder->addEventListener(FormEvents::POST_SET_DATA, $options['builder_listener']); $builder->addEventListener(FormEvents::POST_SUBMIT, $options['builder_listener']); } - } /** @inheritdoc */ @@ -58,7 +57,5 @@ class FormTypeExtension extends AbstractTypeExtension $oFormBlock = $options['form_block']; $view->vars['trigger_form_submit_on_modify'] = $oFormBlock->ImpactDependentsBlocks(); } - } - } \ No newline at end of file diff --git a/sources/Forms/IO/AbstractFormIO.php b/sources/Forms/IO/AbstractFormIO.php index 6ef401cd2..c9823ccf8 100644 --- a/sources/Forms/IO/AbstractFormIO.php +++ b/sources/Forms/IO/AbstractFormIO.php @@ -40,7 +40,7 @@ class AbstractFormIO */ public function __construct(string $sName, string $sType, AbstractFormBlock $oOwnerBlock) { - $this->sName = $sName; + $this->SetName($sName); $this->sType = $sType; $this->oOwnerBlock = $oOwnerBlock; } @@ -71,9 +71,26 @@ class AbstractFormIO * @param string $sName * * @return self + * @throws \Combodo\iTop\Forms\IO\FormBlockIOException */ public function SetName(string $sName): self { + // Check name validity + if (preg_match('/(?\w+)/', $sName, $aMatches)) { + $sParsedName = $aMatches['name']; + if ($sParsedName !== $sName) { + $sName = json_encode($sName); + $sParsedName = json_encode($sParsedName); + $sBlockName = json_encode($this->getName()); + Throw new FormBlockIOException("Input $sName does not match $sParsedName for block $sBlockName."); + } + } else { + $sName = json_encode($sName); + $sBlockName = json_encode($this->getName()); + Throw new FormBlockIOException("Input $sName is not valid for block $sBlockName."); + } + + // Name is valid $this->sName = $sName; return $this; @@ -210,7 +227,7 @@ class AbstractFormIO * * @return void */ - public function Attach(FormBinding $oFormBinding) + public function Attach(FormBinding $oFormBinding): void { $this->oBinding = $oFormBinding; } diff --git a/sources/Forms/IO/Converter/OqlToClassConverter.php b/sources/Forms/IO/Converter/OqlToClassConverter.php index 3a31986c5..4e50d01f3 100644 --- a/sources/Forms/IO/Converter/OqlToClassConverter.php +++ b/sources/Forms/IO/Converter/OqlToClassConverter.php @@ -7,15 +7,17 @@ namespace Combodo\iTop\Forms\IO\Converter; use Combodo\iTop\Forms\IO\Format\ClassIOFormat; +use Combodo\iTop\Forms\IO\FormBlockIOException; use MetaModel; -use Symfony\Component\Filesystem\Exception\IOException; /** * OQL expression to class converter. */ class OqlToClassConverter extends AbstractConverter { - /** @inheritdoc */ + /** @inheritdoc + * @throws \Combodo\iTop\Forms\IO\FormBlockIOException + */ public function Convert(mixed $oData): ?ClassIOFormat { if ($oData === null) { @@ -29,12 +31,12 @@ class OqlToClassConverter extends AbstractConverter if (isset($aMatches[1])) { $sSelectedClass = $aMatches[1]; if (!MetaModel::IsValidClass($sSelectedClass)) { - throw new IOException("Class `$sSelectedClass` not found"); + throw new FormBlockIOException('Class '.json_encode($sSelectedClass).' not found'); } return new ClassIOFormat($aMatches[1]); } else { - throw new IOException('Incorrect OQL sentence'); + throw new FormBlockIOException('Incorrect OQL sentence '.json_encode($oData)); } diff --git a/sources/Forms/Register/IORegister.php b/sources/Forms/Register/IORegister.php index e308681eb..10dd5cd54 100644 --- a/sources/Forms/Register/IORegister.php +++ b/sources/Forms/Register/IORegister.php @@ -43,7 +43,7 @@ class IORegister * @param string $sOutputBlockName * @param string $sOutputName * - * @return AbstractFormBlock + * @return $this * @throws FormBlockException */ public function AddInputDependsOn(string $sName, string $sOutputBlockName, string $sOutputName): self @@ -171,7 +171,7 @@ class IORegister public function GetOutput(string $sName): FormOutput { if (!array_key_exists($sName, $this->aOutputs)) { - throw new FormBlockException('Missing output '.$sName.' for '.$this->oFormBlock->GetName()); + throw new FormBlockException('Missing output '.json_encode($sName).' for '.json_encode($this->oFormBlock->GetName())); } return $this->aOutputs[$sName];