mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-12 23:14:18 +01:00
N°9066 - Serialization/Unserialization from XML to Forms
This commit is contained in:
@@ -863,22 +863,13 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
||||
</node>
|
||||
<node id="query" xsi:type="Combodo-ValueType-OQL">
|
||||
<label>UI:DashletGroupBy:Prop-Query</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
|
||||
</data-transform>
|
||||
</node>
|
||||
<node id="group_by" xsi:type="Combodo-ValueType-ClassAttributeGroupBy">
|
||||
<label>UI:DashletGroupBy:Prop-GroupBy</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/>
|
||||
</data-transform>
|
||||
<class>{{query.selected_class}}</class>
|
||||
</node>
|
||||
<node id="style" xsi:type="Combodo-ValueType-Choice"> <!-- Possible de le cacher, etc celui-ci nous met dedans -->
|
||||
<label>UI:DashletGroupBy:Prop-Style</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-defaults-to>bars</xml-node-empty-defaults-to>
|
||||
</data-transform>
|
||||
<values>
|
||||
<value id="bars">
|
||||
<label>UI:DashletGroupByBars:Label</label>
|
||||
@@ -893,17 +884,11 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
||||
</node>
|
||||
<node id="aggregation_function" xsi:type="Combodo-ValueType-AggregateFunction">
|
||||
<label>UI:DashletGroupBy:Prop-Function</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
|
||||
</data-transform>
|
||||
<class>{{query.selected_class}}</class> <!-- pour savoir si il y a des attributs additionnables -->
|
||||
</node>
|
||||
<node id="aggregation_attribute" xsi:type="Combodo-ValueType-ClassAttribute">
|
||||
<label>UI:DashletGroupBy:Prop-FunctionAttribute</label>
|
||||
<relevance-condition>{{aggregation_function.value != 'count'}}</relevance-condition>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/> <!-- mandatory quoi ! -->
|
||||
</data-transform>
|
||||
<class>{{query.selected_class}}</class>
|
||||
<category>numeric</category>
|
||||
</node>
|
||||
@@ -924,9 +909,6 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
||||
</node>
|
||||
<node id="order_direction" xsi:type="Combodo-ValueType-Choice">
|
||||
<label>UI:DashletGroupBy:Prop-OrderDirection</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/>
|
||||
</data-transform>
|
||||
<values>
|
||||
<value id="asc">
|
||||
<label>UI:DashletGroupBy:Order:asc</label>
|
||||
@@ -966,23 +948,15 @@ Call $this->AddInitialAttributeFlags($sAttCode, $iFlags) for all the initial att
|
||||
</node>
|
||||
<node id="query" xsi:type="Combodo-ValueType-OQL">
|
||||
<label>UI:DashletHeaderDynamic:Prop-Query</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/>
|
||||
</data-transform>
|
||||
</node>
|
||||
<node id="group_by" xsi:type="Combodo-ValueType-ClassAttribute">
|
||||
<label>UI:DashletHeaderDynamic:Prop-GroupBy</label>
|
||||
<data-transform>
|
||||
<xml-node-empty-not-allowed/>
|
||||
</data-transform>
|
||||
<class>{{query.selected_class}}</class>
|
||||
<category>enum</category>
|
||||
</node>
|
||||
<node id="values" xsi:type="Combodo-ValueType-CollectionOfValues">
|
||||
<label>UI:DashletHeaderDynamic:Prop-Values</label>
|
||||
<data-transform>
|
||||
<xml-format xsi:type="xml-format-csv"/>
|
||||
</data-transform>
|
||||
<xml-format xsi:type="Combodo-XMLFormat-CSV"/>
|
||||
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
|
||||
<class>{{query.selected_class}}</class>
|
||||
<attribute>{{group_by.attribute}}</attribute>
|
||||
|
||||
@@ -556,6 +556,13 @@ return array(
|
||||
'Combodo\\iTop\\PropertyType\\PropertyTypeException' => $baseDir . '/sources/PropertyType/PropertyTypeException.php',
|
||||
'Combodo\\iTop\\PropertyType\\PropertyTypeFactory' => $baseDir . '/sources/PropertyType/PropertyTypeFactory.php',
|
||||
'Combodo\\iTop\\PropertyType\\PropertyTypeService' => $baseDir . '/sources/PropertyType/PropertyTypeService.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\SerializerException' => $baseDir . '/sources/PropertyType/Serializer/SerializerException.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\AbstractXMLFormat' => $baseDir . '/sources/PropertyType/Serializer/XMLFormat/AbstractXMLFormat.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatCSV' => $baseDir . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatCSV.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatFactory' => $baseDir . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatFactory.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatFlatArray' => $baseDir . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatFlatArray.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatValueAsId' => $baseDir . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatValueAsId.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLSerializer' => $baseDir . '/sources/PropertyType/Serializer/XMLSerializer.php',
|
||||
'Combodo\\iTop\\PropertyType\\ValueType\\AbstractValueType' => $baseDir . '/sources/PropertyType/ValueType/AbstractValueType.php',
|
||||
'Combodo\\iTop\\PropertyType\\ValueType\\Branch\\AbstractBranchValueType' => $baseDir . '/sources/PropertyType/ValueType/Branch/AbstractBranchValueType.php',
|
||||
'Combodo\\iTop\\PropertyType\\ValueType\\Branch\\ValueTypeCollection' => $baseDir . '/sources/PropertyType/ValueType/Branch/ValueTypeCollection.php',
|
||||
|
||||
@@ -942,6 +942,13 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f
|
||||
'Combodo\\iTop\\PropertyType\\PropertyTypeException' => __DIR__ . '/../..' . '/sources/PropertyType/PropertyTypeException.php',
|
||||
'Combodo\\iTop\\PropertyType\\PropertyTypeFactory' => __DIR__ . '/../..' . '/sources/PropertyType/PropertyTypeFactory.php',
|
||||
'Combodo\\iTop\\PropertyType\\PropertyTypeService' => __DIR__ . '/../..' . '/sources/PropertyType/PropertyTypeService.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\SerializerException' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/SerializerException.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\AbstractXMLFormat' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/XMLFormat/AbstractXMLFormat.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatCSV' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatCSV.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatFactory' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatFactory.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatFlatArray' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatFlatArray.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLFormat\\XMLFormatValueAsId' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/XMLFormat/XMLFormatValueAsId.php',
|
||||
'Combodo\\iTop\\PropertyType\\Serializer\\XMLSerializer' => __DIR__ . '/../..' . '/sources/PropertyType/Serializer/XMLSerializer.php',
|
||||
'Combodo\\iTop\\PropertyType\\ValueType\\AbstractValueType' => __DIR__ . '/../..' . '/sources/PropertyType/ValueType/AbstractValueType.php',
|
||||
'Combodo\\iTop\\PropertyType\\ValueType\\Branch\\AbstractBranchValueType' => __DIR__ . '/../..' . '/sources/PropertyType/ValueType/Branch/AbstractBranchValueType.php',
|
||||
'Combodo\\iTop\\PropertyType\\ValueType\\Branch\\ValueTypeCollection' => __DIR__ . '/../..' . '/sources/PropertyType/ValueType/Branch/ValueTypeCollection.php',
|
||||
|
||||
@@ -43,7 +43,7 @@ class PropertyTypeCompiler
|
||||
* @throws \Combodo\iTop\PropertyType\PropertyTypeException
|
||||
* @throws \DOMFormatException
|
||||
*/
|
||||
protected function CompilePropertyTypeFromXML(string $sXMLContent): PropertyType
|
||||
public function CompilePropertyTypeFromXML(string $sXMLContent): PropertyType
|
||||
{
|
||||
$oDoc = new DesignDocument();
|
||||
libxml_clear_errors();
|
||||
@@ -66,7 +66,7 @@ class PropertyTypeCompiler
|
||||
* @return string
|
||||
* @throws \Combodo\iTop\PropertyType\Compiler\PropertyTypeCompilerException
|
||||
*/
|
||||
protected function GetXMLContent(string $sId, string $sType): string
|
||||
public function GetXMLContent(string $sId, string $sType): string
|
||||
{
|
||||
$sPath = utils::GetAbsoluteModulePath('core')."property_types/$sType/$sId.xml";
|
||||
if (!file_exists($sPath)) {
|
||||
@@ -93,21 +93,6 @@ class PropertyTypeCompiler
|
||||
return $oPropertyType->ToPHPFormBlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $sXMLContent
|
||||
*
|
||||
* @return string
|
||||
* @throws \Combodo\iTop\PropertyType\Compiler\PropertyTypeCompilerException
|
||||
* @throws \Combodo\iTop\PropertyType\PropertyTypeException
|
||||
* @throws \DOMFormatException
|
||||
*/
|
||||
public function CompileEntityFromXML(string $sXMLContent): string
|
||||
{
|
||||
$oPropertyType = $this->CompilePropertyTypeFromXML($sXMLContent);
|
||||
|
||||
return $oPropertyType->ToPHPEntity();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $sId
|
||||
* @param string $sType
|
||||
@@ -123,11 +108,4 @@ class PropertyTypeCompiler
|
||||
|
||||
return $this->CompileFormFromXML($sXMLContent);
|
||||
}
|
||||
|
||||
public function CompileEntity(string $sId, string $sType): string
|
||||
{
|
||||
$sXMLContent = $this->GetXMLContent($sId, $sType);
|
||||
|
||||
return $this->CompileEntityFromXML($sXMLContent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ class PropertyType
|
||||
$sDefinitionNodeType = $oDefinitionNode->getAttribute('xsi:type');
|
||||
|
||||
if (!is_a($sDefinitionNodeType, AbstractValueType::class, true)) {
|
||||
throw new PropertyTypeException('Unsupported type '.json_encode($sDefinitionNodeType).' in ');
|
||||
throw new PropertyTypeException('Unsupported xsi:type '.json_encode($sDefinitionNodeType), $oDomNode);
|
||||
}
|
||||
|
||||
$this->oValueType = new $sDefinitionNodeType();
|
||||
@@ -50,18 +50,11 @@ class PropertyType
|
||||
$aPHPFragments = [];
|
||||
|
||||
if ($this->oValueType->IsLeaf()) {
|
||||
$sFormBlockClass = $this->oValueType->GetFormBlockClass();
|
||||
|
||||
$sLocalPHP = <<<PHP
|
||||
class FormFor__$this->sId extends Combodo\iTop\Forms\Block\Base\FormBlock
|
||||
class FormFor__$this->sId extends $sFormBlockClass
|
||||
{
|
||||
protected function BuildForm(): void
|
||||
{
|
||||
PHP;
|
||||
|
||||
$sLocalPHP .= "\n".$this->oValueType->ToPHPFormBlock($aPHPFragments);
|
||||
|
||||
$sLocalPHP .= <<<PHP
|
||||
}
|
||||
}
|
||||
PHP;
|
||||
$aPHPFragments[] = $sLocalPHP;
|
||||
@@ -76,4 +69,14 @@ PHP;
|
||||
{
|
||||
return $this->sParentType;
|
||||
}
|
||||
|
||||
public function SerializeToDOMNode(mixed $value, DesignElement$oDOMNode): void
|
||||
{
|
||||
$this->oValueType->SerializeToDOMNode($value, $oDOMNode);
|
||||
}
|
||||
|
||||
public function UnserializeFromDOMNode(DesignElement $oDOMNode): mixed
|
||||
{
|
||||
return $this->oValueType->UnserializeFromDOMNode($oDOMNode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,11 +7,21 @@
|
||||
|
||||
namespace Combodo\iTop\PropertyType;
|
||||
|
||||
use Combodo\iTop\DesignDocument;
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Exception;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @since 3.3.0
|
||||
*/
|
||||
class PropertyTypeException extends Exception
|
||||
{
|
||||
public function __construct(string $message = "", ?DesignElement $oNode = null, ?Throwable $previous = null)
|
||||
{
|
||||
if (!is_null($oNode)) {
|
||||
$message = DesignDocument::GetItopNodePath($oNode).': '.$message;
|
||||
}
|
||||
parent::__construct($message, 0, $previous);
|
||||
}
|
||||
}
|
||||
|
||||
14
sources/PropertyType/Serializer/SerializerException.php
Normal file
14
sources/PropertyType/Serializer/SerializerException.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer;
|
||||
|
||||
use Combodo\iTop\PropertyType\PropertyTypeException;
|
||||
|
||||
class SerializerException extends PropertyTypeException
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer\XMLFormat;
|
||||
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
|
||||
|
||||
abstract class AbstractXMLFormat
|
||||
{
|
||||
public function InitFromDomNode(DesignElement $oDomNode): void
|
||||
{
|
||||
}
|
||||
|
||||
abstract public function SerializeToDOMNode(mixed $value, DesignElement $oDOMNode, AbstractValueType $oValueType): void;
|
||||
|
||||
abstract public function UnserializeFromDOMNode(DesignElement $oDOMNode, AbstractValueType $oValueType): mixed;
|
||||
}
|
||||
27
sources/PropertyType/Serializer/XMLFormat/XMLFormatCSV.php
Normal file
27
sources/PropertyType/Serializer/XMLFormat/XMLFormatCSV.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer\XMLFormat;
|
||||
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
|
||||
|
||||
class XMLFormatCSV extends AbstractXMLFormat
|
||||
{
|
||||
public function SerializeToDOMNode($value, $oDOMNode, AbstractValueType $oValueType): void
|
||||
{
|
||||
$sXmlValue = implode(',', $value);
|
||||
$oTextNode = $oDOMNode->ownerDocument->createTextNode($sXmlValue);
|
||||
$oDOMNode->appendChild($oTextNode);
|
||||
}
|
||||
|
||||
public function UnserializeFromDOMNode(DesignElement $oDOMNode, AbstractValueType $oValueType): mixed
|
||||
{
|
||||
$sValue = $oDOMNode->GetText('');
|
||||
return explode(',', $sValue);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer\XMLFormat;
|
||||
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Combodo\iTop\PropertyType\Serializer\SerializerException;
|
||||
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
|
||||
use utils;
|
||||
|
||||
class XMLFormatFactory
|
||||
{
|
||||
private static XMLFormatFactory $oInstance;
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
final public static function GetInstance(): XMLFormatFactory
|
||||
{
|
||||
if (!isset(static::$oInstance)) {
|
||||
static::$oInstance = new XMLFormatFactory();
|
||||
}
|
||||
|
||||
return static::$oInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Combodo\iTop\DesignElement $oDomNode
|
||||
*
|
||||
* @return \Combodo\iTop\PropertyType\Serializer\XMLFormat\AbstractXMLFormat
|
||||
* @throws \Combodo\iTop\PropertyType\Serializer\SerializerException
|
||||
*/
|
||||
public function CreateXMLFormatFromDomNode(DesignElement $oDomNode): AbstractXMLFormat
|
||||
{
|
||||
$sNodeType = $oDomNode->getAttribute('xsi:type');
|
||||
|
||||
if (utils::IsNullOrEmptyString($sNodeType)) {
|
||||
throw new SerializerException("Missing xsi:type in node specification", $oDomNode);
|
||||
}
|
||||
|
||||
if (is_a($sNodeType, AbstractXMLFormat::class, true)) {
|
||||
$oNode = new $sNodeType();
|
||||
$oNode->InitFromDomNode($oDomNode);
|
||||
|
||||
return $oNode;
|
||||
}
|
||||
|
||||
throw new SerializerException("Unknown type node class: ".json_encode($sNodeType), $oDomNode);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer\XMLFormat;
|
||||
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Combodo\iTop\PropertyType\Serializer\SerializerException;
|
||||
use Combodo\iTop\PropertyType\Serializer\XMLFormat\AbstractXMLFormat;
|
||||
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
|
||||
use Combodo\iTop\PropertyType\ValueType\Branch\ValueTypeCollection;
|
||||
|
||||
class XMLFormatFlatArray extends AbstractXMLFormat
|
||||
{
|
||||
private string $sTagFormat;
|
||||
private string $sCountTag;
|
||||
|
||||
public function InitFromDomNode(DesignElement $oDomNode): void
|
||||
{
|
||||
$sTagFormat = $oDomNode->GetChildText('tag-format');
|
||||
if (is_null($sTagFormat)) {
|
||||
throw new SerializerException('Missing <tag-name> element', $oDomNode);
|
||||
}
|
||||
$this->sTagFormat = $sTagFormat;
|
||||
|
||||
$sCountTag = $oDomNode->GetChildText('count-tag');
|
||||
if (is_null($sCountTag)) {
|
||||
throw new SerializerException('Missing <count-tag> element', $oDomNode);
|
||||
}
|
||||
$this->sCountTag = $sCountTag;
|
||||
}
|
||||
|
||||
public function SerializeToDOMNode($value, $oDOMNode, AbstractValueType $oValueType): void
|
||||
{
|
||||
if (!$oValueType instanceof ValueTypeCollection) {
|
||||
throw new SerializerException('XMLFormatFlatArray is allowed only in ValueTypeCollection nodes');
|
||||
}
|
||||
|
||||
$oCountNode = $oDOMNode->ownerDocument->createElement($this->sCountTag, count($value));
|
||||
$oDOMNode->appendChild($oCountNode);
|
||||
foreach ($value as $iRank => $aValues) {
|
||||
foreach ($oValueType->GetChildren() as $oChild) {
|
||||
$sId = $oChild->GetId();
|
||||
if (isset($aValues[$sId])) {
|
||||
$sTagName = \MetaModel::ApplyParams($this->sTagFormat, ['rank' => $iRank, 'id' => $sId]);
|
||||
$oChildNode = $oDOMNode->ownerDocument->createElement($sTagName);
|
||||
$oDOMNode->appendChild($oChildNode);
|
||||
$oChild->SerializeToDOMNode($aValues[$sId], $oChildNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function UnserializeFromDOMNode(DesignElement $oDOMNode, AbstractValueType $oValueType): mixed
|
||||
{
|
||||
$aResults = [];
|
||||
|
||||
if (!$oValueType instanceof ValueTypeCollection) {
|
||||
throw new SerializerException('XMLFormatFlatArray is allowed only in ValueTypeCollection nodes');
|
||||
}
|
||||
|
||||
$iCount = $oDOMNode->GetUniqueElement($this->sCountTag)->GetText(0);
|
||||
for ($iRank = 0; $iRank < $iCount; $iRank++) {
|
||||
foreach ($oValueType->GetChildren() as $oChild) {
|
||||
$sId = $oChild->GetId();
|
||||
$sTagName = \MetaModel::ApplyParams($this->sTagFormat, ['rank' => $iRank, 'id' => $sId]);
|
||||
$oChildNode = $oDOMNode->GetOptionalElement($sTagName);
|
||||
if ($oChildNode) {
|
||||
$aResults[$iRank][$sId] = $oChildNode->GetText('');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $aResults;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer\XMLFormat;
|
||||
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Combodo\iTop\PropertyType\Serializer\SerializerException;
|
||||
use Combodo\iTop\PropertyType\Serializer\XMLFormat\AbstractXMLFormat;
|
||||
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
|
||||
|
||||
class XMLFormatValueAsId extends AbstractXMLFormat
|
||||
{
|
||||
private string $sTagName;
|
||||
|
||||
public function InitFromDomNode(DesignElement $oDomNode): void
|
||||
{
|
||||
$sTagName = $oDomNode->GetChildText('tag-name');
|
||||
if (is_null($sTagName)) {
|
||||
throw new SerializerException("Missing <tag-name> element", $oDomNode);
|
||||
}
|
||||
$this->sTagName = $sTagName;
|
||||
}
|
||||
|
||||
public function SerializeToDOMNode($value, $oDOMNode, AbstractValueType $oValueType): void
|
||||
{
|
||||
foreach ($value as $item) {
|
||||
$oChildNode = $oDOMNode->ownerDocument->createElement($this->sTagName);
|
||||
$oChildNode->setAttribute('id', "$item");
|
||||
$oDOMNode->appendChild($oChildNode);
|
||||
}
|
||||
}
|
||||
|
||||
public function UnserializeFromDOMNode(DesignElement $oDOMNode, AbstractValueType $oValueType): mixed
|
||||
{
|
||||
$aResult = [];
|
||||
|
||||
foreach ($oDOMNode->getElementsByTagName($this->sTagName) as $oNode) {
|
||||
$sValue = $oNode->getAttribute('id');
|
||||
$aResult[] = $sValue;
|
||||
}
|
||||
|
||||
return $aResult;
|
||||
}
|
||||
}
|
||||
57
sources/PropertyType/Serializer/XMLSerializer.php
Normal file
57
sources/PropertyType/Serializer/XMLSerializer.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* @copyright Copyright (C) 2010-2026 Combodo SAS
|
||||
* @license http://opensource.org/licenses/AGPL-3.0
|
||||
*/
|
||||
|
||||
namespace Combodo\iTop\PropertyType\Serializer;
|
||||
|
||||
use Combodo\iTop\DesignElement;
|
||||
use Combodo\iTop\PropertyType\Compiler\PropertyTypeCompiler;
|
||||
use Combodo\iTop\PropertyType\PropertyType;
|
||||
use Combodo\iTop\PropertyType\ValueType\AbstractValueType;
|
||||
|
||||
class XMLSerializer
|
||||
{
|
||||
private static XMLSerializer $oInstance;
|
||||
|
||||
protected function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
final public static function GetInstance(): XMLSerializer
|
||||
{
|
||||
if (!isset(static::$oInstance)) {
|
||||
static::$oInstance = new XMLSerializer();
|
||||
}
|
||||
|
||||
return static::$oInstance;
|
||||
}
|
||||
|
||||
public function Serialize(mixed $value, DesignElement $oParentNode, string $sId, string $sType): void
|
||||
{
|
||||
$sPropertyTypeXML = PropertyTypeCompiler::GetInstance()->GetXMLContent($sId, $sType);
|
||||
|
||||
$this->SerializeForPropertyType($value, $oParentNode, $sPropertyTypeXML);
|
||||
}
|
||||
|
||||
public function Unserialize(DesignElement $oDOMNode, string $sId, string $sType): mixed
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public function SerializeForPropertyType(mixed $value, DesignElement $oParentNode, string $sPropertyTypeXML): void
|
||||
{
|
||||
$oPropertyType = PropertyTypeCompiler::GetInstance()->CompilePropertyTypeFromXML($sPropertyTypeXML);
|
||||
|
||||
$oPropertyType->SerializeToDOMNode($value, $oParentNode);
|
||||
}
|
||||
|
||||
public function UnserializeForPropertyType(DesignElement $oParentNode, string $sPropertyTypeXML): mixed
|
||||
{
|
||||
$oPropertyType = PropertyTypeCompiler::GetInstance()->CompilePropertyTypeFromXML($sPropertyTypeXML);
|
||||
|
||||
return $oPropertyType->UnserializeFromDOMNode($oParentNode);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,3 +117,7 @@ class_alias(\Combodo\iTop\PropertyType\ValueType\Leaf\ValueTypeLabel::class, 'Co
|
||||
class_alias(\Combodo\iTop\PropertyType\ValueType\Leaf\ValueTypeOQL::class, 'Combodo-ValueType-OQL');
|
||||
class_alias(\Combodo\iTop\PropertyType\ValueType\Leaf\ValueTypeString::class, 'Combodo-ValueType-String');
|
||||
class_alias(\Combodo\iTop\PropertyType\ValueType\Leaf\ValueTypeText::class, 'Combodo-ValueType-Text');
|
||||
|
||||
class_alias(\Combodo\iTop\PropertyType\Serializer\XMLFormat\XMLFormatCSV::class, 'Combodo-XMLFormat-CSV');
|
||||
class_alias(\Combodo\iTop\PropertyType\Serializer\XMLFormat\XMLFormatValueAsId::class, 'Combodo-XMLFormat-ValueAsId');
|
||||
class_alias(\Combodo\iTop\PropertyType\Serializer\XMLFormat\XMLFormatFlatArray::class, 'Combodo-XMLFormat-FlatArray');
|
||||
|
||||
@@ -9,6 +9,7 @@ namespace Combodo\iTop\Test\UnitTest;
|
||||
|
||||
use CMDBSource;
|
||||
use DeprecatedCallsLog;
|
||||
use DOMDocument;
|
||||
use MySQLTransactionNotClosedException;
|
||||
use ParseError;
|
||||
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
|
||||
@@ -717,4 +718,34 @@ abstract class ItopTestCase extends KernelTestCase
|
||||
|
||||
return $this->CallUrl($sUrl, $aPostFields, $aCurlOptions, $bXDebugEnabled);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $sXML
|
||||
*
|
||||
* @return false|string
|
||||
*/
|
||||
protected function CanonicalizeXML($sXML)
|
||||
{
|
||||
// Canonicalize the expected XML (to cope with indentation)
|
||||
$oExpectedDocument = new DOMDocument();
|
||||
$oExpectedDocument->preserveWhiteSpace = false;
|
||||
$oExpectedDocument->formatOutput = true;
|
||||
$oExpectedDocument->loadXML($sXML);
|
||||
|
||||
$sSavedXML = $oExpectedDocument->SaveXML();
|
||||
|
||||
return str_replace(' encoding="UTF-8"', '', $sSavedXML);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $sExpected
|
||||
* @param $sActual
|
||||
* @param string $sMessage
|
||||
*/
|
||||
protected function AssertEqualiTopXML($sExpected, $sActual, string $sMessage = '')
|
||||
{
|
||||
// Note: assertEquals reports the differences in a diff which is easier to interpret (in PHPStorm)
|
||||
// as compared to the report given by assertEqualXMLStructure
|
||||
static::assertEquals($this->CanonicalizeXML($sExpected), $this->CanonicalizeXML($sActual), $sMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,36 +64,6 @@ class ModelFactoryTest extends ItopTestCase
|
||||
return $oFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $sXML
|
||||
*
|
||||
* @return false|string
|
||||
*/
|
||||
protected function CanonicalizeXML($sXML)
|
||||
{
|
||||
// Canonicalize the expected XML (to cope with indentation)
|
||||
$oExpectedDocument = new DOMDocument();
|
||||
$oExpectedDocument->preserveWhiteSpace = false;
|
||||
$oExpectedDocument->formatOutput = true;
|
||||
$oExpectedDocument->loadXML($sXML);
|
||||
|
||||
$sSavedXML = $oExpectedDocument->SaveXML();
|
||||
|
||||
return str_replace(' encoding="UTF-8"', '', $sSavedXML);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $sExpected
|
||||
* @param $sActual
|
||||
* @param string $sMessage
|
||||
*/
|
||||
protected function AssertEqualiTopXML($sExpected, $sActual, string $sMessage = '')
|
||||
{
|
||||
// Note: assertEquals reports the differences in a diff which is easier to interpret (in PHPStorm)
|
||||
// as compared to the report given by assertEqualXMLStructure
|
||||
static::assertEquals($this->CanonicalizeXML($sExpected), $this->CanonicalizeXML($sActual), $sMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Assertion ignoring some of the unexpected decoration brought by DOM Elements.
|
||||
*/
|
||||
|
||||
@@ -136,7 +136,7 @@ PHP,
|
||||
</node>
|
||||
<node id="class_property" xsi:type="Combodo-ValueType-Class">
|
||||
<label>UI:Class</label>
|
||||
<categories-csv>test</categories-csv>
|
||||
<categories-csv>test</categories-csv>
|
||||
</node>
|
||||
<node id="class_attribute_property" xsi:type="Combodo-ValueType-ClassAttribute">
|
||||
<label>UI:ClassAttribute</label>
|
||||
@@ -244,6 +244,10 @@ PHP,
|
||||
<nodes>
|
||||
<node id="sub_tree_collection" xsi:type="Combodo-ValueType-Collection">
|
||||
<label>UI:SubTree</label>
|
||||
<xml-format xsi:type="Combodo-XMLFormat-FlatArray">
|
||||
<count-tag>item_count</count-tag>
|
||||
<tag-format>item_\$rank\$_\$id\$</tag-format>
|
||||
</xml-format>
|
||||
<prototype>
|
||||
<node id="string_property" xsi:type="Combodo-ValueType-String">
|
||||
<label>UI:String</label>
|
||||
@@ -580,6 +584,7 @@ PHP,
|
||||
<nodes>
|
||||
<node id="coll" xsi:type="Combodo-ValueType-CollectionOfValues">
|
||||
<label>UI:ClassAttributeValue</label>
|
||||
<xml-format xsi:type="Combodo-XMLFormat-CSV"/>
|
||||
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
|
||||
<class>Contact</class>
|
||||
<attribute>status</attribute>
|
||||
@@ -600,6 +605,22 @@ class FormFor__CollectionOfValuesTest extends Combodo\iTop\Forms\Block\Base\Form
|
||||
]);
|
||||
}
|
||||
}
|
||||
PHP,
|
||||
],
|
||||
'Single value' => [
|
||||
'sXMLContent' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<property_typeproperty_type id="SingleValueTest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<extends>Dashlet</extends>
|
||||
<definition xsi:type="Combodo-ValueType-Label">
|
||||
<label>Single Test</label>
|
||||
</definition>
|
||||
</property_typeproperty_type>
|
||||
XML,
|
||||
'sExpectedPHP' => <<<PHP
|
||||
class FormFor__SingleValueTest extends Combodo\iTop\Forms\Block\DataModel\LabelFormBlock
|
||||
{
|
||||
}
|
||||
PHP,
|
||||
],
|
||||
'test' => [
|
||||
@@ -731,7 +752,7 @@ XML,
|
||||
'Missing value-type in node specification' => [
|
||||
'sXMLContent' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<property_type id="RelevanceCondition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<property_type id="WrongDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<extends>Dashlet</extends>
|
||||
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||
<nodes>
|
||||
@@ -743,13 +764,12 @@ XML,
|
||||
</property_type>
|
||||
XML,
|
||||
'sExpectedClass' => 'Combodo\iTop\PropertyType\PropertyTypeException',
|
||||
'sExpectedMessage' => 'Node: source_property, missing value-type in node specification',
|
||||
'sExpectedMessage' => '/property_type[WrongDefinition]/definition/nodes/node[source_property]: Missing value-type in node specification',
|
||||
],
|
||||
|
||||
'Wrong class for value-type in node specification' => [
|
||||
'sXMLContent' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<property_type id="RelevanceCondition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<property_type id="WrongDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<extends>Dashlet</extends>
|
||||
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||
<nodes>
|
||||
@@ -761,7 +781,71 @@ XML,
|
||||
</property_type>
|
||||
XML,
|
||||
'sExpectedClass' => 'Combodo\iTop\PropertyType\PropertyTypeException',
|
||||
'sExpectedMessage' => 'Node: source_property, unknown type node class: "Test-Combodo"',
|
||||
'sExpectedMessage' => '/property_type[WrongDefinition]/definition/nodes/node[source_property]: Unknown value-type node class: "Test-Combodo"',
|
||||
],
|
||||
'Wrong class for xml-format in node specification' => [
|
||||
'sXMLContent' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<property_type id="WrongDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<extends>Dashlet</extends>
|
||||
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||
<nodes>
|
||||
<node id="coll" xsi:type="Combodo-ValueType-CollectionOfValues">
|
||||
<label>UI:ClassAttributeValue</label>
|
||||
<xml-format xsi:type="Combodo-test"/>
|
||||
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
|
||||
<class>Contact</class>
|
||||
<attribute>status</attribute>
|
||||
</value-type>
|
||||
</node>
|
||||
</nodes>
|
||||
</definition>
|
||||
</property_type>
|
||||
XML,
|
||||
'sExpectedClass' => 'Combodo\iTop\PropertyType\Serializer\SerializerException',
|
||||
'sExpectedMessage' => '/property_type[WrongDefinition]/definition/nodes/node[coll]/xml-format: Unknown type node class: "Combodo-test"',
|
||||
],
|
||||
'Missing class for xml-format in node specification' => [
|
||||
'sXMLContent' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<property_type id="WrongDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<extends>Dashlet</extends>
|
||||
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||
<nodes>
|
||||
<node id="coll" xsi:type="Combodo-ValueType-CollectionOfValues">
|
||||
<label>UI:ClassAttributeValue</label>
|
||||
<xml-format/>
|
||||
<value-type xsi:type="Combodo-ValueType-ClassAttributeValue">
|
||||
<class>Contact</class>
|
||||
<attribute>status</attribute>
|
||||
</value-type>
|
||||
</node>
|
||||
</nodes>
|
||||
</definition>
|
||||
</property_type>
|
||||
XML,
|
||||
'sExpectedClass' => 'Combodo\iTop\PropertyType\Serializer\SerializerException',
|
||||
'sExpectedMessage' => '/property_type[WrongDefinition]/definition/nodes/node[coll]/xml-format: Missing xsi:type in node specification',
|
||||
],
|
||||
'Missing tag in xml-format ' => [
|
||||
'sXMLContent' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<property_type id="WrongDefinition" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Combodo-PropertyType" xsi:noNamespaceSchemaLocation = "https://www.combodo.com/itop-schema/3.3">
|
||||
<extends>Dashlet</extends>
|
||||
<definition xsi:type="Combodo-ValueType-PropertyTree">
|
||||
<nodes>
|
||||
<node xsi:type="Combodo-ValueType-CollectionOfValues">
|
||||
<xml-format xsi:type="Combodo-XMLFormat-ValueAsId">
|
||||
</xml-format>
|
||||
<value-type xsi:type="Combodo-ValueType-Class">
|
||||
</value-type>
|
||||
</node>
|
||||
</nodes>
|
||||
</definition>
|
||||
</property_type>
|
||||
XML,
|
||||
'sExpectedClass' => 'Combodo\iTop\PropertyType\Serializer\SerializerException',
|
||||
'sExpectedMessage' => '/property_type[WrongDefinition]/definition/nodes/node/xml-format: Missing <tag-name> element',
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user