N°9066 - Serialization/Unserialization from XML to Forms

This commit is contained in:
Eric Espie
2026-01-07 14:29:08 +01:00
parent efb1bd765b
commit 154fb5c737
23 changed files with 553 additions and 112 deletions

View File

@@ -219,6 +219,11 @@ PHP;
}
}
public function GetId(): string
{
return $this->sId;
}
protected function GetSibling(string $sId): ?AbstractValueType
{
if (is_null($this->oParent)) {
@@ -228,4 +233,20 @@ PHP;
return $this->oParent->GetChild($sId);
}
public function SerializeToDOMNode(mixed $value, DesignElement $oDOMNode): void
{
$sXmlValue = $value;
$oTextNode = $oDOMNode->ownerDocument->createTextNode($sXmlValue);
$oDOMNode->appendChild($oTextNode);
}
/**
* @param $oDOMNode
*
* @return mixed
*/
public function UnserializeFromDOMNode(DesignElement $oDOMNode): mixed
{
return $oDOMNode->GetText();
}
}

View File

@@ -9,6 +9,8 @@ namespace Combodo\iTop\PropertyType\ValueType\Branch;
use Combodo\iTop\DesignElement;
use Combodo\iTop\Forms\Block\Base\CollectionBlock;
use Combodo\iTop\PropertyType\Serializer\XMLFormat\AbstractXMLFormat;
use Combodo\iTop\PropertyType\Serializer\XMLFormat\XMLFormatFactory;
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
use Combodo\iTop\PropertyType\ValueType\ValueTypeFactory;
use utils;
@@ -18,6 +20,8 @@ use utils;
*/
class ValueTypeCollection extends ValueTypePropertyTree
{
private AbstractXMLFormat $oXMLFormat;
/**
* @param \Combodo\iTop\DesignElement $oDomNode
* @param \Combodo\iTop\PropertyType\ValueType\Branch\AbstractBranchValueType|null $oParent
@@ -33,6 +37,9 @@ class ValueTypeCollection extends ValueTypePropertyTree
$this->sSubTreeClass = 'SubFormFor__'.$this->sIdWithPath;
$this->aFormBlockOptionsForPHP['block_entry_type'] = utils::QuoteForPHP($this->sSubTreeClass);
$oNode = $oDomNode->GetUniqueElement('xml-format');
$this->oXMLFormat = XMLFormatFactory::GetInstance()->CreateXMLFormatFromDomNode($oNode);
// read child properties
foreach ($oDomNode->GetUniqueElement('prototype')->childNodes as $oNode) {
if ($oNode instanceof DesignElement) {
@@ -74,4 +81,14 @@ class ValueTypeCollection extends ValueTypePropertyTree
return $this->GetLocalPHPForValueType();
}
public function SerializeToDOMNode(mixed $value, DesignElement $oDOMNode): void
{
$this->oXMLFormat->SerializeToDOMNode($value, $oDOMNode, $this);
}
public function UnserializeFromDOMNode(DesignElement $oDOMNode): mixed
{
return $this->oXMLFormat->UnserializeFromDOMNode($oDOMNode, $this);
}
}

View File

@@ -9,19 +9,7 @@ namespace Combodo\iTop\PropertyType\ValueType\Branch;
use Combodo\iTop\DesignElement;
use Combodo\iTop\Forms\Block\Base\FormBlock;
use Combodo\iTop\Forms\Block\Expression\BooleanExpressionFormBlock;
use Combodo\iTop\Forms\Block\Expression\NumberExpressionFormBlock;
use Combodo\iTop\Forms\Block\Expression\StringExpressionFormBlock;
use Combodo\iTop\Forms\IO\Format\BooleanIOFormat;
use Combodo\iTop\Forms\IO\Format\ClassIOFormat;
use Combodo\iTop\Forms\IO\Format\NumberIOFormat;
use Combodo\iTop\Forms\IO\Format\StringIOFormat;
use Combodo\iTop\PropertyType\PropertyTypeException;
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
use Combodo\iTop\PropertyType\ValueType\ValueTypeFactory;
use Exception;
use Expression;
use utils;
/**
* @since 3.3.0
@@ -86,4 +74,32 @@ PHP;
return $this->GetLocalPHPForValueType($this->sSubTreeClass);
}
public function SerializeToDOMNode(mixed $value, DesignElement $oDOMNode): void
{
foreach ($this->aChildren as $oChild) {
$sId = $oChild->sId;
if (isset($value[$sId])) {
/** @var DesignElement $oChildNode */
$oChildNode = $oDOMNode->ownerDocument->createElement($sId);
$oDOMNode->appendChild($oChildNode);
$oChild->SerializeToDOMNode($value[$sId], $oChildNode);
}
}
}
public function UnserializeFromDOMNode(DesignElement $oDOMNode): mixed
{
$aResults = [];
foreach ($this->aChildren as $oChild) {
$sId = $oChild->sId;
$oChildNode = $oDOMNode->GetOptionalElement($sId);
if ($oChildNode) {
$aResults[$sId] = $oChild->UnserializeFromDOMNode($oChildNode);
}
}
return $aResults;
}
}

View File

@@ -30,7 +30,7 @@ class ValueTypeClass extends AbstractLeafValueType
{
parent::InitFromDomNode($oDomNode, $oParent);
$sCategories = $oDomNode->GetChildText('categories-csv');
$sCategories = $oDomNode->GetChildText('categories-csv', '');
/** @var \ModelReflection $oModelReflection */
$oModelReflection = ServiceLocator::GetInstance()->get('ModelReflection');

View File

@@ -10,6 +10,8 @@ namespace Combodo\iTop\PropertyType\ValueType\Leaf;
use Combodo\iTop\DesignElement;
use Combodo\iTop\Forms\Block\Base\ChoiceFormBlock;
use Combodo\iTop\Forms\Block\Base\FormBlock;
use Combodo\iTop\PropertyType\Serializer\XMLFormat\AbstractXMLFormat;
use Combodo\iTop\PropertyType\Serializer\XMLFormat\XMLFormatFactory;
use Combodo\iTop\PropertyType\ValueType\Branch\AbstractBranchValueType;
use Combodo\iTop\PropertyType\ValueType\Leaf\AbstractLeafValueType;
use Combodo\iTop\PropertyType\ValueType\ValueTypeFactory;
@@ -17,6 +19,7 @@ use Combodo\iTop\PropertyType\ValueType\ValueTypeFactory;
class ValueTypeCollectionOfValues extends AbstractLeafValueType
{
private string $sFormBlockClass;
private AbstractXMLFormat $oXMLFormat;
public function GetFormBlockClass(): string
{
@@ -33,6 +36,19 @@ class ValueTypeCollectionOfValues extends AbstractLeafValueType
$this->aFormBlockOptionsForPHP['multiple'] = 'true';
}
$oNode = $oDomNode->GetUniqueElement('xml-format');
$this->oXMLFormat = XMLFormatFactory::GetInstance()->CreateXMLFormatFromDomNode($oNode);
parent::InitFromDomNode($oDomNode, $oParent);
}
public function SerializeToDOMNode(mixed $value, DesignElement $oDOMNode): void
{
$this->oXMLFormat->SerializeToDOMNode($value, $oDOMNode, $this);
}
public function UnserializeFromDOMNode(DesignElement $oDOMNode): mixed
{
return $this->oXMLFormat->UnserializeFromDOMNode($oDOMNode, $this);
}
}

View File

@@ -46,7 +46,7 @@ class ValueTypeFactory
if (utils::IsNullOrEmptyString($sNodeType)) {
$sId = $oDomNode->getAttribute('id');
throw new PropertyTypeException("Node: $sId, missing value-type in node specification");
throw new PropertyTypeException("Missing value-type in node specification", $oDomNode);
}
if (is_a($sNodeType, AbstractValueType::class, true)) {
@@ -57,6 +57,6 @@ class ValueTypeFactory
}
$sId = $oDomNode->getAttribute('id');
throw new PropertyTypeException("Node: $sId, unknown type node class: ".json_encode($sNodeType));
throw new PropertyTypeException("Unknown value-type node class: ".json_encode($sNodeType), $oDomNode);
}
}