diff options
| -rw-r--r-- | engine/lib/export.php | 122 | 
1 files changed, 76 insertions, 46 deletions
diff --git a/engine/lib/export.php b/engine/lib/export.php index 61cee79ba..994789042 100644 --- a/engine/lib/export.php +++ b/engine/lib/export.php @@ -12,6 +12,7 @@  	/**  	 * Define an interface for all exportable objects. +	 * @author Marcus Povey  	 */  	interface Exportable  	{ @@ -22,6 +23,22 @@  	}  	/** +	 * Define an interface for all importable objects. +	 * @author Marcus Povey +	 */ +	interface Importable +	{ +		/** +		 * Accepts an array of data to import, this data is parsed from the XML produced by export. +		 * The function should return the constructed object data, or NULL. +		 * +		 * @param array $data +		 * @throws ImportException if there was a critical error importing data. +		 */ +		public function import(array $data); +	} +	 +	/**  	 * Export a GUID.  	 *   	 * This function exports a GUID and all information related to it in an XML format. @@ -64,51 +81,66 @@  		$wrapper->data = $to_be_serialised;  		return serialise_object_to_xml($wrapper, "elggexport"); -		 - -		/* -		  	XML will look something like this: - - -			<elgg> -				<elgguser uuid="skdfjslklkjsldkfsdfjs:556"> -					<guid>556</guid> -					<name>Marcus Povey</name> - -					... -				 -				</elgguser> -				<annotation> -					<name>Foo</name> -					<value>baaaa</value> -				</annotation> -				<annotation> -					<name>Monkey</name> -					<value>bibble</value> -				</annotation> - -				... - -				<metadata> -					<name>Foo</name> -					<value>baaaa</value> -				</metadata> - -				... - -				<my_plugin> - -					... - -				</my_plugin> +	} +	 -			</elgg>  -		  -		 */ -		 +	/** +	 * XML 2 Array function. +	 * Taken from http://www.bytemycode.com/snippets/snippet/445/ +	 * @license UNKNOWN - Please contact if you are the original author of this code. +	 * @author UNKNOWN +	 */ +	function __xml2array($xml)  +	{ +        $xmlary = array(); +                +        $reels = '/<(\w+)\s*([^\/>]*)\s*(?:\/>|>(.*)<\/\s*\\1\s*>)/s'; +        $reattrs = '/(\w+)=(?:"|\')([^"\']*)(:?"|\')/'; + +        preg_match_all($reels, $xml, $elements); + +        foreach ($elements[1] as $ie => $xx) { +	        $xmlary[$ie]["name"] = $elements[1][$ie]; +	        +	        if ($attributes = trim($elements[2][$ie])) { +	                preg_match_all($reattrs, $attributes, $att); +	                foreach ($att[1] as $ia => $xx) +	                        $xmlary[$ie]["attributes"][$att[1][$ia]] = $att[2][$ia]; +	        } +	 +	        $cdend = strpos($elements[3][$ie], "<"); +	        if ($cdend > 0) { +	                $xmlary[$ie]["text"] = substr($elements[3][$ie], 0, $cdend - 1); +	        } +	 +	        if (preg_match($reels, $elements[3][$ie])) +	                $xmlary[$ie]["elements"] = __xml2array($elements[3][$ie]); +	        else if ($elements[3][$ie]) { +	                $xmlary[$ie]["text"] = $elements[3][$ie]; +	        } +        } + +        return $xmlary;  	}  	/** +	 * 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. +	 */ +	function __process_element(array $dom) +	{ +		foreach ($dom as $element) +		{ +			// See if anyone handles this element, return true if it is. +			$handled = trigger_plugin_hook("import", "all", array("name" => $element['name'], "element" => $element), $to_be_serialised); +		 +			// If not, then see if any of its sub elements are handled +			if ((!$handled) && (isset($element['elements']))) __process_element($element['elements']); +		} +	} + +	/**  	 * Import an XML serialisation of an object.  	 * This will make a best attempt at importing a given xml doc.  	 * @@ -117,12 +149,9 @@  	 */  	function import($xml)  	{ -		// import via object ?  - -		// import via tag : so you pass a tag "<foo>" and all its contents out and something answers by handling it. -		// THis is recursive but bredth first. - +		$dom = __xml2array($xml); +		__process_element($dom);  	}  	/** @@ -216,4 +245,5 @@  	class ExportException extends Exception {}  	class ImportException extends Exception {} +	  ?>
\ No newline at end of file  | 
