diff --git a/sources/Forms/Block/Expression/AbstractExpressionFormBlock.php b/sources/Forms/Block/Expression/AbstractExpressionFormBlock.php index b78cfa8ff..e2fc160a8 100644 --- a/sources/Forms/Block/Expression/AbstractExpressionFormBlock.php +++ b/sources/Forms/Block/Expression/AbstractExpressionFormBlock.php @@ -11,6 +11,7 @@ use Combodo\iTop\Forms\Block\AbstractFormBlock; use Combodo\iTop\Forms\Block\FormBlockException; use Combodo\iTop\Forms\IO\Format\BooleanIOFormat; use Combodo\iTop\Forms\Register\IORegister; +use Exception; use Expression; use Symfony\Component\Form\FormEvents; @@ -52,9 +53,13 @@ abstract class AbstractExpressionFormBlock extends AbstractFormBlock foreach ($aParamsToResolve as $sParamToResolve) { $aResolvedParams[$sParamToResolve] = strval($this->GetInputValue($sParamToResolve)); } + $aFieldsToResolve = $oExpression->ListRequiredFields(); + foreach ($aFieldsToResolve as $sFieldToResolve) { + $aResolvedParams[$sFieldToResolve] = strval($this->GetInputValue($sFieldToResolve)); + } return $oExpression->Evaluate($aResolvedParams); - } catch (\Exception $e) { - throw new FormBlockException('Compute expression '.json_encode($sExpression).' block issue', 0, $e); + } catch (Exception $e) { + throw new FormBlockException('Compute expression '.json_encode($sExpression).' block issue: '.$e->getMessage(), 0, $e); } } diff --git a/sources/Forms/FormsException.php b/sources/Forms/FormsException.php index 1f5a2e671..99d9cd62f 100644 --- a/sources/Forms/FormsException.php +++ b/sources/Forms/FormsException.php @@ -19,4 +19,10 @@ use Throwable; */ class FormsException extends Exception { + public function __construct(string $sMessage = '', int $iCode = 0, ?Throwable $oPrevious = null, array $aContext = []) + { + parent::__construct($sMessage, $iCode, $oPrevious); + IssueLog::Exception(get_class($this).' occurs: '.$sMessage, $this, null, $aContext); + } + } diff --git a/sources/Forms/IO/AbstractFormIO.php b/sources/Forms/IO/AbstractFormIO.php index d203b7bda..80d77c527 100644 --- a/sources/Forms/IO/AbstractFormIO.php +++ b/sources/Forms/IO/AbstractFormIO.php @@ -86,7 +86,7 @@ class AbstractFormIO public function SetName(string $sName): self { // Check name validity - if (preg_match('/(?\w+)/', $sName, $aMatches)) { + if (preg_match('/^(?((\w+\.\w+)|\w+))$/', $sName, $aMatches)) { $sParsedName = $aMatches['name']; if ($sParsedName !== $sName) { $sName = json_encode($sName); diff --git a/tests/php-unit-tests/unitary-tests/sources/Forms/AbstractFormsTest.php b/tests/php-unit-tests/unitary-tests/sources/Forms/AbstractFormsTest.php index 35950fc2e..143791ff1 100644 --- a/tests/php-unit-tests/unitary-tests/sources/Forms/AbstractFormsTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/Forms/AbstractFormsTest.php @@ -25,16 +25,16 @@ abstract class AbstractFormsTest extends ItopDataTestCase { public function GivenInput(string $sName, string $sType = StringIOFormat::class): FormInput { - $oBlock = $this->GivenFormBlock($sName.'_block'); + $oBlock = $this->GivenFormBlock($sName); - return new FormInput($sName.'_input', $sType, $oBlock); + return new FormInput($sName, $sType, $oBlock); } public function GivenOutput(string $sName, string $sType = StringIOFormat::class): FormOutput { - $oBlock = $this->GivenFormBlock($sName.'_block'); + $oBlock = $this->GivenFormBlock($sName); - return new FormOutput($sName.'_output', $sType, $oBlock); + return new FormOutput($sName, $sType, $oBlock); } public function GivenFormBlock(string $sName): FormBlock diff --git a/tests/php-unit-tests/unitary-tests/sources/Forms/IO/AbstractFormIOTest.php b/tests/php-unit-tests/unitary-tests/sources/Forms/IO/AbstractFormIOTest.php index 7b4c09209..c2a42ce83 100644 --- a/tests/php-unit-tests/unitary-tests/sources/Forms/IO/AbstractFormIOTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/Forms/IO/AbstractFormIOTest.php @@ -67,7 +67,7 @@ class AbstractFormIOTest extends AbstractFormsTest * @return void * @throws \Combodo\iTop\Forms\IO\FormBlockIOException */ - public function testNameFormatSupportsOnlyLettersUnderscoreAndNumbers(string $sName, bool $bGenerateException = true) + public function testNameFormatSupportsOnlyLettersUnderscoreAndNumbersAndDot(string $sName, bool $bGenerateException = true) { if ($bGenerateException) { @@ -75,7 +75,7 @@ class AbstractFormIOTest extends AbstractFormsTest } $oInput = $this->GivenInput($sName); if (!$bGenerateException) { - $this->assertEquals($sName.'_input', $oInput->GetName()); + $this->assertEquals($sName, $oInput->GetName()); } } @@ -88,12 +88,15 @@ class AbstractFormIOTest extends AbstractFormsTest 'Percent not supported' => ['name%'], 'Accent not supported' => ['namΓ©'], 'emoji not supported' => ['πŸŽ„πŸŽ„πŸŽ„πŸŽ„πŸŽ„'], + '.name not supported' => ['.name'], + 'name. not supported' => ['name.'], // Corrects 'Numbers OK' => ['name123', false], 'Starting with number OK' => ['123name123', false], 'Underscore OK' => ['The_test_name', false], 'Camel OK' => ['TheTestName', false], + 'name.subname OK' => ['name.subname', false], ]; }