/** * @param ClassTemplate $classTemplate */ public function addEntry(ClassTemplate $classTemplate) { $fhirElementName = $classTemplate->getElementName(); $extendedMapEntry = $classTemplate->getExtendedElementMapEntry(); $this->_bigDumbMap[$fhirElementName] = array('fullClassName' => $classTemplate->compileFullyQualifiedClassName(true), 'extendedElementName' => $extendedMapEntry ? $extendedMapEntry->getFHIRElementName() : null, 'properties' => array()); foreach ($classTemplate->getMethods() as $method) { if ($method instanceof SetterMethodTemplate) { /** @var \DCarbone\PHPFHIR\ClassGenerator\Template\Parameter\PropertyParameterTemplate $parameter */ foreach ($method->getParameters() as $parameter) { $property = $parameter->getProperty(); $this->_bigDumbMap[$fhirElementName]['properties'][$property->getName()] = array('setter' => $method->getName(), 'element' => $property->getFHIRElementType(), 'type' => $property->getPHPType()); } } } }
/** * @param ClassTemplate $classTemplate */ public static function implementXMLSerialize(ClassTemplate $classTemplate) { $method = new BaseMethodTemplate('xmlSerialize'); $method->addParameter(new BaseParameterTemplate('returnSXE', 'boolean', 'false')); $method->addParameter(new BaseParameterTemplate('sxe', '\\SimpleXMLElement', 'null')); $method->setReturnStatement('$sxe->saveXML()'); $method->setReturnValueType('string|\\SimpleXMLElement'); $classTemplate->addMethod($method); $properties = $classTemplate->getProperties(); $simple = true; if (2 === count($properties)) { foreach ($properties as $property) { $name = $property->getName(); if ('_fhirElementName' === $name || 'value' === $name) { continue; } $simple = false; break; } } else { $simple = false; } $rootElementName = str_replace(NameUtils::$classNameSearch, NameUtils::$classNameReplace, $classTemplate->getElementName()); // If this is the root object... $method->addLineToBody(sprintf('if (null === $sxe) $sxe = new \\SimpleXMLElement(\'<%s xmlns="%s"></%s>\');', $rootElementName, FHIR_XMLNS, $rootElementName)); // For simple properties we need to simply add an attribute. if ($simple) { $method->addLineToBody('$sxe->addAttribute(\'value\', $this->value);'); } else { // Determine if this class is a child... if ($classTemplate->getExtendedElementMapEntry()) { $method->addLineToBody('parent::xmlSerialize(true, $sxe);'); } foreach ($properties as $property) { $name = $property->getName(); if ('_fhirElementName' === $name) { continue; } if (array_key_exists($rootElementName, self::$xmlSerializationAttributeOverrides) === true && self::$xmlSerializationAttributeOverrides[$rootElementName] === $name) { $method->addLineToBody(sprintf('if (null !== $this->%s) $sxe->addAttribute(\'%s\', (string)$this->%s);', $name, $name, $name)); continue; } if ($property->isCollection()) { $method->addLineToBody(sprintf('if (0 < count($this->%s)) {', $name)); $method->addLineToBody(sprintf(' foreach($this->%s as $%s) {', $name, $name)); $method->addLineToBody(sprintf(' $%s->xmlSerialize(true, $sxe->addChild(\'%s\'));', $name, $name)); $method->addLineToBody(' }'); $method->addLineToBody('}'); } else { if ($property->isPrimitive() || $property->isList() || $property->isHTML()) { $method->addLineToBody(sprintf('if (null !== $this->%s) {', $name)); $method->addLineToBody(sprintf(' $%sElement = $sxe->addChild(\'%s\');', $name, $name)); $method->addLineToBody(sprintf(' $%sElement->addAttribute(\'value\', (string)$this->%s);', $name, $name)); $method->addLineToBody('}'); } else { $method->addLineToBody(sprintf('if (null !== $this->%s) $this->%s->xmlSerialize(true, $sxe->addChild(\'%s\'));', $name, $name, $name)); } } } } $method->addLineToBody('if ($returnSXE) return $sxe;'); }