Example #1
0
function perform_redirect()
{
    global $CONFIG;
    $username = get_loggedin_user()->username;
    $custom = get_plugin_setting("custom_redirect", "new_profile_redirector");
    if (!get_loggedin_user()->profile_updated && !empty($custom)) {
        $custom = str_replace("[wwwroot]", $CONFIG->wwwroot, $custom);
        $custom = str_replace("[username]", $username, $custom);
        get_loggedin_user()->profile_updated = 1;
        trigger_elgg_event('firstprofileupdate', 'user', $user);
        forward($custom);
    }
}
Example #2
0
/**
 * Update an annotation.
 *
 * @param int $annotation_id
 * @param string $name
 * @param string $value
 * @param string $value_type
 * @param int $owner_guid
 * @param int $access_id
 */
function update_annotation($annotation_id, $name, $value, $value_type, $owner_guid, $access_id)
{
    global $CONFIG;
    $annotation_id = (int) $annotation_id;
    $name = trim($name);
    $value = trim($value);
    $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type)));
    $owner_guid = (int) $owner_guid;
    if ($owner_guid == 0) {
        $owner_guid = get_loggedin_userid();
    }
    $access_id = (int) $access_id;
    $access = get_access_sql_suffix();
    // Add the metastring
    $value = add_metastring($value);
    if (!$value) {
        return false;
    }
    $name = add_metastring($name);
    if (!$name) {
        return false;
    }
    // If ok then add it
    $result = update_data("UPDATE {$CONFIG->dbprefix}annotations set value_id='{$value}', value_type='{$value_type}', access_id={$access_id}, owner_guid={$owner_guid} where id={$annotation_id} and name_id='{$name}' and {$access}");
    if ($result !== false) {
        $obj = get_annotation($annotation_id);
        if (trigger_elgg_event('update', 'annotation', $obj)) {
            return true;
        } else {
            delete_annotation($annotation_id);
        }
    }
    return $result;
}
/**
 * Upgrades Elgg
 *
 */
function version_upgrade()
{
    $dbversion = (int) datalist_get('version');
    // Upgrade database
    db_upgrade($dbversion);
    system_message(elgg_echo('upgrade:db'));
    // Upgrade core
    if (upgrade_code($dbversion)) {
        system_message(elgg_echo('upgrade:core'));
    }
    // Now we trigger an event to give the option for plugins to do something
    $upgrade_details = stdClass;
    $upgrade_details->from = $dbversion;
    $upgrade_details->to = get_version();
    trigger_elgg_event('upgrade', 'upgrade', $upgrade_details);
    // Update the version
    datalist_set('version', get_version());
}
Example #4
0
/**
 * Trigger an event requesting that a user guid be validated somehow - either by email address or some other way.
 *
 * This function invalidates any existing validation value.
 *
 * @param int $user_guid User's GUID
 * @deprecated 1.8 Hook into the register, user plugin hook and request validation.
 */
function request_user_validation($user_guid)
{
    elgg_deprecated_notice("request_user_validation() is deprecated.\n\t\tPlugins should register for the 'register, user' plugin hook", 1.8);
    $user = get_entity($user_guid);
    if ($user && $user instanceof ElggUser) {
        // invalidate any existing validations
        set_user_validation_status($user_guid, false);
        // request validation
        trigger_elgg_event('validate', 'user', $user);
    }
}
Example #5
0
/**
 * Delete a given annotation.
 * 
 * @param $id int The id
 */
function delete_annotation($id)
{
    global $CONFIG;
    $id = (int) $id;
    $access = get_access_sql_suffix();
    $annotation = get_annotation($id);
    if (trigger_elgg_event('delete', 'annotation', $annotation)) {
        return delete_data("DELETE from {$CONFIG->dbprefix}annotations  where id={$id} and {$access}");
    }
    return false;
}
/**
 * Trigger an event requesting that a user guid be validated somehow - either by email address or some other way.
 *
 * This event invalidates any existing values and returns
 * 
 * @param unknown_type $user_guid
 */
function request_user_validation($user_guid)
{
    $user = get_entity($user_guid);
    if ($user && $user instanceof ElggUser) {
        // invalidate any existing validations
        set_user_validation_status($user_guid, false);
        // request validation
        trigger_elgg_event('validate', 'user', $user);
    }
}
Example #7
0
    $lightmode = true;
}
// Load plugins, if we're not in light mode
if ($installed && $db_installed && $sanitised && !$lightmode) {
    load_plugins();
    trigger_elgg_event('plugins_boot', 'system');
}
// Forward if we haven't been installed
if ((!$installed || !$db_installed) && !substr_count($_SERVER["PHP_SELF"], "install.php") && !substr_count($_SERVER["PHP_SELF"], "css.php") && !substr_count($_SERVER["PHP_SELF"], "action_handler.php")) {
    header("Location: install.php");
    exit;
}
// Trigger events
if (!substr_count($_SERVER["PHP_SELF"], "install.php") && !substr_count($_SERVER["PHP_SELF"], "setup.php") && !$lightmode && !(defined('upgrading') && upgrading == 'upgrading')) {
    // If default settings haven't been installed, forward to the default settings page
    trigger_elgg_event('init', 'system');
    //if (!datalist_get('default_settings')) {
    //forward("setup.php");
    //}
}
// System booted, return to normal view
set_input('view', $oldview);
if (empty($oldview)) {
    if (empty($CONFIG->view)) {
        $oldview = 'default';
    } else {
        $oldview = $CONFIG->view;
    }
}
if ($installed && $db_installed) {
    $lastupdate = datalist_get('simplecache_lastupdate');
Example #8
0
/**
 * Log the current user out
 *
 * @return true|false
 */
function logout()
{
    global $CONFIG;
    if (isset($_SESSION['user'])) {
        if (!trigger_elgg_event('logout', 'user', $_SESSION['user'])) {
            return false;
        }
        $_SESSION['user']->code = "";
        $_SESSION['user']->save();
    }
    unset($_SESSION['username']);
    unset($_SESSION['name']);
    unset($_SESSION['code']);
    unset($_SESSION['guid']);
    unset($_SESSION['id']);
    unset($_SESSION['user']);
    setcookie("elggperm", "", time() - 86400 * 30, "/");
    // pass along any messages
    $old_msg = $_SESSION['msg'];
    session_destroy();
    // starting a default session to store any post-logout messages.
    session_init(NULL, NULL, NULL);
    $_SESSION['msg'] = $old_msg;
    return TRUE;
}
Example #9
0
/**
 * This function is a shutdown hook registered on startup which does nothing more than trigger a
 * shutdown event when the script is shutting down, but before database connections have been dropped etc.
 *
 */
function __elgg_shutdown_hook()
{
    global $START_MICROTIME;
    trigger_elgg_event('shutdown', 'system');
    $time = (double) (microtime(TRUE) - $START_MICROTIME);
    elgg_log("Page {$_SERVER['REQUEST_URI']} generated in {$time} seconds", 'DEBUG');
}
Example #10
0
/**
 * Delete an item of metadata, where the current user has access.
 *
 * @param $id int The item of metadata to delete.
 */
function delete_metadata($id)
{
    global $CONFIG;
    $id = (int) $id;
    $metadata = get_metadata($id);
    if ($metadata) {
        // Tidy up if memcache is enabled.
        static $metabyname_memcache;
        if (!$metabyname_memcache && is_memcache_available()) {
            $metabyname_memcache = new ElggMemcache('metabyname_memcache');
        }
        if ($metabyname_memcache) {
            $metabyname_memcache->delete("{$metadata->entity_guid}:{$metadata->name_id}");
        }
        if ($metadata->canEdit() && trigger_elgg_event('delete', 'metadata', $metadata)) {
            return delete_data("DELETE from {$CONFIG->dbprefix}metadata where id={$id}");
        }
    }
    return false;
}
if (count($not_uploaded) > 0) {
    if (count($uploaded_images) > 0) {
        $error = sprintf(elgg_echo("tidypics:partialuploadfailure"), count($not_uploaded), count($not_uploaded) + count($uploaded_images)) . '<br />';
    } else {
        $error = elgg_echo("tidypics:completeuploadfailure") . '<br />';
    }
    $num_failures = count($not_uploaded);
    for ($i = 0; $i < $num_failures; $i++) {
        $error .= "{$not_uploaded[$i]}: {$error_msgs[$i]} <br />";
    }
    register_error($error);
    if (count($uploaded_images) == 0) {
        forward(get_input('forward_url', $_SERVER['HTTP_REFERER']));
    } else {
        // some images did upload so we fall through
    }
} else {
    system_message(elgg_echo('tidypics:upl_success'));
}
if (count($uploaded_images) && $img_river_view == "1") {
    if (function_exists('add_to_river')) {
        add_to_river('river/object/image/create', 'create', $file_for_river->getObjectOwnerGUID(), $file_for_river->getGUID());
    }
}
// update image repo size
create_metadata($album->container_guid, "image_repo_size", $image_repo_size, 'integer', $album->container_guid);
// plugins can register to be told when a Tidypics album has had images added
trigger_elgg_event('upload', 'tp_album', $album);
//forward to multi-image edit page
$url = $CONFIG->wwwroot . 'mod/tidypics/pages/edit_multiple.php?files=' . implode('-', $uploaded_images);
forward($url);
Example #12
0
// get the images and save their file handlers into an array
// so we can do clean up if one fails.
$files = array();
foreach ($icon_sizes as $name => $size_info) {
    $resized = get_resized_image_from_uploaded_file('profileicon', $size_info['w'], $size_info['h'], $size_info['square']);
    if ($resized) {
        //@todo Make these actual entities.  See exts #348.
        $file = new ElggFile();
        $file->owner_guid = $profile_owner_guid;
        $file->setFilename("profile/{$profile_username}{$name}.jpg");
        $file->open('write');
        $file->write($resized);
        $file->close();
        $files[] = $file;
    } else {
        // cleanup on fail
        foreach ($files as $file) {
            $file->delete();
        }
        system_message(elgg_echo('profile:icon:notfound'));
        forward($_SERVER['HTTP_REFERER']);
    }
}
$profile_owner->icontime = time();
if (trigger_elgg_event('profileiconupdate', $profile_owner->type, $profile_owner)) {
    // pull this out into the river plugin.
    //add_to_river('river/user/default/profileiconupdate','update',$user->guid,$user->guid);
    system_message(elgg_echo("profile:icon:uploaded"));
}
//forward the user back to the upload page to crop
forward($_SERVER['HTTP_REFERER']);
/**
 * System log listener.
 * This function listens to all events in the system and logs anything appropriate.
 *
 * @param String $event
 * @param String $object_type
 * @param Loggable $object
 */
function system_log_listener($event, $object_type, $object)
{
    if ($object_type != 'systemlog' && $event != 'log') {
        trigger_elgg_event('log', 'systemlog', array('object' => $object, 'event' => $event));
    }
    return true;
}
Example #14
0
/**
 * Delete a given entity.
 * 
 * @param int $guid
 * @param bool $recursive If true (default) then all entities which are owned or contained by $guid will also be deleted.
 * 						   Note: this bypasses ownership of sub items.
 */
function delete_entity($guid, $recursive = true)
{
    global $CONFIG;
    $guid = (int) $guid;
    if ($entity = get_entity($guid)) {
        if (trigger_elgg_event('delete', $entity->type, $entity)) {
            if ($entity->canEdit()) {
                // Delete contained owned and otherwise releated objects (depth first)
                if ($recursive) {
                    // Temporary token overriding access controls TODO: Do this better.
                    static $__RECURSIVE_DELETE_TOKEN;
                    $__RECURSIVE_DELETE_TOKEN = md5(get_loggedin_userid());
                    // Make it slightly harder to guess
                    $sub_entities = get_data("SELECT * from {$CONFIG->dbprefix}entities WHERE container_guid={$guid} or owner_guid={$guid} or site_guid={$guid}", 'entity_row_to_elggstar');
                    if ($sub_entities) {
                        foreach ($sub_entities as $e) {
                            $e->delete();
                        }
                    }
                    $__RECURSIVE_DELETE_TOKEN = null;
                }
                // Now delete the entity itself
                $entity->clearMetadata();
                $entity->clearAnnotations();
                $entity->clearRelationships();
                remove_from_river_by_subject($guid);
                remove_from_river_by_object($guid);
                remove_all_private_settings($guid);
                $res = delete_data("DELETE from {$CONFIG->dbprefix}entities where guid={$guid}");
                if ($res) {
                    $sub_table = "";
                    // Where appropriate delete the sub table
                    switch ($entity->type) {
                        case 'object':
                            $sub_table = $CONFIG->dbprefix . 'objects_entity';
                            break;
                        case 'user':
                            $sub_table = $CONFIG->dbprefix . 'users_entity';
                            break;
                        case 'group':
                            $sub_table = $CONFIG->dbprefix . 'groups_entity';
                            break;
                        case 'site':
                            $sub_table = $CONFIG->dbprefix . 'sites_entity';
                            break;
                    }
                    if ($sub_table) {
                        delete_data("DELETE from {$sub_table} where guid={$guid}");
                    }
                }
                return $res;
            }
        }
    }
    return false;
}
/**
 * Remove a user from a group.
 *
 * @param int $group_guid The group.
 * @param int $user_guid The user.
 */
function leave_group($group_guid, $user_guid)
{
    // event needs to be triggered while user is still member of group to have access to group acl
    trigger_elgg_event('leave', 'group', array('group' => get_entity($group_guid), 'user' => get_entity($user_guid)));
    $result = remove_entity_relationship($user_guid, 'member', $group_guid);
    return $result;
}
/**
 * Remove an arbitrary relationship between two entities.
 *
 * @param int $guid_one
 * @param string $relationship
 * @param int $guid_two
 */
function remove_entity_relationship($guid_one, $relationship, $guid_two)
{
    global $CONFIG;
    $guid_one = (int) $guid_one;
    $relationship = sanitise_string($relationship);
    $guid_two = (int) $guid_two;
    $obj = check_entity_relationship($guid_one, $relationship, $guid_two);
    if ($obj == false) {
        return false;
    }
    if (trigger_elgg_event('delete', $relationship, $obj)) {
        return delete_data("DELETE from {$CONFIG->dbprefix}entity_relationships where guid_one={$guid_one} and relationship='{$relationship}' and guid_two={$guid_two}");
    } else {
        return false;
    }
}
Example #17
0
/**
 * Update an item of metadata.
 *
 * @param int $id
 * @param string $name
 * @param string $value
 * @param string $value_type
 * @param int $owner_guid
 * @param int $access_id
 */
function update_metadata($id, $name, $value, $value_type, $owner_guid, $access_id)
{
    global $CONFIG;
    $id = (int) $id;
    if (!($md = get_metadata($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}");
    }
    //$name = sanitise_string(trim($name));
    //$value = sanitise_string(trim($value));
    $value_type = detect_extender_valuetype($value, sanitise_string(trim($value_type)));
    $owner_guid = (int) $owner_guid;
    if ($owner_guid == 0) {
        $owner_guid = get_loggedin_userid();
    }
    $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
    $result = update_data("UPDATE {$CONFIG->dbprefix}metadata set value_id='{$value}', value_type='{$value_type}', access_id={$access_id}, owner_guid={$owner_guid} where id={$id} and name_id='{$name}'");
    if ($result !== false) {
        $obj = get_metadata($id);
        if (trigger_elgg_event('update', 'metadata', $obj)) {
            return true;
        } else {
            delete_metadata($id);
        }
    }
    return $result;
}
Example #18
0
function check_first_login($login_event, $user_type, $user)
{
    if ($user && $user->last_login == 0) {
        trigger_elgg_event('firstlogin', 'user', $user);
    }
}
Example #19
0
        $filehandler->open("write");
        $filehandler->write($small);
        $filehandler->close();
        $filehandler->setFilename("profile/" . $_SESSION['user']->username . "tiny.jpg");
        $filehandler->open("write");
        $filehandler->write($tiny);
        $filehandler->close();
        $filehandler->setFilename("profile/" . $_SESSION['user']->username . "topbar.jpg");
        $filehandler->open("write");
        $filehandler->write($topbar);
        $filehandler->close();
        $filehandler->setFilename("profile/" . $_SESSION['user']->username . "master.jpg");
        $filehandler->open("write");
        $filehandler->write($master);
        $filehandler->close();
        $_SESSION['user']->icontime = time();
        system_message(elgg_echo("profile:icon:uploaded"));
        trigger_elgg_event('profileiconupdate', $_SESSION['user']->type, $_SESSION['user']);
        //add to river
        add_to_river('river/user/default/profileiconupdate', 'update', $_SESSION['user']->guid, $_SESSION['user']->guid);
    } else {
        system_message(elgg_echo("profile:icon:notfound"));
    }
} else {
    system_message(elgg_echo("profile:icon:notfound"));
}
//forward the user back to the upload page to crop
$url = "mod/profile/editicon.php";
if (isloggedin()) {
    forward($url);
}
Example #20
0
    }
}
// go through custom fields
if (sizeof($input) > 0) {
    foreach ($input as $shortname => $value) {
        remove_metadata($profile_owner->guid, $shortname);
        if (isset($accesslevel[$shortname])) {
            $access_id = (int) $accesslevel[$shortname];
        } else {
            // this should never be executed since the access level should always be set
            $access_id = ACCESS_DEFAULT;
        }
        if (is_array($value)) {
            $i = 0;
            foreach ($value as $interval) {
                $i++;
                $multiple = $i > 1 ? TRUE : FALSE;
                create_metadata($profile_owner->guid, $shortname, $interval, 'text', $profile_owner->guid, $access_id, $multiple);
            }
        } else {
            create_metadata($profile_owner->getGUID(), $shortname, $value, 'text', $profile_owner->getGUID(), $access_id);
        }
    }
    $profile_owner->save();
    // Notify of profile update
    trigger_elgg_event('profileupdate', $user->type, $user);
    //add to river
    add_to_river('river/user/default/profileupdate', 'update', $_SESSION['user']->guid, $_SESSION['user']->guid, get_default_access($_SESSION['user']));
    system_message(elgg_echo("profile:saved"));
}
forward($profile_owner->getUrl());
Example #21
0
/**
 * Remove a user from a group.
 * 
 * @param int $group_guid The group.
 * @param int $user_guid The user.
 */
function leave_group($group_guid, $user_guid)
{
    trigger_elgg_event('leave', 'group', array('group' => get_entity($group_guid), 'user' => get_entity($user_guid)));
    return remove_entity_relationship($user_guid, 'member', $group_guid);
}
<?php

$email = get_input('email');
$user = get_user_by_email($email);
if (is_array($user)) {
    $user = $user[0];
}
if ($user) {
    if ($user->validated) {
        if (send_new_password_request($user->guid)) {
            system_message(elgg_echo('user:password:resetreq:success'));
        } else {
            register_error(elgg_echo('user:password:resetreq:fail'));
        }
    } else {
        if (!trigger_plugin_hook('unvalidated_requestnewpassword', 'user', array('entity' => $user))) {
            // if plugins have not registered an action, the default action is to
            // trigger the validation event again and assume that the validation
            // event will display an appropriate message
            trigger_elgg_event('validate', 'user', $user);
        }
    }
} else {
    register_error(sprintf(elgg_echo('user:email:notfound'), $email));
}
forward();
Example #23
0
/**
 * Create or update the extras table for a given object.
 * Call create_entity first.
 * 
 * @param int $guid The guid of the entity you're creating (as obtained by create_entity)
 * @param string $title The title of the object
 * @param string $description The object's description
 */
function create_object_entity($guid, $title, $description)
{
    global $CONFIG;
    $guid = (int) $guid;
    $title = sanitise_string($title);
    $description = sanitise_string($description);
    $row = get_entity_as_row($guid);
    if ($row) {
        // Core entities row exists and we have access to it
        if ($exists = get_data_row("SELECT guid from {$CONFIG->dbprefix}objects_entity where guid = {$guid}")) {
            $result = update_data("UPDATE {$CONFIG->dbprefix}objects_entity set title='{$title}', description='{$description}' where guid={$guid}");
            if ($result != false) {
                // Update succeeded, continue
                $entity = get_entity($guid);
                if (trigger_elgg_event('update', $entity->type, $entity)) {
                    return $guid;
                } else {
                    $entity->delete();
                }
            }
        } else {
            // Update failed, attempt an insert.
            $result = insert_data("INSERT into {$CONFIG->dbprefix}objects_entity (guid, title, description) values ({$guid}, '{$title}','{$description}')");
            if ($result !== false) {
                $entity = get_entity($guid);
                if (trigger_elgg_event('create', $entity->type, $entity)) {
                    return $guid;
                } else {
                    $entity->delete();
                    //delete_entity($guid);
                }
            }
        }
    }
    return false;
}
/**
 * Upgrades Elgg
 *
 */
function version_upgrade()
{
    $dbversion = (int) datalist_get('version');
    // No version number? Oh snap...this is an upgrade from a clean installation < 1.7.
    // Run all upgrades without error reporting and hope for the best.
    // See http://trac.elgg.org/elgg/ticket/1432 for more.
    $quiet = !$dbversion;
    // Upgrade database
    if (db_upgrade($dbversion, '', $quiet)) {
        system_message(elgg_echo('upgrade:db'));
    }
    // Upgrade core
    if (upgrade_code($dbversion, $quiet)) {
        system_message(elgg_echo('upgrade:core'));
    }
    // Now we trigger an event to give the option for plugins to do something
    $upgrade_details = new stdClass();
    $upgrade_details->from = $dbversion;
    $upgrade_details->to = get_version();
    trigger_elgg_event('upgrade', 'upgrade', $upgrade_details);
    // Update the version
    datalist_set('version', get_version());
}
Example #25
0
/**
 * This function is a shutdown hook registered on startup which does nothing more than trigger a 
 * shutdown event when the script is shutting down, but before database connections have been dropped etc.
 *
 */
function __elgg_shutdown_hook()
{
    global $CONFIG, $START_MICROTIME;
    trigger_elgg_event('shutdown', 'system');
    if ($CONFIG->debug) {
        error_log("Page {$_SERVER['REQUEST_URI']} generated in " . (double) (microtime(true) - $START_MICROTIME) . " seconds");
    }
}
Example #26
0
/**
 * Log the current user out
 *
 * @return true|false
 */
function logout()
{
    global $CONFIG;
    if (isset($_SESSION['user'])) {
        if (!trigger_elgg_event('logout', 'user', $_SESSION['user'])) {
            return false;
        }
        $_SESSION['user']->code = "";
        $_SESSION['user']->save();
    }
    unset($_SESSION['username']);
    unset($_SESSION['name']);
    unset($_SESSION['code']);
    unset($_SESSION['guid']);
    unset($_SESSION['id']);
    unset($_SESSION['user']);
    setcookie("elggperm", "", time() - 86400 * 30, "/");
    session_destroy();
    return true;
}
    $filehandler->close();
    $thumbtiny = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 25, 25, true);
    $thumbsmall = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 40, 40, true);
    $thumbmedium = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 100, 100, true);
    $thumblarge = get_resized_image_from_existing_file($filehandler->getFilenameOnFilestore(), 200, 200, false);
    if ($thumbtiny) {
        $thumb = new ElggFile();
        $thumb->setMimeType('image/jpeg');
        $thumb->setFilename($prefix . "tiny.jpg");
        $thumb->open("write");
        $thumb->write($thumbtiny);
        $thumb->close();
        $thumb->setFilename($prefix . "small.jpg");
        $thumb->open("write");
        $thumb->write($thumbsmall);
        $thumb->close();
        $thumb->setFilename($prefix . "medium.jpg");
        $thumb->open("write");
        $thumb->write($thumbmedium);
        $thumb->close();
        $thumb->setFilename($prefix . "large.jpg");
        $thumb->open("write");
        $thumb->write($thumblarge);
        $thumb->close();
    }
}
trigger_elgg_event('groupprofileupdate', 'group', $group);
system_message(elgg_echo("groups:saved"));
// Forward to the group's profile
forward($group->getUrl());
exit;