/** * {@inheritdoc} */ public function handle(\ElggEntity $entity) { $shortname = $this->getShortname(); if ($entity->guid) { $current_metadata = elgg_get_metadata(array('guids' => (int) $entity->guid, 'metadata_names' => $shortname, 'limit' => 0)); if (!empty($current_metadata)) { foreach ($current_metadata as $md) { $current_metadata_ids[] = $md->id; } } } if (empty($current_metadata_ids)) { $current_metadata_ids = array(); } $future_metadata = get_input($this->getShortname(), array()); $params = array('field' => $this, 'entity' => $entity, 'metadata_name' => $shortname, 'value' => $current_metadata, 'future_value' => $future_metadata); // Allow plugins to prevent metadata from being changed if (!elgg_trigger_plugin_hook('handle:metadata:before', 'prototyper', $params, true)) { return $entity; } $future_metadata_ids = elgg_extract('id', $future_metadata, array()); $to_delete = array_diff($current_metadata_ids, $future_metadata_ids); if (!empty($to_delete)) { elgg_delete_metadata(array('guids' => (int) $entity->guid, 'metadata_ids' => $to_delete, 'limit' => 0)); } $keys = array_keys(elgg_extract('name', $future_metadata, array())); $ids = array(); foreach ($keys as $i) { $id = $future_metadata['id'][$i]; $name = $future_metadata['name'][$i]; $value = $future_metadata['value'][$i]; $value_type = $this->getValueType(); $input_type = $this->getType(); if ($value_type == 'tags' || !$value_type && $input_type == 'tags') { $value = string_to_tag_array($value); } $access_id = $future_metadata['access_id'][$i]; $owner_guid = $future_metadata['owner_guid'][$i]; if (!is_array($value)) { if ($id) { update_metadata($id, $name, $value, '', $owner_guid, $access_id); } else { $id = create_metadata($entity->guid, $name, $value, '', $owner_guid, $access_id, true); } $ids[] = $id; } else { if ($id) { elgg_delete_metadata_by_id($id); } foreach ($value as $val) { $ids[] = create_metadata($entity->guid, $name, $val, '', $owner_guid, $access_id, true); } } } $params = array('field' => $this, 'entity' => $entity, 'metadata_name' => $shortname, 'value' => count($ids) ? elgg_get_metadata(array('metadata_ids' => $ids)) : array(), 'previous_value' => $current_metadata); elgg_trigger_plugin_hook('handle:metadata:after', 'prototyper', $params, true); return $entity; }
/** * Create a new metadata object, or update an existing one. * * Metadata can be an array by setting allow_multiple to true, but it is an * indexed array with no control over the indexing. * * @param int $entity_guid The entity to attach the metadata to * @param string $name Name of the metadata * @param string $value Value of the metadata * @param string $value_type 'text', 'integer', or '' for automatic detection * @param int $owner_guid GUID of entity that owns the metadata. Default is logged in user. * @param int $access_id Default is ACCESS_PRIVATE * @param bool $allow_multiple Allow multiple values for one key. Default is false * * @return int|false id of metadata or false if failure */ function create_metadata($entity_guid, $name, $value, $value_type = '', $owner_guid = 0, $access_id = ACCESS_PRIVATE, $allow_multiple = false) { global $CONFIG; $entity_guid = (int) $entity_guid; // name and value are encoded in add_metastring() //$name = sanitise_string(trim($name)); //$value = sanitise_string(trim($value)); $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type))); $time = time(); $owner_guid = (int) $owner_guid; $allow_multiple = (bool) $allow_multiple; if (!isset($value)) { return false; } if ($owner_guid == 0) { $owner_guid = elgg_get_logged_in_user_guid(); } $access_id = (int) $access_id; $query = "SELECT * from {$CONFIG->dbprefix}metadata" . " WHERE entity_guid = {$entity_guid} and name_id=" . elgg_get_metastring_id($name) . " limit 1"; $existing = get_data_row($query); if ($existing && !$allow_multiple) { $id = (int) $existing->id; $result = update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id); if (!$result) { return false; } } else { // Support boolean types if (is_bool($value)) { $value = (int) $value; } // Add the metastrings $value_id = elgg_get_metastring_id($value); if (!$value_id) { return false; } $name_id = elgg_get_metastring_id($name); if (!$name_id) { return false; } // If ok then add it $query = "INSERT into {$CONFIG->dbprefix}metadata" . " (entity_guid, name_id, value_id, value_type, owner_guid, time_created, access_id)" . " VALUES ({$entity_guid}, '{$name_id}','{$value_id}','{$value_type}', {$owner_guid}, {$time}, {$access_id})"; $id = insert_data($query); if ($id !== false) { $obj = elgg_get_metadata_from_id($id); if (elgg_trigger_event('create', 'metadata', $obj)) { _elgg_get_metadata_cache()->save($entity_guid, $name, $value, $allow_multiple); return $id; } else { elgg_delete_metadata_by_id($id); } } } return $id; }
/** * Update a specific piece of metadata. * * @param int $id ID of the metadata to update * @param string $name Metadata name * @param string $value Metadata value * @param string $value_type Value type * @param int $owner_guid Owner guid * @param int $access_id Access ID * * @return bool */ function update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id) { global $CONFIG; $id = (int) $id; if (!($md = elgg_get_metadata_from_id($id))) { return false; } if (!$md->canEdit()) { return false; } // If memcached then we invalidate the cache for this entry static $metabyname_memcache; if (!$metabyname_memcache && is_memcache_available()) { $metabyname_memcache = new ElggMemcache('metabyname_memcache'); } if ($metabyname_memcache) { $metabyname_memcache->delete("{$md->entity_guid}:{$md->name_id}"); } $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type))); $owner_guid = (int) $owner_guid; if ($owner_guid == 0) { $owner_guid = elgg_get_logged_in_user_guid(); } $access_id = (int) $access_id; $access = get_access_sql_suffix(); // Support boolean types (as integers) if (is_bool($value)) { if ($value) { $value = 1; } else { $value = 0; } } // Add the metastring $value = add_metastring($value); if (!$value) { return false; } $name = add_metastring($name); if (!$name) { return false; } // If ok then add it $query = "UPDATE {$CONFIG->dbprefix}metadata" . " set name_id='{$name}', value_id='{$value}', value_type='{$value_type}', access_id={$access_id}," . " owner_guid={$owner_guid} where id={$id}"; $result = update_data($query); if ($result !== false) { $obj = elgg_get_metadata_from_id($id); if (elgg_trigger_event('update', 'metadata', $obj)) { return true; } else { elgg_delete_metadata_by_id($id); } } return $result; }