diff options
Diffstat (limited to 'engine/lib/extender.php')
| -rw-r--r-- | engine/lib/extender.php | 249 | 
1 files changed, 249 insertions, 0 deletions
| diff --git a/engine/lib/extender.php b/engine/lib/extender.php new file mode 100644 index 000000000..8323bd3ce --- /dev/null +++ b/engine/lib/extender.php @@ -0,0 +1,249 @@ +<?php +/** + * Elgg Entity Extender. + * This file contains ways of extending an Elgg entity in custom ways. + * + * @package Elgg.Core + * @subpackage DataModel.Extender + */ + +/** + * Detect the value_type for a given value. + * Currently this is very crude. + * + * @todo Make better! + * + * @param mixed  $value      The value + * @param string $value_type If specified, overrides the detection. + * + * @return string + */ +function detect_extender_valuetype($value, $value_type = "") { +	if ($value_type != "" && ($value_type == 'integer' || $value_type == 'text')) { +		return $value_type; +	} + +	// This is crude +	if (is_int($value)) { +		return 'integer'; +	} +	// Catch floating point values which are not integer +	if (is_numeric($value)) { +		return 'text'; +	} + +	return 'text'; +} + +/** + * Utility function used by import_extender_plugin_hook() to process + * an ODDMetaData and add it to an entity. This function does not + * hit ->save() on the entity (this lets you construct in memory) + * + * @param ElggEntity  $entity  The entity to add the data to. + * @param ODDMetaData $element The OpenDD element + * + * @return bool + * @access private + */ +function oddmetadata_to_elggextender(ElggEntity $entity, ODDMetaData $element) { +	// Get the type of extender (metadata, type, attribute etc) +	$type = $element->getAttribute('type'); +	$attr_name = $element->getAttribute('name'); +	$attr_val = $element->getBody(); + +	switch ($type) { +		// Ignore volatile items +		case 'volatile' : +			break; +		case 'annotation' : +			$entity->annotate($attr_name, $attr_val); +			break; +		case 'metadata' : +			$entity->setMetaData($attr_name, $attr_val, "", true); +			break; +		default : // Anything else assume attribute +			$entity->set($attr_name, $attr_val); +	} + +	// Set time if appropriate +	$attr_time = $element->getAttribute('published'); +	if ($attr_time) { +		$entity->set('time_updated', $attr_time); +	} + +	return true; +} + +/** + *  Handler called by trigger_plugin_hook on the "import" event. + * + * @param string $hook        volatile + * @param string $entity_type metadata + * @param string $returnvalue Return value from previous hook + * @param array  $params      The parameters + * + * @return null + * @elgg_plugin_hook_handler volatile metadata + * @todo investigate more. + * @throws ImportException + * @access private + */ +function import_extender_plugin_hook($hook, $entity_type, $returnvalue, $params) { +	$element = $params['element']; + +	$tmp = NULL; + +	if ($element instanceof ODDMetaData) { +		/* @var ODDMetaData $element */ +		// Recall entity +		$entity_uuid = $element->getAttribute('entity_uuid'); +		$entity = get_entity_from_uuid($entity_uuid); +		if (!$entity) { +			throw new ImportException(elgg_echo('ImportException:GUIDNotFound', array($entity_uuid))); +		} + +		oddmetadata_to_elggextender($entity, $element); + +		// Save +		if (!$entity->save()) { +			$attr_name = $element->getAttribute('name'); +			$msg = elgg_echo('ImportException:ProblemUpdatingMeta', array($attr_name, $entity_uuid)); +			throw new ImportException($msg); +		} + +		return true; +	} +} + +/** + * Determines whether or not the specified user can edit the specified piece of extender + * + * @param int    $extender_id The ID of the piece of extender + * @param string $type        'metadata' or 'annotation' + * @param int    $user_guid   The GUID of the user + * + * @return bool + */ +function can_edit_extender($extender_id, $type, $user_guid = 0) { +	// @todo Since Elgg 1.0, Elgg has returned false from can_edit_extender() +	// if no user was logged in. This breaks the access override. This is a +	// temporary work around. This function needs to be rewritten in Elgg 1.9  +	if (!elgg_check_access_overrides($user_guid)) { +		if (!elgg_is_logged_in()) { +			return false; +		} +	} + +	$user_guid = (int)$user_guid; +	$user = get_user($user_guid); +	if (!$user) { +		$user = elgg_get_logged_in_user_entity(); +		$user_guid = elgg_get_logged_in_user_guid(); +	} + +	$functionname = "elgg_get_{$type}_from_id"; +	if (is_callable($functionname)) { +		$extender = call_user_func($functionname, $extender_id); +	} else { +		return false; +	} + +	if (!($extender instanceof ElggExtender)) { +		return false; +	} +	/* @var ElggExtender $extender */ + +	// If the owner is the specified user, great! They can edit. +	if ($extender->getOwnerGUID() == $user_guid) { +		return true; +	} + +	// If the user can edit the entity this is attached to, great! They can edit. +	if (can_edit_entity($extender->entity_guid, $user_guid)) { +		return true; +	} + +	// Trigger plugin hook - note that $user may be null +	$params = array('entity' => $extender->getEntity(), 'user' => $user); +	return elgg_trigger_plugin_hook('permissions_check', $type, $params, false); +} + +/** + * Sets the URL handler for a particular extender type and name. + * It is recommended that you do not call this directly, instead use + * one of the wrapper functions such as elgg_register_annotation_url_handler(). + * + * @param string $extender_type Extender type ('annotation', 'metadata') + * @param string $extender_name The name of the extender + * @param string $function_name The function to register + * + * @return bool + */ +function elgg_register_extender_url_handler($extender_type, $extender_name, $function_name) { + +	global $CONFIG; + +	if (!is_callable($function_name, true)) { +		return false; +	} + +	if (!isset($CONFIG->extender_url_handler)) { +		$CONFIG->extender_url_handler = array(); +	} +	if (!isset($CONFIG->extender_url_handler[$extender_type])) { +		$CONFIG->extender_url_handler[$extender_type] = array(); +	} +	$CONFIG->extender_url_handler[$extender_type][$extender_name] = $function_name; + +	return true; +} + +/** + * Get the URL of a given elgg extender. + * Used by get_annotation_url and get_metadata_url. + * + * @param ElggExtender $extender An extender object + * + * @return string + */ +function get_extender_url(ElggExtender $extender) { +	global $CONFIG; + +	$view = elgg_get_viewtype(); + +	$guid = $extender->entity_guid; +	$type = $extender->type; + +	$url = ""; + +	$function = ""; +	if (isset($CONFIG->extender_url_handler[$type][$extender->name])) { +		$function = $CONFIG->extender_url_handler[$type][$extender->name]; +	} + +	if (isset($CONFIG->extender_url_handler[$type]['all'])) { +		$function = $CONFIG->extender_url_handler[$type]['all']; +	} + +	if (isset($CONFIG->extender_url_handler['all']['all'])) { +		$function = $CONFIG->extender_url_handler['all']['all']; +	} + +	if (is_callable($function)) { +		$url = call_user_func($function, $extender); +	} + +	if ($url == "") { +		$nameid = $extender->id; +		if ($type == 'volatile') { +			$nameid = $extender->name; +		} +		$url = "export/$view/$guid/$type/$nameid/"; +	} + +	return elgg_normalize_url($url); +} + +/** Register the hook */ +elgg_register_plugin_hook_handler("import", "all", "import_extender_plugin_hook", 2); | 
