diff options
Diffstat (limited to 'mod/group_alias/start.php')
-rw-r--r-- | mod/group_alias/start.php | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/mod/group_alias/start.php b/mod/group_alias/start.php new file mode 100644 index 000000000..01d4bb080 --- /dev/null +++ b/mod/group_alias/start.php @@ -0,0 +1,188 @@ +<?php +/** + * Elgg Group Alias + * + * @package Lorea + * @subpackage GroupAlias + * @homepage http://lorea.org/plugin/group_alias + * @copyright 2011-2012 Lorea Faeries <federation@lorea.org> + * @license COPYING, http://www.gnu.org/licenses/agpl + * + * Copyright 2011-2013 Lorea Faeries <federation@lorea.org> + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/>. + */ + +elgg_register_event_handler('init', 'system', 'group_alias_init'); + +/** + * Initialize the group alias plugin. + * + */ +function group_alias_init() { + + // Register group alias library + $library_path = elgg_get_plugins_path() . 'group_alias/lib/group_alias.php'; + elgg_register_library('elgg:group_alias', $library_path); + + // Register a page handler, so we can have nice URLs + elgg_register_page_handler('g', 'group_alias_page_handler'); + + // Override URL handlers for groups + elgg_register_entity_url_handler('group', 'all', 'group_alias_url'); + + // Add alias field + elgg_register_plugin_hook_handler('profile:fields', 'group', 'group_alias_fields_setup'); + + // Override groups/edit action + $action_base = elgg_get_plugins_path() . 'group_alias/actions/groups'; + elgg_register_action("groups/edit", "$action_base/edit.php"); + + // Extend the main css view + elgg_extend_view('css/elgg', 'group_alias/css'); + elgg_extend_view('js/elgg', 'group_alias/js'); + + // Register tests + elgg_register_plugin_hook_handler('unit_test', 'system', 'group_alias_test'); + elgg_register_event_handler('upgrade', 'system', 'group_alias_run_upgrades'); + +} + +function group_alias_run_upgrades() { + $upgrade_tools = elgg_get_plugins_path() . 'upgrade-tools/lib/upgrade_tools.php'; + if (file_exists($upgrade_tools) && include_once($upgrade_tools)) { + upgrade_module_run('group_alias'); + } +} + + +function group_alias_test($hook, $type, $value, $params) { + $value[] = elgg_get_config('pluginspath') . "group_alias/tests/group_alias_test.php"; + return $value; +} + +function get_group_from_group_alias($alias){ + return current(elgg_get_entities_from_metadata(array( + 'type' => 'group', + 'metadata_name' => 'alias', + 'metadata_value' => $alias, + 'limit' => 1, + ))); +} + +/** + * Dispatcher for group alias. + * URLs take the form of + * All groups: g/ + * Group profile: g/<alias> + * Group Tools: g/<alias>/<handler> => <handler>/group/<guid> + * + * @param array $page + * @return bool + */ +function group_alias_page_handler($page) { + + elgg_set_context('groups'); + + if (!isset($page[0])) { + groups_page_handler(array('all'), 'groups'); + return true; + } + + $group = get_group_from_group_alias(str_replace(' ', '+', urldecode($page[0]))); + + if($group && !isset($page[1])){ + groups_page_handler(array('profile', $group->guid)); + + } elseif($group && isset($page[1])) { + forward("$page[1]/group/$group->guid"); + + } else { + return groups_page_handler($page); + } + + return true; +} + +function group_alias_fields_setup($hook, $type, $return, $params) { + return array_merge($return, array('alias' => 'group_alias')); +} + +function group_alias_from_name($group) { + + $alias = elgg_get_friendly_title($group->name); + $alias = preg_replace("/-/", "_", $alias); + $alias = urldecode($alias); + + return $alias; +} + +/** + * This is an event hook for create/update group to handle the alias + * without overriding the groups/edit action. + */ +function group_alias_save_hook($event, $type, $entity) { + + $alias_from_name = group_alias_from_name($entity); + $aliased_group = get_group_from_group_alias($alias_from_name); + + // If the alias is already taken by another group, append GUID. + if (elgg_instanceof($aliased_group, 'group') + && $aliased_group->guid != $entity->guid) { + $entity->set('alias', "$alias_from_name$entity->guid"); + return TRUE; + } + // Force keeping default or existing alias if empty or not changeable + if (empty($entity->alias) || !elgg_get_config('changeable_group_alias')) { + $entity->set('alias', $alias_from_name); + } + + return TRUE; +} + +/** + * Override the group url + * + * @param ElggObject $group Group object + * @return string + */ +function group_alias_url($group) { + if(!$group->alias){ + return groups_url($group); + } + return "g/$group->alias"; +} + +/** + * Convert a group name to an alias if it does not exist already. + * Return the newly, or existing group alias. + * + * @param ElggGroup $group Group object + * @return string + */ +function group_alias_update_from_name($group) { + if (!empty($group->alias)) { + return $group->alias; + } + $alias = group_alias_from_name($group); + // If alias is taken, append GUID + $g = get_group_from_group_alias($alias); + if (elgg_instanceof($g, 'group') && $g->guid != $group->guid) { + $alias .= $group->guid; + } + $group->set('alias', $alias); + + return $alias; +} |