/**
  * {@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;
}
Example #3
0
/**
 * 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;
}