diff options
Diffstat (limited to 'engine/lib/export.php')
| -rw-r--r-- | engine/lib/export.php | 223 | 
1 files changed, 223 insertions, 0 deletions
| diff --git a/engine/lib/export.php b/engine/lib/export.php new file mode 100644 index 000000000..ecc894e63 --- /dev/null +++ b/engine/lib/export.php @@ -0,0 +1,223 @@ +<?php +/** + * Elgg Data import export functionality. + * + * @package Elgg.Core + * @subpackage DataModel.Export + */ + +/** + * Get a UUID from a given object. + * + * @param mixed $object The object either an ElggEntity, ElggRelationship or ElggExtender + * + * @return string|false the UUID or false + */ +function get_uuid_from_object($object) { +	if ($object instanceof ElggEntity) { +		return guid_to_uuid($object->guid); +	} else if ($object instanceof ElggExtender) { +		$type = $object->type; +		if ($type == 'volatile') { +			$uuid = guid_to_uuid($object->entity_guid) . $type . "/{$object->name}/"; +		} else { +			$uuid = guid_to_uuid($object->entity_guid) . $type . "/{$object->id}/"; +		} + +		return $uuid; +	} else if ($object instanceof ElggRelationship) { +		return guid_to_uuid($object->guid_one) . "relationship/{$object->id}/"; +	} + +	return false; +} + +/** + * Generate a UUID from a given GUID. + * + * @param int $guid The GUID of an object. + * + * @return string + */ +function guid_to_uuid($guid) { +	return elgg_get_site_url()  . "export/opendd/$guid/"; +} + +/** + * Test to see if a given uuid is for this domain, returning true if so. + * + * @param string $uuid A unique ID + * + * @return bool + */ +function is_uuid_this_domain($uuid) { +	if (strpos($uuid, elgg_get_site_url()) === 0) { +		return true; +	} + +	return false; +} + +/** + * This function attempts to retrieve a previously imported entity via its UUID. + * + * @param string $uuid A unique ID + * + * @return ElggEntity|false + */ +function get_entity_from_uuid($uuid) { +	$uuid = sanitise_string($uuid); + +	$options = array('metadata_name' => 'import_uuid', 'metadata_value' => $uuid); +	$entities = elgg_get_entities_from_metadata($options); + +	if ($entities) { +		return $entities[0]; +	} + +	return false; +} + +/** + * Tag a previously created guid with the uuid it was imported on. + * + * @param int    $guid A GUID + * @param string $uuid A Unique ID + * + * @return bool + */ +function add_uuid_to_guid($guid, $uuid) { +	$guid = (int)$guid; +	$uuid = sanitise_string($uuid); + +	$result = create_metadata($guid, "import_uuid", $uuid); +	return (bool)$result; +} + + +$IMPORTED_DATA = array(); +$IMPORTED_OBJECT_COUNTER = 0; + +/** + * This function processes an element, passing elements to the plugin stack to see if someone will + * process it. + * + * If nobody processes the top level element, the sub level elements are processed. + * + * @param ODD $odd The odd element to process + * + * @return bool + * @access private + */ +function _process_element(ODD $odd) { +	global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER; + +	// See if anyone handles this element, return true if it is. +	$to_be_serialised = null; +	if ($odd) { +		$handled = elgg_trigger_plugin_hook("import", "all", array("element" => $odd), $to_be_serialised); + +		// If not, then see if any of its sub elements are handled +		if ($handled) { +			// Increment validation counter +			$IMPORTED_OBJECT_COUNTER ++; +			// Return the constructed object +			$IMPORTED_DATA[] = $handled; + +			return true; +		} +	} + +	return false; +} + +/** + * Exports an entity as an array + * + * @param int $guid Entity GUID + * + * @return array + * @throws ExportException + * @access private + */ +function exportAsArray($guid) { +	$guid = (int)$guid; + +	// Trigger a hook to +	$to_be_serialised = elgg_trigger_plugin_hook("export", "all", array("guid" => $guid), array()); + +	// Sanity check +	if ((!is_array($to_be_serialised)) || (count($to_be_serialised) == 0)) { +		throw new ExportException(elgg_echo('ExportException:NoSuchEntity', array($guid))); +	} + +	return $to_be_serialised; +} + +/** + * Export a GUID. + * + * This function exports a GUID and all information related to it in an XML format. + * + * This function makes use of the "serialise" plugin hook, which is passed an array to which plugins + * should add data to be serialised to. + * + * @param int $guid The GUID. + * + * @return string XML + * @see ElggEntity for an example of its usage. + * @access private + */ +function export($guid) { +	$odd = new ODDDocument(exportAsArray($guid)); + +	return ODD_Export($odd); +} + +/** + * Import an XML serialisation of an object. + * This will make a best attempt at importing a given xml doc. + * + * @param string $xml XML string + * + * @return bool + * @throws ImportException if there was a problem importing the data. + * @access private + */ +function import($xml) { +	global $IMPORTED_DATA, $IMPORTED_OBJECT_COUNTER; + +	$IMPORTED_DATA = array(); +	$IMPORTED_OBJECT_COUNTER = 0; + +	$document = ODD_Import($xml); +	if (!$document) { +		throw new ImportException(elgg_echo('ImportException:NoODDElements')); +	} + +	foreach ($document as $element) { +		_process_element($element); +	} + +	if ($IMPORTED_OBJECT_COUNTER != count($IMPORTED_DATA)) { +		throw new ImportException(elgg_echo('ImportException:NotAllImported')); +	} + +	return true; +} + + +/** + * Register the OpenDD import action + * + * @return void + * @access private + */ +function export_init() { +	global $CONFIG; + +	elgg_register_action("import/opendd"); +} + +// Register a startup event +elgg_register_event_handler('init', 'system', 'export_init', 100); | 
