diff --git a/core/datamodel.core.xml b/core/datamodel.core.xml index 11d6d03d8..e5a43f20b 100644 --- a/core/datamodel.core.xml +++ b/core/datamodel.core.xml @@ -1250,7 +1250,7 @@ - + diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 54856b3b8..fbce8a65a 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -561,6 +561,7 @@ return array( 'Combodo\\iTop\\PropertyTree\\ValueType\\AbstractValueType' => $baseDir . '/sources/PropertyTree/ValueType/AbstractValueType.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeAggregateFunction' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeAggregateFunction.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoice' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeChoice.php', + 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoiceFromInput' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClass' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeClass.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttribute' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeClassAttribute.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttributeGroupBy' => $baseDir . '/sources/PropertyTree/ValueType/ValueTypeClassAttributeGroupBy.php', diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index 50493d8fe..ce5699a0f 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -947,6 +947,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Combodo\\iTop\\PropertyTree\\ValueType\\AbstractValueType' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/AbstractValueType.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeAggregateFunction' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeAggregateFunction.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoice' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeChoice.php', + 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeChoiceFromInput' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClass' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeClass.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttribute' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeClassAttribute.php', 'Combodo\\iTop\\PropertyTree\\ValueType\\ValueTypeClassAttributeGroupBy' => __DIR__ . '/../..' . '/sources/PropertyTree/ValueType/ValueTypeClassAttributeGroupBy.php', diff --git a/sources/PropertyTree/Property.php b/sources/PropertyTree/Property.php index 12b6d039c..7423ffc0a 100644 --- a/sources/PropertyTree/Property.php +++ b/sources/PropertyTree/Property.php @@ -64,6 +64,10 @@ class Property extends AbstractProperty $this->GenerateInputs($sInputName, $sValue, $sPrerequisiteExpressions, $sInputs); } + foreach ($this->oValueType->GetDynamicInputValues() as $sInputName => $sValue) { + $this->GenerateInputs($sInputName, $sValue, $sPrerequisiteExpressions, $sInputs, true); + } + $sLabel = utils::QuoteForPHP($this->sLabel); $aOptions = [ 'label' => $sLabel, @@ -80,10 +84,11 @@ $sOptions\t\t]){$sInputs}; PHP; } - private function GenerateInputs(string $sInputName, string $sValue, string &$sPrerequisiteExpressions, string &$sInputs): void + private function GenerateInputs(string $sInputName, string $sValue, string &$sPrerequisiteExpressions, string &$sInputs, bool $bIsDynamic = false): void { if (preg_match('/^{{(?\w+)\.(?\w+)}}$/', $sValue, $aMatches) === 1) { - $sInputs .= "\n ->InputDependsOn('$sInputName', '{$aMatches['node']}', '{$aMatches['output']}')"; + $sVerb = $bIsDynamic ? 'AddInputDependsOn' : 'InputDependsOn'; + $sInputs .= "\n ->$sVerb('$sInputName', '{$aMatches['node']}', '{$aMatches['output']}')"; } elseif (preg_match('/^{{(?.*)}}$/', $sValue, $aMatches) === 1) { $sExpression = $aMatches['expression']; $sBindings = ''; @@ -125,8 +130,8 @@ PHP; PHP; - - $sInputs .= "\n ->InputDependsOn('$sInputName', '{$this->sId}_{$sInputName}_expression', 'result')"; + $sVerb = $bIsDynamic ? 'AddInputDependsOn' : 'InputDependsOn'; + $sInputs .= "\n ->$sVerb('$sInputName', '{$this->sId}_{$sInputName}_expression', 'result')"; } else { $sInputs .= "\n ->SetInputValue('$sInputName', ".utils::QuoteForPHP($sValue).")"; } diff --git a/sources/PropertyTree/ValueType/AbstractValueType.php b/sources/PropertyTree/ValueType/AbstractValueType.php index 5154b9722..3a707be3e 100644 --- a/sources/PropertyTree/ValueType/AbstractValueType.php +++ b/sources/PropertyTree/ValueType/AbstractValueType.php @@ -22,6 +22,7 @@ abstract class AbstractValueType protected array $aInputs = []; protected array $aOutputs = []; protected array $aInputValues = []; + protected array $aDynamicInputValues = []; protected array $aFormBlockOptionsForPHP = []; public function InitFromDomNode(DesignElement $oDomNode): void @@ -56,6 +57,11 @@ abstract class AbstractValueType return $this->aInputs[$sInputName]->GetDataType(); } + public function GetDynamicInputValues(): array + { + return $this->aDynamicInputValues; + } + public function GetOutputs(): array { return $this->aOutputs; diff --git a/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php b/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php new file mode 100644 index 000000000..a8d68a490 --- /dev/null +++ b/sources/PropertyTree/ValueType/ValueTypeChoiceFromInput.php @@ -0,0 +1,33 @@ +GetNodes('values/value') as $oValueNode) { + /** @var DesignElement $oValueNode */ + $sValue = $oValueNode->GetAttribute('id'); + $sLabel = $oValueNode->GetChildText('label'); + $this->aDynamicInputValues[$sValue] = $sLabel; + } + } +} diff --git a/sources/alias.php b/sources/alias.php index 8dd4753dd..bf7fcca79 100644 --- a/sources/alias.php +++ b/sources/alias.php @@ -104,6 +104,7 @@ class_alias(\Combodo\iTop\PropertyTree\CollectionOfTrees::class, 'Combodo-Collec class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeAggregateFunction::class, 'Combodo-ValueTypeAggregateFunction'); class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeChoice::class, 'Combodo-ValueTypeChoice'); +class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeChoiceFromInput::class, 'Combodo-ValueTypeChoiceFromInput'); class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClass::class, 'Combodo-ValueTypeClass'); class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttribute::class, 'Combodo-ValueTypeClassAttribute'); class_alias(\Combodo\iTop\PropertyTree\ValueType\ValueTypeClassAttributeGroupBy::class, 'Combodo-ValueTypeClassAttributeGroupBy'); diff --git a/tests/php-unit-tests/unitary-tests/sources/Forms/Compiler/FormsCompilerTest.php b/tests/php-unit-tests/unitary-tests/sources/Forms/Compiler/FormsCompilerTest.php index 5b40f5f1b..5a2193768 100644 --- a/tests/php-unit-tests/unitary-tests/sources/Forms/Compiler/FormsCompilerTest.php +++ b/tests/php-unit-tests/unitary-tests/sources/Forms/Compiler/FormsCompilerTest.php @@ -5,8 +5,10 @@ * @license http://opensource.org/licenses/AGPL-3.0 */ +use Combodo\iTop\Forms\Block\Base\ChoiceFromInputsBlock; use Combodo\iTop\Forms\Compiler\FormsCompiler; use Combodo\iTop\Test\UnitTest\ItopDataTestCase; +use Symfony\Component\Validator\Constraints\NotNull; class FormsCompilerTest extends ItopDataTestCase { @@ -166,6 +168,19 @@ PHP, + + + + + + + + + + + + + XML, @@ -217,6 +232,12 @@ class FormFor__AllValueTypesTest extends Combodo\iTop\Forms\Block\Base\FormBlock \$this->Add('string_property', 'Combodo\iTop\Forms\Block\Base\TextFormBlock', [ 'label' => 'UI:String', ]); + + \$this->Add('choice_from_input', 'Combodo\iTop\Forms\Block\Base\ChoiceFromInputsBlock', [ + 'label' => 'UI:ChoiceFromInput', + ]) + ->AddInputDependsOn('value_a', 'class_attribute_property', 'label') + ->AddInputDependsOn('value_b', 'class_attribute_group_by_property', 'label'); } } PHP,