Files
kupshop/bundles/KupShop/FeedGeneratorBundle/XSD/ElementNode.php
2025-08-02 16:30:27 +02:00

65 lines
1.8 KiB
PHP

<?php
namespace KupShop\FeedGeneratorBundle\XSD;
use KupShop\FeedGeneratorBundle\XSD\Definition\SerializableNode;
use KupShop\FeedGeneratorBundle\XSD\Definition\Type;
class ElementNode extends SerializableNode
{
private ?Type $selfType = null;
private ?Type $childType = null;
public function __construct(\DOMXPath $xpath, \DOMElement $element, \ArrayObject $typeContext)
{
parent::__construct($xpath, $element, $typeContext);
$this->parseTypeDescription($this->element->getAttribute('type'));
}
private function parseTypeDescription(string $type): void
{
// if is native XSD type, return with the type name
if (NativeType::isXSDNativeType($type)) {
$this->selfType = new NativeType($type);
}
// if was already registered
elseif (isset($this->typeContext[$type])) {
$this->selfType = $this->typeContext[$type];
}
foreach ($this->getChildElements() as $child) {
if (TypeNode::isXSDType($child)) {
$this->childType = new TypeNode($this->xpathInstance, $child, $this->typeContext);
break;
}
}
}
public function serialize(): array
{
$elem = [];
if (!empty($this->selfType)) {
$elem += $this->selfType->serialize();
}
if (!empty($this->childType)) {
$elem['children'] = $this->childType->serialize();
}
return array_merge(
$elem, // must be first -> types also have names
parent::serialize(),
);
}
public function getChildType(): ?Type
{
return $this->childType;
}
public function getSelfType(): ?Type
{
return $this->selfType;
}
}