function unserializeContentObjectAttribute( $package, $objectAttribute, $attributeNode ) { $dateTimeNode = $attributeNode->getElementsByTagName( 'date_time' )->item( 0 ); if ( is_object( $dateTimeNode ) ) { $timestamp = eZDateUtils::textToDate( $dateTimeNode->textContent ); $objectAttribute->setAttribute( 'data_int', $timestamp ); } }
function unserializeContentObjectAttribute($package, $objectAttribute, $attributeNode) { $timeNode = $attributeNode->getElementsByTagName('time')->item(0); if (is_object($timeNode)) { $timestamp = eZDateUtils::textToDate($timeNode->textContent); $timeOfDay = null; if ($timestamp >= 0) { $time = new eZTime($timestamp); $timeOfDay = $time->timeOfDay(); } $objectAttribute->setAttribute('data_int', $timeOfDay); } }
/** * Unserialize xml structure. Creates an object from xml input. * * Transaction unsafe. If you call several transaction unsafe methods you must enclose * the calls within a db transaction; thus within db->begin and db->commit. * * @param mixed $package * @param DOMElement $domNode * @param array $options * @param int|bool $ownerID Override owner ID, null to use XML owner id (optional) * @param string $handlerType * @return array|bool|eZContentObject|null created object, false if could not create object/xml invalid */ static function unserialize( $package, $domNode, &$options, $ownerID = false, $handlerType = 'ezcontentobject' ) { if ( $domNode->localName != 'object' ) { $retValue = false; return $retValue; } $initialLanguage = eZContentObject::mapLanguage( $domNode->getAttribute( 'initial_language' ), $options ); if( $initialLanguage === 'skip' ) { $retValue = true; return $retValue; } $sectionID = $domNode->getAttributeNS( 'http://ez.no/ezobject', 'section_id' ); if ( $ownerID === false ) { $ownerID = $domNode->getAttributeNS( 'http://ez.no/ezobject', 'owner_id' ); } $remoteID = $domNode->getAttribute( 'remote_id' ); $name = $domNode->getAttribute( 'name' ); $classRemoteID = $domNode->getAttribute( 'class_remote_id' ); $classIdentifier = $domNode->getAttributeNS( 'http://ez.no/ezobject', 'class_identifier' ); $alwaysAvailable = ( $domNode->getAttributeNS( 'http://ez.no/ezobject', 'always_available' ) == '1' ); $contentClass = eZContentClass::fetchByRemoteID( $classRemoteID ); if ( !$contentClass ) { $contentClass = eZContentClass::fetchByIdentifier( $classIdentifier ); } if ( !$contentClass ) { $options['error'] = array( 'error_code' => self::PACKAGE_ERROR_NO_CLASS, 'element_id' => $remoteID, 'description' => "Can't install object '$name': Unable to fetch class with remoteID: $classRemoteID." ); $retValue = false; return $retValue; } /** @var DOMElement $versionListNode */ $versionListNode = $domNode->getElementsByTagName( 'version-list' )->item( 0 ); $importedLanguages = array(); foreach( $versionListNode->getElementsByTagName( 'version' ) as $versionDOMNode ) { /** @var DOMElement $versionDOMNode */ foreach ( $versionDOMNode->getElementsByTagName( 'object-translation' ) as $versionDOMNodeChild ) { /** @var DOMElement $versionDOMNodeChild */ $importedLanguage = eZContentObject::mapLanguage( $versionDOMNodeChild->getAttribute( 'language' ), $options ); $language = eZContentLanguage::fetchByLocale( $importedLanguage ); // Check if the language is allowed in this setup. if ( $language ) { $hasTranslation = true; } else { if ( $importedLanguage == 'skip' ) continue; // if there is no needed translation in system then add it $locale = eZLocale::instance( $importedLanguage ); $translationName = $locale->internationalLanguageName(); $translationLocale = $locale->localeCode(); if ( $locale->isValid() ) { eZContentLanguage::addLanguage( $locale->localeCode(), $locale->internationalLanguageName() ); $hasTranslation = true; } else $hasTranslation = false; } if ( $hasTranslation ) { $importedLanguages[] = $importedLanguage; $importedLanguages = array_unique( $importedLanguages ); } } } // If object exists we return a error. // Minimum install element is an object now. $contentObject = eZContentObject::fetchByRemoteID( $remoteID ); // Figure out initial language if ( !$initialLanguage || !in_array( $initialLanguage, $importedLanguages ) ) { $initialLanguage = false; foreach ( eZContentLanguage::prioritizedLanguages() as $language ) { if ( in_array( $language->attribute( 'locale' ), $importedLanguages ) ) { $initialLanguage = $language->attribute( 'locale' ); break; } } } if ( !$contentObject ) { $firstVersion = true; $contentObject = $contentClass->instantiateIn( $initialLanguage, $ownerID, $sectionID ); } else { $firstVersion = false; $description = "Object '$name' already exists."; $choosenAction = eZPackageHandler::errorChoosenAction( self::PACKAGE_ERROR_EXISTS, $options, $description, $handlerType, false ); switch( $choosenAction ) { case eZPackage::NON_INTERACTIVE: case self::PACKAGE_UPDATE: { // Keep existing contentobject. } break; case self::PACKAGE_REPLACE: { eZContentObjectOperations::remove( $contentObject->attribute( 'id' ) ); unset( $contentObject ); $contentObject = $contentClass->instantiateIn( $initialLanguage, $ownerID, $sectionID ); $firstVersion = true; } break; case self::PACKAGE_SKIP: { $retValue = true; return $retValue; } break; case self::PACKAGE_NEW: { $contentObject->setAttribute( 'remote_id', eZRemoteIdUtility::generate( 'object' ) ); $contentObject->store(); unset( $contentObject ); $contentObject = $contentClass->instantiateIn( $initialLanguage, $ownerID, $sectionID ); $firstVersion = true; } break; default: { $options['error'] = array( 'error_code' => self::PACKAGE_ERROR_EXISTS, 'element_id' => $remoteID, 'description' => $description, 'actions' => array( self::PACKAGE_REPLACE => ezpI18n::tr( 'kernel/classes', 'Replace existing object' ), self::PACKAGE_SKIP => ezpI18n::tr( 'kernel/classes', 'Skip object' ), self::PACKAGE_NEW => ezpI18n::tr( 'kernel/classes', 'Keep existing and create a new one' ), self::PACKAGE_UPDATE => ezpI18n::tr( 'kernel/classes', 'Update existing object' ) ) ); $retValue = false; return $retValue; } break; } } $db = eZDB::instance(); $db->begin(); if ( $alwaysAvailable ) { // Make sure always available bit is set. $contentObject->setAttribute( 'language_mask', (int)$contentObject->attribute( 'language_mask' ) | 1 ); } $contentObject->setAttribute( 'section_id', $sectionID ); $contentObject->store(); $activeVersion = false; $lastVersion = false; $versionListActiveVersion = $versionListNode->getAttribute( 'active_version' ); $contentObject->setAttribute( 'remote_id', $remoteID ); $contentObject->setAttribute( 'contentclass_id', $contentClass->attribute( 'id' ) ); $contentObject->store(); $sectionObject = eZSection::fetch( $sectionID ); if ( $sectionObject instanceof eZSection ) { $updateWithParentSection = false; } else { $updateWithParentSection = true; } $options['language_array'] = $importedLanguages; $versionList = array(); foreach( $versionListNode->getElementsByTagName( 'version' ) as $versionDOMNode ) { unset( $nodeList ); $nodeList = array(); $contentObjectVersion = eZContentObjectVersion::unserialize( $versionDOMNode, $contentObject, $ownerID, $sectionID, $versionListActiveVersion, $firstVersion, $nodeList, $options, $package, 'ezcontentobject', $initialLanguage ); if ( !$contentObjectVersion ) { $db->commit(); $retValue = false; return $retValue; } $versionStatus = $versionDOMNode->getAttributeNS( 'http://ez.no/ezobject', 'status' ); $versionList[$versionDOMNode->getAttributeNS( 'http://ez.no/ezobject', 'version' )] = array( 'node_list' => $nodeList, 'status' => $versionStatus ); unset( $versionStatus ); $firstVersion = false; $lastVersion = $contentObjectVersion->attribute( 'version' ); if ( $versionDOMNode->getAttribute( 'version' ) == $versionListActiveVersion ) { $activeVersion = $contentObjectVersion->attribute( 'version' ); } eZNodeAssignment::setNewMainAssignment( $contentObject->attribute( 'id' ), $lastVersion ); eZOperationHandler::execute( 'content', 'publish', array( 'object_id' => $contentObject->attribute( 'id' ), 'version' => $lastVersion ) ); $mainNodeInfo = null; foreach ( $nodeList as $nodeInfo ) { if ( $nodeInfo['is_main'] ) { $mainNodeInfo =& $nodeInfo; break; } } if ( $mainNodeInfo ) { $existingMainNode = eZContentObjectTreeNode::fetchByRemoteID( $mainNodeInfo['parent_remote_id'], false ); if ( $existingMainNode ) { eZContentObjectTreeNode::updateMainNodeID( $existingMainNode['node_id'], $mainNodeInfo['contentobject_id'], $mainNodeInfo['contentobject_version'], $mainNodeInfo['parent_node'], $updateWithParentSection ); } } unset( $mainNodeInfo ); // Refresh $contentObject from DB. $contentObject = eZContentObject::fetch( $contentObject->attribute( 'id' ) ); } if ( !$activeVersion ) { $activeVersion = $lastVersion; } /* $contentObject->setAttribute( 'current_version', $activeVersion ); */ $contentObject->setAttribute( 'name', $name ); if ( isset( $options['use_dates_from_package'] ) && $options['use_dates_from_package'] ) { $contentObject->setAttribute( 'published', eZDateUtils::textToDate( $domNode->getAttributeNS( 'http://ez.no/ezobject', 'published' ) ) ); $contentObject->setAttribute( 'modified', eZDateUtils::textToDate( $domNode->getAttributeNS( 'http://ez.no/ezobject', 'modified' ) ) ); } $contentObject->store(); $versions = $contentObject->versions(); $objectName = $contentObject->name(); $objectID = $contentObject->attribute( 'id' ); foreach ( $versions as $version ) { $versionNum = $version->attribute( 'version' ); $oldVersionStatus = $version->attribute( 'status' ); $newVersionStatus = isset( $versionList[$versionNum] ) ? $versionList[$versionNum]['status'] : null; // set the correct status for non-published versions if ( isset( $newVersionStatus ) && $oldVersionStatus != $newVersionStatus && $newVersionStatus != eZContentObjectVersion::STATUS_PUBLISHED ) { $version->setAttribute( 'status', $newVersionStatus ); $version->store( array( 'status' ) ); } // when translation does not have object name set then we copy object name from the current object version $translations = $version->translations( false ); if ( !$translations ) continue; foreach ( $translations as $translation ) { if ( ! $contentObject->name( $versionNum, $translation ) ) { eZDebug::writeNotice( "Setting name '$objectName' for version ($versionNum) of the content object ($objectID) in language($translation)" ); $contentObject->setName( $objectName, $versionNum, $translation ); } } } foreach ( $versionList[$versionListActiveVersion]['node_list'] as $nodeInfo ) { unset( $parentNode ); $parentNode = eZContentObjectTreeNode::fetchNode( $contentObject->attribute( 'id' ), $nodeInfo['parent_node'] ); if ( is_object( $parentNode ) ) { $parentNode->setAttribute( 'priority', $nodeInfo['priority'] ); $parentNode->store( array( 'priority' ) ); } } $db->commit(); return $contentObject; }
static function unserialize( $domNode, $contentObject, $ownerID, $sectionID, $activeVersion, $firstVersion, &$nodeList, &$options, $package, $handlerType = 'ezcontentobject' ) { $oldVersion = $domNode->getAttributeNS( 'http://ez.no/ezobject', 'version' ); $status = $domNode->getAttributeNS( 'http://ez.no/ezobject', 'status' ); $languageNodeArray = $domNode->getElementsByTagName( 'object-translation' ); $initialLanguage = false; $importedLanguages = $options['language_array']; $currentLanguages = array(); foreach( $languageNodeArray as $languageNode ) { $language = eZContentObjectVersion::mapLanguage( $languageNode->getAttribute( 'language' ), $options ); if ( in_array( $language, $importedLanguages ) ) { $currentLanguages[] = $language; } } foreach ( eZContentLanguage::prioritizedLanguages() as $language ) { if ( in_array( $language->attribute( 'locale' ), $currentLanguages ) ) { $initialLanguage = $language->attribute( 'locale' ); break; } } if ( !$initialLanguage ) { $initialLanguage = $currentLanguages[0]; } if ( $firstVersion ) { $contentObjectVersion = $contentObject->version( 1 ); } else { // Create new version in specific language but with empty data. $contentObjectVersion = $contentObject->createNewVersionIn( $initialLanguage ); } $created = eZDateUtils::textToDate( $domNode->getAttributeNS( 'http://ez.no/ezobject', 'created' ) ); $modified = eZDateUtils::textToDate( $domNode->getAttributeNS( 'http://ez.no/ezobject', 'modified' ) ); $contentObjectVersion->setAttribute( 'created', $created ); $contentObjectVersion->setAttribute( 'modified', $modified ); $contentObjectVersion->setAttribute( 'status', eZContentObjectVersion::STATUS_DRAFT ); $contentObjectVersion->store(); $db = eZDB::instance(); $db->begin(); foreach( $languageNodeArray as $languageNode ) { $language = eZContentObjectVersion::mapLanguage( $languageNode->getAttribute( 'language' ), $options ); // Only import allowed languages. if ( !in_array( $language, $importedLanguages ) ) { continue; } $attributeArray = $contentObjectVersion->contentObjectAttributes( $language ); if ( count( $attributeArray ) == 0) { $hasTranslation = eZContentLanguage::fetchByLocale( $language ); if ( !$hasTranslation ) { // if there is no needed translation in system then add it $locale = eZLocale::instance( $language ); if ( $locale->isValid() ) { eZContentLanguage::addLanguage( $locale->localeCode(), $locale->internationalLanguageName() ); $hasTranslation = true; } else $hasTranslation = false; } if ( $hasTranslation ) { // Add translated attributes for the translation $originalContentAttributes = $contentObjectVersion->contentObjectAttributes( $initialLanguage ); foreach ( $originalContentAttributes as $originalContentAttribute ) { $contentAttribute = $originalContentAttribute->translateTo( $language ); $contentAttribute->sync(); $attributeArray[] = $contentAttribute; } } // unserialize object name in current version-translation $objectName = $languageNode->getAttribute( 'object_name' ); if ( $objectName ) $contentObject->setName( $objectName, $contentObjectVersion->attribute( 'version' ), $language ); } $xpath = new DOMXPath( $domNode->ownerDocument ); $xpath->registerNamespace( 'ezobject', 'http://ez.no/object/' ); $xpath->registerNamespace( 'ezremote', 'http://ez.no/ezobject' ); foreach( $attributeArray as $attribute ) { $attributeIdentifier = $attribute->attribute( 'contentclass_attribute_identifier' ); $xpathQuery = "ezobject:attribute[@ezremote:identifier='$attributeIdentifier']"; $attributeDomNodes = $xpath->query( $xpathQuery, $languageNode ); $attributeDomNode = $attributeDomNodes->item( 0 ); if ( !$attributeDomNode ) { continue; } $attribute->unserialize( $package, $attributeDomNode ); $attribute->store(); } } $objectRelationList = $domNode->getElementsByTagName( 'object-relation-list' )->item( 0 ); if ( $objectRelationList ) { $objectRelationArray = $objectRelationList->getElementsByTagName( 'related-object-remote-id' ); foreach( $objectRelationArray as $objectRelation ) { $relatedObjectRemoteID = $objectRelation->textContent; if ( $relatedObjectRemoteID ) { $object = eZContentObject::fetchByRemoteID( $relatedObjectRemoteID ); $relatedObjectID = ( $object !== null ) ? $object->attribute( 'id' ) : null; if ( $relatedObjectID ) { $contentObject->addContentObjectRelation( $relatedObjectID, $contentObjectVersion->attribute( 'version' ) ); } else { if ( !isset( $options['suspended-relations'] ) ) { $options['suspended-relations'] = array(); } $options['suspended-relations'][] = array( 'related-object-remote-id' => $relatedObjectRemoteID, 'contentobject-id' => $contentObject->attribute( 'id' ), 'contentobject-version' => $contentObjectVersion->attribute( 'version' ) ); } } } } $nodeAssignmentNodeList = $domNode->getElementsByTagName( 'node-assignment-list' )->item( 0 ); $nodeAssignmentNodeArray = $nodeAssignmentNodeList->getElementsByTagName( 'node-assignment' ); foreach( $nodeAssignmentNodeArray as $nodeAssignmentNode ) { $result = eZContentObjectTreeNode::unserialize( $nodeAssignmentNode, $contentObject, $contentObjectVersion->attribute( 'version' ), ( $oldVersion == $activeVersion ? 1 : 0 ), $nodeList, $options, $handlerType ); if ( $result === false ) { $db->commit(); $retValue = false; return $retValue; } } $contentObjectVersion->store(); $db->commit(); return $contentObjectVersion; }