aboutsummaryrefslogtreecommitdiff
path: root/mod/group_alias/start.php
diff options
context:
space:
mode:
Diffstat (limited to 'mod/group_alias/start.php')
-rw-r--r--mod/group_alias/start.php188
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;
+}