diff options
| author | Silvio Rhatto <rhatto@riseup.net> | 2014-03-16 21:01:42 -0300 | 
|---|---|---|
| committer | Silvio Rhatto <rhatto@riseup.net> | 2014-03-16 21:01:42 -0300 | 
| commit | 5f6dc365a8445a48156b45912827eac39fd64fc5 (patch) | |
| tree | 0dc3326151072bb5d97592513e1af4b40be32e07 | |
| download | elgg-5f6dc365a8445a48156b45912827eac39fd64fc5.tar.gz elgg-5f6dc365a8445a48156b45912827eac39fd64fc5.tar.bz2  | |
Squashed 'mod/subgroups/' content from commit 835015b
git-subtree-dir: mod/subgroups
git-subtree-split: 835015b66b9de6dc6de91ab39f95e1f09b2dbf84
29 files changed, 1908 insertions, 0 deletions
diff --git a/actions/subgroups/add.php b/actions/subgroups/add.php new file mode 100644 index 000000000..92416ea05 --- /dev/null +++ b/actions/subgroups/add.php @@ -0,0 +1,33 @@ +<?php + +elgg_load_library('elgg:subgroups'); + +$group_guid = get_input('group'); +$othergroup_guid = get_input('othergroup'); +$othergroup_url = get_input('othergroup_url'); // maybe it isn't used +$group = get_entity($group_guid); +$othergroup = get_entity($othergroup_guid); + +if(!$othergroup && $othergroup = subgroups_get_group_from_url($othergroup_url)){ +	$othergroup_guid = $othergroup->guid; +} + +if ($group instanceof ElggGroup && $group->canEdit() && $othergroup instanceof ElggGroup) { +	if ($othergroup->canEdit() && $group_guid != $othergroup_guid) { +		// Check if other group isn't currently a supergroup +		$tree_group = $group; +		while ($tree_group->container_guid > 0 && $tree_group->guid != $othergroup_guid) { +			$tree_group = get_entity($tree_group->container_guid); +		} +		// Only save if there isn't circles in the tree. +		if ($tree_group->guid != $othergroup_guid) { +			$othergroup->container_guid = $group_guid; +			$othergroup->save(); +			forward(REFERER); +		} +	} +} + +register_error(elgg_echo('subgroups:add:error')); +forward(REFERER); + diff --git a/actions/subgroups/remove.php b/actions/subgroups/remove.php new file mode 100644 index 000000000..206673de3 --- /dev/null +++ b/actions/subgroups/remove.php @@ -0,0 +1,13 @@ +<?php + +$group_guid = get_input('group'); +$othergroup_guid = get_input('othergroup'); +$group = get_entity($group_guid); +$othergroup = get_entity($othergroup_guid); +if ($group instanceof ElggGroup && $group->canEdit()) { +	if ($othergroup instanceof ElggGroup && $othergroup->canEdit() && $othergroup->container_guid == $group_guid) { +		$othergroup->container_guid = $other_group->owner_guid; +		$othergroup->save(); +	} +} +forward(REFERER); diff --git a/activate.php b/activate.php new file mode 100644 index 000000000..1e173fdd5 --- /dev/null +++ b/activate.php @@ -0,0 +1,16 @@ +<?php +/** + * Unsets container guids from all groups that aren't subgroups + */ + +$groups = elgg_get_entities(array( +	'type' => 'group', +	'limit' => 0, +)); + +foreach($groups as $group) { +	if (!elgg_instanceof($group->getContainerEntity(), 'group')) { +		$group->container_guid = 0; +		$group->save(); +	} +} diff --git a/deactivate.php b/deactivate.php new file mode 100644 index 000000000..9b0cd1189 --- /dev/null +++ b/deactivate.php @@ -0,0 +1,18 @@ +<?php +/** + * Resets container guids from all groups that aren't subgroups to owner guid + */ + +$groups = elgg_get_entities(array( +	'type' => 'group', +	'limit' => 0, +)); + +foreach($groups as $group) { +	global $CONFIG; +	if (!elgg_instanceof($group->getContainerEntity(), 'group')) { +		$query = "UPDATE {$CONFIG->dbprefix}entities set" +				. " container_guid=0 where guid={$group->owner_guid}"; +		update_data($query); +	} +} diff --git a/languages/ca.php b/languages/ca.php new file mode 100644 index 000000000..948b2ee95 --- /dev/null +++ b/languages/ca.php @@ -0,0 +1,22 @@ +<?php +$language = array ( +  'subgroups:new' => 'Nou subgrup', +  'subgroups:new:of' => 'Nou subgrup de «%s»', +  'subgroups:add:error' => 'Hi ha hagut un error. Has escrit bé el nom del grup?', +  'subgroups' => 'Subgrups', +  'subgroups:more' => 'Veure tots els subgrups', +  'subgroups:owner' => 'Subgrups de %s', +  'subgroups:owner:single' => 'Subgrup de %s', +  'subgroups:none' => 'Aquest grup no té subgrups.', +  'subgroups:group' => 'Subgrups del grup', +  'subgroups:in_frontpage' => 'Mostra els subgrups a la pàgina del grup', +  'subgroups:add' => 'Edita subgrups', +  'subgroups:add:label' => 'Escriu el nom del grup', +  'subgroups:addurl:label' => 'Copia l\'URL del grup aquí', +  'subgroups:add:button' => 'Afegeix com a subgrup', +  'subgroups:dontwork' => 'No funciona?', +  'subgroups:unlink' => 'Desvincula els grups', +  'add' => 'Afegeix', +  'subgroups:nopermissons' => 'No tens permissos per modificar el grup', +); +add_translation("ca", $language);
\ No newline at end of file diff --git a/languages/en.php b/languages/en.php new file mode 100755 index 000000000..e08e22e34 --- /dev/null +++ b/languages/en.php @@ -0,0 +1,30 @@ +<?php
 +/**
 + * Elgg subgroups plugin language pack
 + *
 + * @package ElggSubgroups
 + */
 +
 +$english = array(
 +	"subgroups" => 'Subgroups',
 +	"subgroups:more" => 'View all subgroups',
 +	"subgroups:owner" => 'Subgroups of %s',
 +	"subgroups:owner:single" => 'Subgroup of %s',
 +	"subgroups:none" => 'This group has no subgroups.',
 +	"subgroups:group" => 'Group subgroups',
 +	"subgroups:in_frontpage" => 'Show subgroups on group page',
 +	"subgroups:add" => 'Manage subgroups',
 +	"subgroups:new" => 'New subgroup',
 +	"subgroups:add_existing" => 'Add existing one',
 +	"subgroups:new:of" => 'New subgroup of «%s»',
 +	"subgroups:add:label" => "Write the group's name",
 +	"subgroups:addurl:label" => "Copy the group URL here",
 +	"subgroups:add:button" => 'Add as subgroup',
 +	"subgroups:dontwork" => "Doesn't it work?",
 +	"subgroups:unlink" => 'Unlink groups',
 +	"add" => "Add",
 +	"subgroups:nopermissons" => 'You have no permissons to modify that subgroups',
 +	"subgroups:add:error" => 'There are an error. Did you write correctly the group\'s name?',
 +);
 +
 +add_translation("en", $english);
 diff --git a/languages/es.php b/languages/es.php new file mode 100644 index 000000000..b86a97423 --- /dev/null +++ b/languages/es.php @@ -0,0 +1,22 @@ +<?php +$es = array ( +  'subgroups' => 'Subgrupos', +  'subgroups:more' => 'Ver todos los subgrupos', +  'subgroups:owner' => 'Subgrupos de %s', +  'subgroups:owner:single' => 'Subgrupo de %s', +  'subgroups:none' => 'Este grupo no tiene subgrupos.', +  'subgroups:group' => 'Subgrupos del grupo', +  'subgroups:in_frontpage' => 'Muestra los subgrupos en la página del grupo', +  'subgroups:add' => 'Subgrupos', +  'subgroups:add:label' => 'Escribe el nombre del grupo', +  'subgroups:addurl:label' => 'Copia la URL del grupo aquí', +  'subgroups:add:button' => 'Añade como subgrupo', +  'subgroups:dontwork' => 'No funciona?', +  'subgroups:unlink' => 'Desvincula grupos', +  'add' => 'Añade', +  'subgroups:nopermissons' => 'No tienes permisos para modificar el grupo', +  'subgroups:add:error' => 'Ha habido un error. Has escrito bien el nombre del grupo?', +); + +add_translation("es", $es); + diff --git a/languages/gl.php b/languages/gl.php new file mode 100644 index 000000000..3a91d9fc4 --- /dev/null +++ b/languages/gl.php @@ -0,0 +1,27 @@ +<?php +/** +* Elgg subgroups plugin language pack +* +* @package ElggSubgroups +*/ + +$galician = array( +	"subgroups" => 'Subgrupos', +	"subgroups:more" => 'Ver tódolos subgrupos', +	"subgroups:owner" => 'Subgrupos de %s', +	"subgroups:owner:single" => 'Subgrupo de %s', +	"subgroups:none" => 'Iste grupo non ten subgrupos.', +	"subgroups:group" => 'Subgrupos do grupo', +	"subgroups:in_frontpage" => 'Mostra os subgrupos na páxina do grupo', +	"subgroups:add" => 'Edita os subgrupos', +	"subgroups:add:label" => "Escribe o nome do grupo", +	"subgroups:addurl:label" => "Copia a URL do grupo eiquí", +	"subgroups:add:button" => 'Añade como subgrupo', +	"subgroups:dontwork" => "Non funciona?", +	"subgroups:unlink" => 'Desvincula grupos', +	"add" => "Engade", +	"subgroups:nopermissons" => 'Non tes permisos para modificar o grupo', +	"subgroups:add:error" => 'Houbo un erro. Escribiches ben o nome do grupo?', +); + +add_translation("gl", $galician); diff --git a/languages/pt.php b/languages/pt.php new file mode 100644 index 000000000..f116ed9de --- /dev/null +++ b/languages/pt.php @@ -0,0 +1,7 @@ +<?php +$pt = array ( +  'add' => 'Adicionar', +); + +add_translation("pt", $pt); + diff --git a/lib/groups.php b/lib/groups.php new file mode 100644 index 000000000..82bd6226d --- /dev/null +++ b/lib/groups.php @@ -0,0 +1,564 @@ +<?php +/** + * Groups function library + */ + +/** + * List all groups + */ +function groups_handle_all_page() { + +	// all groups doesn't get link to self +	elgg_pop_breadcrumb(); +	elgg_push_breadcrumb(elgg_echo('groups')); + +	if (elgg_get_plugin_setting('limited_groups', 'groups') != 'yes' || elgg_is_admin_logged_in()) { +		elgg_register_title_button(); +	} + +	$selected_tab = get_input('filter', 'newest'); + +	switch ($selected_tab) { +		case 'popular': +			$content = elgg_list_entities_from_relationship_count(array( +				'type' => 'group', +				'container_guid' => 0, +				'relationship' => 'member', +				'inverse_relationship' => false, +				'full_view' => false, +			)); +			if (!$content) { +				$content = elgg_echo('groups:none'); +			} +			break; +		case 'discussion': +			$content = elgg_list_entities(array( +				'type' => 'object', +				'subtype' => 'groupforumtopic', +				'order_by' => 'e.last_action desc', +				'limit' => 40, +				'full_view' => false, +			)); +			if (!$content) { +				$content = elgg_echo('discussion:none'); +			} +			break; +		case 'newest': +		default: +			$content = elgg_list_entities(array( +				'type' => 'group', +				'container_guid' => 0, +				'full_view' => false, +			)); +			if (!$content) { +				$content = elgg_echo('groups:none'); +			} +			break; +	} + +	$filter = elgg_view('groups/group_sort_menu', array('selected' => $selected_tab)); +	 +	$sidebar = elgg_view('groups/sidebar/find'); +	$sidebar .= elgg_view('groups/sidebar/featured'); + +	$params = array( +		'content' => $content, +		'sidebar' => $sidebar, +		'filter' => $filter, +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page(elgg_echo('groups:all'), $body); +} + +function groups_search_page() { +	elgg_push_breadcrumb(elgg_echo('search')); + +	$tag = get_input("tag"); +	$title = elgg_echo('groups:search:title', array($tag)); + +	// groups plugin saves tags as "interests" - see groups_fields_setup() in start.php +	$params = array( +		'metadata_name' => 'interests', +		'metadata_value' => $tag, +		'types' => 'group', +		'full_view' => FALSE, +	); +	$content = elgg_list_entities_from_metadata($params); +	if (!$content) { +		$content = elgg_echo('groups:search:none'); +	} + +	$sidebar = elgg_view('groups/sidebar/find'); +	$sidebar .= elgg_view('groups/sidebar/featured'); + +	$params = array( +		'content' => $content, +		'sidebar' => $sidebar, +		'filter' => false, +		'title' => $title, +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * List owned groups + */ +function groups_handle_owned_page() { + +	$page_owner = elgg_get_page_owner_entity(); + +	if ($page_owner->guid == elgg_get_logged_in_user_guid()) { +		$title = elgg_echo('groups:owned'); +	} else { +		$title = elgg_echo('groups:owned:user', array($page_owner->name)); +	} +	elgg_push_breadcrumb($title); + +	elgg_register_title_button(); + +	$content = elgg_list_entities(array( +		'type' => 'group', +		'owner_guid' => elgg_get_page_owner_guid(), +		'full_view' => false, +	)); +	if (!$content) { +		$content = elgg_echo('groups:none'); +	} + +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * List groups the user is memober of + */ +function groups_handle_mine_page() { + +	$page_owner = elgg_get_page_owner_entity(); + +	if ($page_owner->guid == elgg_get_logged_in_user_guid()) { +		$title = elgg_echo('groups:yours'); +	} else { +		$title = elgg_echo('groups:user', array($page_owner->name)); +	} +	elgg_push_breadcrumb($title); + +	elgg_register_title_button(); + +	$content = elgg_list_entities_from_relationship_count(array( +		'type' => 'group', +		'relationship' => 'member', +		'relationship_guid' => elgg_get_page_owner_guid(), +		'inverse_relationship' => false, +		'full_view' => false, +	)); +	if (!$content) { +		$content = elgg_echo('groups:none'); +	} + +	$filter = elgg_view('groups/group_sort_menu', array('selected' => $selected_tab)); + +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => $filter, +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Create or edit a group + * + * @param string $page + * @param int $guid + */ +function groups_handle_edit_page($page, $guid = 0) { +	gatekeeper(); +	 +	if ($page == 'add') { +		elgg_set_page_owner_guid(elgg_get_logged_in_user_guid()); +		$title = elgg_echo('groups:add'); +		elgg_push_breadcrumb($title); +		if (elgg_get_plugin_setting('limited_groups', 'groups') != 'yes' || elgg_is_admin_logged_in()) { +			$content = elgg_view('groups/edit'); +		} else { +			$content = elgg_echo('groups:cantcreate'); +		} +	} else { +		$title = elgg_echo("groups:edit"); +		$group = get_entity($guid); + +		if ($group && $group->canEdit()) { +			elgg_set_page_owner_guid($group->getGUID()); +			elgg_push_breadcrumb($group->name, $group->getURL()); +			elgg_push_breadcrumb($title); +			$content = elgg_view("groups/edit", array('entity' => $group)); +		} else { +			$content = elgg_echo('groups:noaccess'); +		} +	} +	 +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Group invitations for a user + */ +function groups_handle_invitations_page() { +	gatekeeper(); + +	$user = elgg_get_page_owner_entity(); + +	$title = elgg_echo('groups:invitations'); +	elgg_push_breadcrumb($title); + +	// @todo temporary workaround for exts #287. +	$invitations = groups_get_invited_groups(elgg_get_logged_in_user_guid()); +	$content = elgg_view('groups/invitationrequests', array('invitations' => $invitations)); + +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Group profile page + * + * @param int $guid Group entity GUID + */ +function groups_handle_profile_page($guid) { +	elgg_set_page_owner_guid($guid); + +	// turn this into a core function +	global $autofeed; +	$autofeed = true; + +	elgg_push_context('group_profile'); + +	$group = get_entity($guid); +	if (!$group) { +		forward('groups/all'); +	} +	elgg_push_breadcrumb($group->name); + +	groups_register_profile_buttons($group); + +	$content = elgg_view('groups/profile/layout', array('entity' => $group)); +	if (group_gatekeeper(false)) { +		$sidebar = ''; +		if (elgg_is_active_plugin('search')) { +			$sidebar .= elgg_view('groups/sidebar/search', array('entity' => $group)); +		} +		$sidebar .= elgg_view('groups/sidebar/members', array('entity' => $group)); +	} else { +		$sidebar = ''; +	} + +	$params = array( +		'content' => $content, +		'sidebar' => $sidebar, +		'title' => $group->name, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($group->name, $body); +} + +/** + * Group activity page + * + * @param int $guid Group entity GUID + */ +function groups_handle_activity_page($guid) { + +	elgg_set_page_owner_guid($guid); + +	$group = get_entity($guid); +	if (!$group || !elgg_instanceof($group, 'group')) { +		forward(); +	} + +	group_gatekeeper(); + +	$title = elgg_echo('groups:activity'); + +	elgg_push_breadcrumb($group->name, $group->getURL()); +	elgg_push_breadcrumb($title); + +	$db_prefix = elgg_get_config('dbprefix'); + +	$content = elgg_list_river(array( +		'joins' => array("JOIN {$db_prefix}entities e ON e.guid = rv.object_guid"), +		'wheres' => array("e.container_guid = $guid") +	)); +	if (!$content) { +		$content = '<p>' . elgg_echo('groups:activity:none') . '</p>'; +	} +	 +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Group members page + * + * @param int $guid Group entity GUID + */ +function groups_handle_members_page($guid) { + +	elgg_set_page_owner_guid($guid); + +	$group = get_entity($guid); +	if (!$group || !elgg_instanceof($group, 'group')) { +		forward(); +	} + +	group_gatekeeper(); + +	$title = elgg_echo('groups:members:title', array($group->name)); + +	elgg_push_breadcrumb($group->name, $group->getURL()); +	elgg_push_breadcrumb(elgg_echo('groups:members')); + +	$content = elgg_list_entities_from_relationship(array( +		'relationship' => 'member', +		'relationship_guid' => $group->guid, +		'inverse_relationship' => true, +		'types' => 'user', +		'limit' => 20, +	)); + +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Invite users to a group + * + * @param int $guid Group entity GUID + */ +function groups_handle_invite_page($guid) { +	gatekeeper(); + +	elgg_set_page_owner_guid($guid); + +	$group = get_entity($guid); + +	$title = elgg_echo('groups:invite:title'); + +	elgg_push_breadcrumb($group->name, $group->getURL()); +	elgg_push_breadcrumb(elgg_echo('groups:invite')); + +	if ($group && $group->canEdit()) { +		$content = elgg_view_form('groups/invite', array( +			'id' => 'invite_to_group', +			'class' => 'elgg-form-alt mtm', +		), array( +			'entity' => $group, +		)); +	} else { +		$content .= elgg_echo('groups:noaccess'); +	} + +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Manage requests to join a group + *  + * @param int $guid Group entity GUID + */ +function groups_handle_requests_page($guid) { + +	gatekeeper(); + +	elgg_set_page_owner_guid($guid); + +	$group = get_entity($guid); + +	$title = elgg_echo('groups:membershiprequests'); + +	if ($group && $group->canEdit()) { +		elgg_push_breadcrumb($group->name, $group->getURL()); +		elgg_push_breadcrumb($title); +		 +		$requests = elgg_get_entities_from_relationship(array( +			'type' => 'user', +			'relationship' => 'membership_request', +			'relationship_guid' => $guid, +			'inverse_relationship' => true, +			'limit' => 0, +		)); +		$content = elgg_view('groups/membershiprequests', array( +			'requests' => $requests, +			'entity' => $group, +		)); + +	} else { +		$content = elgg_echo("groups:noaccess"); +	} + +	$params = array( +		'content' => $content, +		'title' => $title, +		'filter' => '', +	); +	$body = elgg_view_layout('content', $params); + +	echo elgg_view_page($title, $body); +} + +/** + * Registers the buttons for title area of the group profile page + * + * @param ElggGroup $group + */ +function groups_register_profile_buttons($group) { + +	$actions = array(); + +	// group owners +	if ($group->canEdit()) { +		// edit and invite +		$url = elgg_get_site_url() . "groups/edit/{$group->getGUID()}"; +		$actions[$url] = 'groups:edit'; +		$url = elgg_get_site_url() . "groups/invite/{$group->getGUID()}"; +		$actions[$url] = 'groups:invite'; +	} + +	// group members +	if ($group->isMember(elgg_get_logged_in_user_entity())) { +		if ($group->getOwnerGUID() != elgg_get_logged_in_user_guid()) { +			// leave +			$url = elgg_get_site_url() . "action/groups/leave?group_guid={$group->getGUID()}"; +			$url = elgg_add_action_tokens_to_url($url); +			$actions[$url] = 'groups:leave'; +		} +	} elseif (elgg_is_logged_in()) { +		// join - admins can always join. +		$url = elgg_get_site_url() . "action/groups/join?group_guid={$group->getGUID()}"; +		$url = elgg_add_action_tokens_to_url($url); +		if ($group->isPublicMembership() || $group->canEdit()) { +			$actions[$url] = 'groups:join'; +		} else { +			// request membership +			$actions[$url] = 'groups:joinrequest'; +		} +	} + +	if ($actions) { +		foreach ($actions as $url => $text) { +			elgg_register_menu_item('title', array( +				'name' => $text, +				'href' => $url, +				'text' => elgg_echo($text), +				'link_class' => 'elgg-button elgg-button-action', +			)); +		} +	} +} + +/** + * Prepares variables for the group edit form view. + * + * @param mixed $group ElggGroup or null. If a group, uses values from the group. + * @return array + */ +function groups_prepare_form_vars($group = null) { +	$values = array( +		'name' => '', +		'membership' => ACCESS_PUBLIC, +		'vis' => ACCESS_PUBLIC, +		'guid' => null, +		'entity' => null +	); + +	// handle customizable profile fields +	$fields = elgg_get_config('group'); + +	if ($fields) { +		foreach ($fields as $name => $type) { +			$values[$name] = ''; +		} +	} + +	// handle tool options +	$tools = elgg_get_config('group_tool_options'); +	if ($tools) { +		foreach ($tools as $group_option) { +			$option_name = $group_option->name . "_enable"; +			$values[$option_name] = $group_option->default_on ? 'yes' : 'no'; +		} +	} + +	// get current group settings +	if ($group) { +		foreach (array_keys($values) as $field) { +			if (isset($group->$field)) { +				$values[$field] = $group->$field; +			} +		} + +		if ($group->access_id != ACCESS_PUBLIC && $group->access_id != ACCESS_LOGGED_IN) { +			// group only access - this is done to handle access not created when group is created +			$values['vis'] = ACCESS_PRIVATE; +		} + +		$values['entity'] = $group; +	} + +	// get any sticky form settings +	if (elgg_is_sticky_form('groups')) { +		$sticky_values = elgg_get_sticky_values('groups'); +		foreach ($sticky_values as $key => $value) { +			$values[$key] = $value; +		} +	} + +	elgg_clear_sticky_form('groups'); + +	return $values; +} diff --git a/lib/subgroups.php b/lib/subgroups.php new file mode 100644 index 000000000..ffa531e16 --- /dev/null +++ b/lib/subgroups.php @@ -0,0 +1,84 @@ +<?php +/** + * Subgroups helper functions + * + * @package ElggSubgroups + */ + + +/** + * Gives the list of the group subgroups + * + * @param ElggGroup $group + * @return array + */ +function get_subgroups($group, $options = array()){ +	if($group instanceof ElggGroup){ +		 +		$options['type'] = 'group'; +		$options['container_guid'] = $group->guid; +		return elgg_get_entities($options); +		 +	} else { +		return false; +	} +} + +function list_subgroups($group, $options = array()){ +	 +	if($group instanceof ElggGroup){ +		 +		$defaults = array( +			'full_view' => false, +			'pagination' => true, +		); +		$options = array_merge($defaults, $options); +		 +		$options['type'] = 'group'; +		$options['container_guid'] = $group->guid; +	 +		elgg_push_context('subgroups'); +		$list = elgg_list_entities($options); +		elgg_pop_context(); +		 +		return $list; +		 +	} else { +		return ""; +	} +} + +function subgroups_group_url_matches($url){ +	$url = parse_url($url); +	$pattern1 = "/groups\/profile\/(?P<group_guid>\d+)/"; +	$pattern2 = "/g\/(?P<group_alias>[^\/]+)/"; +	 +	$matches1 = array(); +	$matches2 = array(); +	 +	preg_match($pattern1, $url['path'], $matches1); +	preg_match($pattern2, $url['path'], $matches2); +	 +	if(!empty($matches1) || !empty($matches2)) { +		return array_merge($matches1, $matches2); +	} else { +		return false; +	} +} + +function subgroups_get_group_from_url($group_url){ +	$matches = subgroups_group_url_matches($group_url); +	$group_guid = $matches['group_guid']; +	$group_alias = $matches['group_alias']; +	 +	$group = get_entity($group_guid); +	if(!$group && elgg_is_active_plugin('group_alias')) { +		$group = get_group_from_group_alias($group_alias); +	} +	 +	if($group && $group->getURL() == $group_url){ +		return $group; +	} else { +		return false; +	} +} diff --git a/manifest.xml b/manifest.xml new file mode 100644 index 000000000..f4f249133 --- /dev/null +++ b/manifest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8"> +	<name>Subgroups</name> +	<author>Lorea</author> +	<version>1.1-beta2</version> +	<description>Group admins can create subgroups.</description> +	<website>https://lorea.cc/</website> +	<copyright>(C) Lorea 2011</copyright> +	<license>GNU Public License version 2</license> + +	<category>enhancement</category> + +	<requires> +		<type>elgg_release</type> +		<version>1.8</version> +	</requires> + +	<requires> +		<type>priority</type> +		<priority>after</priority> +		<plugin>groups</plugin> +	</requires> + +</plugin_manifest> diff --git a/pages/subgroups/edit.php b/pages/subgroups/edit.php new file mode 100644 index 000000000..f8b0921ef --- /dev/null +++ b/pages/subgroups/edit.php @@ -0,0 +1,46 @@ +<?php +/** + * Manage subgroups page + * + * @package ElggSubroups + */ + +elgg_load_library('elgg:subgroups'); + +$page_owner = elgg_get_page_owner_entity(); +elgg_set_context('groups'); + +if(!($page_owner instanceof ElggGroup) || !$page_owner->canEdit()){ +	forward($page_owner->getURL()); +} + +elgg_push_breadcrumb(elgg_echo('group'),'groups/all'); +elgg_push_breadcrumb($page_owner->name, $page_owner->getURL()); + +$title = elgg_echo('subgroups:add'); +elgg_push_breadcrumb($title); + +elgg_register_title_button('subgroups', 'new'); + +elgg_register_menu_item('title', array( +	'name' => 'add_existing', +	'href' => "#subgroups-add", +	'text' => elgg_echo("subgroups:add_existing"), +	'rel' => 'toggle', +	'link_class' => 'elgg-button elgg-button-action', +	'priority' => 200, +)); + +$form_vars = array('class' => 'hidden', 'id' => 'subgroups-add'); +$body_vars = array('group' => $page_owner); + +$content = elgg_view_form('subgroups/add', $form_vars, $body_vars); +$content .= list_subgroups($page_owner); + +$body = elgg_view_layout('content', array( +	'content' => $content, +	'title' => $title, +	'filter' => '' +)); + +echo elgg_view_page($title, $body); diff --git a/pages/subgroups/owner.php b/pages/subgroups/owner.php new file mode 100644 index 000000000..ae06d968d --- /dev/null +++ b/pages/subgroups/owner.php @@ -0,0 +1,38 @@ +<?php +/** + * List of group's subgroups + * + * @package ElggSubgroups + */ + +elgg_load_library('elgg:subgroups'); + +// access check for closed groups +group_gatekeeper(); + +$owner = elgg_get_page_owner_entity(); +if (!$owner) { +	forward('groups/all'); +} + +elgg_register_title_button(); + +$title = elgg_echo("subgroups:owner", array($owner->name)); + +elgg_push_breadcrumb(elgg_echo('groups'), "groups/all"); +elgg_push_breadcrumb($owner->name, $owner->getURL()); +elgg_push_breadcrumb(elgg_echo('relatedgroups')); + +// List +$content = list_subgroups($owner); +if (!$content) { +	$content = elgg_echo("subgroups:none"); +} + +$body = elgg_view_layout('content', array( +	'title' => $title, +	'content' => $content, +	'filter' => '', +)); + +echo elgg_view_page($title, $body); diff --git a/start.php b/start.php new file mode 100644 index 000000000..803567f18 --- /dev/null +++ b/start.php @@ -0,0 +1,211 @@ +<?php +/** + * Elgg subgroups plugin + * + * @package ElggSubgroups + *  + * TODO: + *       * ElggSubgroup class with getMetaContainerGUID() ? + *       * Subgroup graphs + *  + */ + +elgg_register_event_handler('init', 'system', 'subgroups_init'); + +/** + * Subgroups plugin initialization functions. + */ +function subgroups_init() { +	// register a library of helper functions +	elgg_register_library('elgg:subgroups', elgg_get_plugins_path() . 'subgroups/lib/subgroups.php'); +	// override groups library +	elgg_register_library('elgg:groups', elgg_get_plugins_path() . 'subgroups/lib/groups.php'); + +	// Register actions +	$actions_path = elgg_get_plugins_path() . 'subgroups/actions/subgroups'; +	elgg_register_action("subgroups/add", $actions_path."/add.php"); +	elgg_register_action("subgroups/remove", $actions_path."/remove.php"); + +	// Register page handler +	elgg_register_page_handler('subgroups', 'subgroups_page_handler'); +	 +	// Register pagesetup event handler	 +	elgg_register_event_handler('pagesetup', 'system', 'subgroups_setup_sidebar_menus'); +	 +	// Register unsetter container_guid handler +	elgg_register_event_handler('update', 'group', 'subgroups_unset_group_container'); +	 +	// Register an unrelate link to entity menu (max priority to run the last) +	elgg_register_plugin_hook_handler('register', 'menu:entity', 'subgroups_menu_setup', 9999); +	 +	// Extend group fields +	elgg_register_plugin_hook_handler('profile:fields', 'group', 'subgroups_add_container_field'); + +	// Access permissions +	elgg_register_plugin_hook_handler('access:collections:write', 'all', 'subgroups_read_acl_plugin_hook'); + +	// Extending views +	elgg_extend_view('groups/sidebar/members', 'groups/sidebar/subgroups', 300); +	//TODO elgg_extend_view('groups/forum_latest', 'subgroups/frontpage'); + +	// Extending CSS +	elgg_extend_view('css/elements/components', 'groups/css/elements/components'); + +	elgg_register_ajax_view('subgroups/groups_i_can_edit'); + +	// Add group tool +	add_group_tool_option('subgroups', elgg_echo('subgroups:in_frontpage'), false); +	elgg_extend_view('groups/tool_latest', 'subgroups/group_module'); +} + +/** + * Configure the groups sidebar menu. Triggered on page setup + * + */ +function subgroups_setup_sidebar_menus() { + +	elgg_unregister_menu_item('page', 'groups:member'); + +	// Get the page owner entity +	$page_owner = elgg_get_page_owner_entity(); + +	if (elgg_get_context() == 'group_profile' || elgg_get_context() == 'groups') { +		if ($page_owner instanceof ElggGroup) { +			if (elgg_is_logged_in() && $page_owner->canEdit() || elgg_is_admin_logged_in()) { +				$url = elgg_get_site_url() . "subgroups/edit/{$page_owner->getGUID()}"; +				elgg_register_menu_item('page', array( +					'name' => 'subgroups', +					'text' => elgg_echo('subgroups:add'), +					'href' => $url, +				)); +			} +		} +	} +} + +/** + * Dispatches subgroups pages. + * URLs take the form of + *   + *  Group view subgroups:      subgroups/owner/<group_guid> + *  Group manage subgroups:    subgroups/manage/<group_guid> + * + * @param array $page + * @return NULL + */ +function subgroups_page_handler($page){ +	$pages_path = elgg_get_plugins_path() . "subgroups/pages"; +	 +	switch($page[0]) { +		case 'add': +		case 'edit': +			elgg_set_page_owner_guid($page[1]); +			include($pages_path."/subgroups/edit.php"); +			break; +		case 'owner': +			elgg_set_page_owner_guid($page[1]); +			include($pages_path."/subgroups/owner.php"); +			break; +		case 'new': +			$group = new ElggGroup((int)$page[1]); +		 +			if (!$group->guid) { +				register_error(elgg_echo('error:default')); +				return false; +			} +		 +			elgg_load_library('elgg:groups'); +			$title = elgg_echo('subgroups:new:of', array($group->name)); +			 +			elgg_push_breadcrumb(elgg_echo('groups'), "groups/all"); +			elgg_push_breadcrumb($group->name, $group->getURL()); +			elgg_push_breadcrumb(elgg_echo('subgroups:new')); +			 +			set_input('container_guid', $group->guid); +			 +			$body = elgg_view_layout('content', array( +				'content' => elgg_view('groups/edit'), +				'title' => $title, +				'filter' => '', +			)); +			echo elgg_view_page($title, $body); +			 +			break; +		default: +			return false; +	} +	return true; +} + +function subgroups_menu_setup($hook, $type, $return, $params){ +	 +	$group = elgg_get_page_owner_entity(); +	$othergroup = $params['entity']; +	 +	if($group instanceof ElggGroup && $group->canEdit() && +					$othergroup instanceof ElggGroup && +									elgg_in_context('subgroups')){ +		 +		// Delete all previous links +		$return = array(); +		 +		$url = elgg_http_add_url_query_elements('action/subgroups/remove', array( +			'group' => $group->guid, +			'othergroup' => $othergroup->guid, +		)); + +		$options = array( +			'name' => 'delete', +			'href' => $url, +			'text' => "<span class=\"elgg-icon elgg-icon-delete\"></span>", +			'confirm' => elgg_echo('deleteconfirm'), +			'text_encode' => false, +		); +		$return[] = ElggMenuItem::factory($options); +	} +	return $return; +} + +/** + * Unset container guid when a group is created. Triggered on group save. + * Using SQL since event is triggered on save() function and we can't do + * call the function again. + * + */ +function subgroups_unset_group_container($event, $object_type, $entity) { +	global $CONFIG; +	if (!elgg_instanceof($entity->getContainerEntity(), 'group')) { +		$query = "UPDATE {$CONFIG->dbprefix}entities set" +			. " container_guid=0 where guid={$entity->guid}"; +		return !!(update_data($query)); +	} +	return true; +} + +function subgroups_add_container_field($hook, $type, $return, $params) { +	$return['container_guid'] = 'hidden'; +	return $return; +} + +/** + * Hook to listen to read access control requests and return parent groups. + */ +function subgroups_read_acl_plugin_hook($hook, $entity_type, $returnvalue, $params) { +	$page_owner = elgg_get_page_owner_entity(); +	$user_guid = $params['user_id']; +	$user = get_entity($user_guid); +	if (!$user) { +		return $returnvalue; +	} + +	// only insert group access for current group +	if ($page_owner instanceof ElggGroup) { +		$parent_group = $page_owner->getContainerEntity(); +		while ($parent_group) { +			$returnvalue[$parent_group->group_acl] = elgg_echo('groups:group') . ': ' . $parent_group->name; +			$parent_group = $parent_group->getContainerEntity(); +		} +	} + +	return $returnvalue; +} diff --git a/views/default/forms/groups/edit.php b/views/default/forms/groups/edit.php new file mode 100644 index 000000000..e2f9fb394 --- /dev/null +++ b/views/default/forms/groups/edit.php @@ -0,0 +1,142 @@ +<?php +/** + * Group edit form + *  + * @package ElggGroups + */ + +// only extract these elements. +$name = $membership = $vis = $entity = null; +extract($vars, EXTR_IF_EXISTS); + +?> +<div> +	<label><?php echo elgg_echo("groups:icon"); ?></label><br /> +	<?php echo elgg_view("input/file", array('name' => 'icon')); ?> +</div> +<div> +	<label><?php echo elgg_echo("groups:name"); ?></label><br /> +	<?php echo elgg_view("input/text", array( +		'name' => 'name', +		'value' => $name +	)); +	?> +</div> +<?php + +$group_profile_fields = elgg_get_config('group'); +unset($group_profile_fields['container_guid']); + +if ($group_profile_fields > 0) { +	foreach ($group_profile_fields as $shortname => $valtype) { +		$line_break = '<br />'; +		if ($valtype == 'longtext') { +			$line_break = ''; +		} +		echo '<div><label>'; +		echo elgg_echo("groups:{$shortname}"); +		echo "</label>$line_break"; +		echo elgg_view("input/{$valtype}", array( +			'name' => $shortname, +			'value' => elgg_extract($shortname, $vars) +		)); +		echo '</div>'; +	} +} +?> + +<div> +	<label> +		<?php echo elgg_echo('groups:membership'); ?><br /> +		<?php echo elgg_view('input/dropdown', array( +			'name' => 'membership', +			'value' => $membership, +			'options_values' => array( +				ACCESS_PRIVATE => elgg_echo('groups:access:private'), +				ACCESS_PUBLIC => elgg_echo('groups:access:public') +			) +		)); +		?> +	</label> +</div> +	 +<?php + +if (elgg_get_plugin_setting('hidden_groups', 'groups') == 'yes') { +	$access_options = array( +		ACCESS_PRIVATE => elgg_echo('groups:access:group'), +		ACCESS_LOGGED_IN => elgg_echo("LOGGED_IN"), +		ACCESS_PUBLIC => elgg_echo("PUBLIC") +	); +?> + +<div> +	<label> +			<?php echo elgg_echo('groups:visibility'); ?><br /> +			<?php echo elgg_view('input/access', array( +				'name' => 'vis', +				'value' =>  $vis, +				'options_values' => $access_options, +			)); +			?> +	</label> +</div> + +<?php 	 +} + +$tools = elgg_get_config('group_tool_options'); +if ($tools) { +	usort($tools, create_function('$a,$b', 'return strcmp($a->label,$b->label);')); +	foreach ($tools as $group_option) { +		$group_option_toggle_name = $group_option->name . "_enable"; +		$value = elgg_extract($group_option_toggle_name, $vars); +?>	 +<div> +	<label> +		<?php echo $group_option->label; ?><br /> +	</label> +		<?php echo elgg_view("input/radio", array( +			"name" => $group_option_toggle_name, +			"value" => $value, +			'options' => array( +				elgg_echo('groups:yes') => 'yes', +				elgg_echo('groups:no') => 'no', +			), +		)); +		?> +</div> +<?php +	} +} +?> +<div class="elgg-foot"> +<?php + +if (isset($entity)) { +	echo elgg_view('input/hidden', array( +		'name' => 'group_guid', +		'value' => $entity->getGUID(), +	)); +} + +echo elgg_view('input/hidden', array( +	'name' => 'container_guid', +	'value' => isset($vars['entity']) ? +					$entity->getContainerGUID() : +					get_input('container_guid'), +)); + +echo elgg_view('input/submit', array('value' => elgg_echo('save'))); + +if (isset($entity)) { +	$delete_url = 'action/groups/delete?guid=' . $entity->getGUID(); +	echo elgg_view('output/confirmlink', array( +		'text' => elgg_echo('groups:delete'), +		'href' => $delete_url, +		'confirm' => elgg_echo('groups:deletewarning'), +		'class' => 'elgg-button elgg-button-delete float-alt', +	)); +} +?> +</div> diff --git a/views/default/forms/subgroups/add.php b/views/default/forms/subgroups/add.php new file mode 100644 index 000000000..f0349a728 --- /dev/null +++ b/views/default/forms/subgroups/add.php @@ -0,0 +1,37 @@ +<label class="subgroups-add-autocomplete" style="display:none"> +<?php +	echo elgg_echo('subgroups:add:label'); echo '<br />'; +	echo elgg_view('input/autocomplete', array( +		'name' => 'othergroup', +		'livesearch_url' => elgg_get_site_url().'ajax/view/subgroups/groups_i_can_edit', +		'class' => 'mvm', +	)); +?> +</label> +<label class="subgroups-add-url"> +<?php +	echo elgg_echo('subgroups:addurl:label'); echo '<br />'; +	echo elgg_view('input/url', array('name' => 'othergroup_url', 'class' => 'mvm')); +?> +</label> +<?php +	echo elgg_view('input/hidden', array( +		'name' => 'group', +		'value' => $vars['group']->guid)); +	echo elgg_view('input/submit', array( +		'value' => elgg_echo('subgroups:add:button'))); +?> +<a href="" class="subgroups-dontwork-link mlm" style="display:none">(<?php echo elgg_echo('subgroups:dontwork'); ?>)</a> + +<script type="text/javascript"> +$(function(){ +	$('.subgroups-add-autocomplete').show(); +	$('.subgroups-add-url').hide(); +	$('.subgroups-dontwork-link').show().click(function(){ +		$('.subgroups-add-autocomplete').hide(); +		$('.subgroups-add-url').show(); +		$(this).hide(); +		return false; +	}); +}); +</script> diff --git a/views/default/group/default.php b/views/default/group/default.php new file mode 100644 index 000000000..9c0356550 --- /dev/null +++ b/views/default/group/default.php @@ -0,0 +1,39 @@ +<?php  +/** + * Group entity view + *  + * @package ElggGroups + */ + +$group = $vars['entity']; + +$icon = elgg_view_entity_icon($group, 'tiny'); + +$metadata = elgg_view_menu('entity', array( +	'entity' => $group, +	'handler' => 'groups', +	'sort_by' => 'priority', +	'class' => 'elgg-menu-hz', +)); + +if (elgg_in_context('owner_block') || elgg_in_context('widgets')) { +	$metadata = ''; +} + +if (elgg_get_context() == 'gallery') { +	echo $icon; +} elseif ($vars['full_view']) { +	echo elgg_view("groups/profile/profile_block", $vars); +} else { +	// brief view + +	$params = array( +		'entity' => $group, +		'metadata' => $metadata, +		'subtitle' => $group->briefdescription, +	); +	$params = $params + $vars; +	$list_body = elgg_view('group/elements/summary', $params); + +	echo elgg_view_image_block($icon, $list_body, $vars); +} diff --git a/views/default/group/elements/summary.php b/views/default/group/elements/summary.php new file mode 100644 index 000000000..a95d1e296 --- /dev/null +++ b/views/default/group/elements/summary.php @@ -0,0 +1,67 @@ +<?php +/** + * Group summary + * + * @uses $vars['entity']    ElggEntity + * @uses $vars['title']     Title link (optional) false = no title, '' = default + * @uses $vars['metadata']  HTML for entity menu and metadata (optional) + * @uses $vars['subtitle']  HTML for the subtitle (optional) + * @uses $vars['tags']      HTML for the tags (optional) + * @uses $vars['content']   HTML for the entity content (optional) + */ + +$entity = $vars['entity']; + +$title_link = elgg_extract('title', $vars, ''); +if ($title_link === '') { +	if (isset($entity->title)) { +		$text = $entity->title; +	} else { +		$text = $entity->name; +	} +	$params = array( +		'text' => $text, +		'href' => $entity->getURL(), +		'is_trusted' => true, +	); +	$title_link = elgg_view('output/url', $params); +} + +$metadata = elgg_extract('metadata', $vars, ''); +$subtitle = elgg_extract('subtitle', $vars, ''); +$content = elgg_extract('content', $vars, ''); + +$container = get_entity($entity->container_guid); + +$tags = elgg_extract('tags', $vars, ''); +if ($tags !== false) { +	$tags = elgg_view('output/tags', array('tags' => $entity->tags)); +} + +if ($metadata) { +	echo $metadata; +} +if ($title_link) { +	echo "<h3>$title_link</h3>"; +} +if(elgg_instanceof($container, 'group')) { +	$container_link = elgg_view('output/url', array( +		'text' => $container->name, +		'href' => $container->getURL(), +		'is_trusted' => true, +	)); +	$container_link = elgg_echo('subgroups:owner:single', array($container_link)); +	echo "<div class=\"elgg-subtext\">$container_link</div>"; +} +echo "<div class=\"elgg-subtext\">$subtitle</div>"; + +$subgroups = elgg_view('subgroups/subgroups_icons', array('entity' => $entity)); +echo "<div class=\"subgroups-icons\">$subgroups</div>"; + +echo $tags; + +echo elgg_view('object/summary/extend', $vars); + +if ($content) { +	echo "<div class=\"elgg-content\">$content</div>"; +} diff --git a/views/default/groups/css/elements/components.php b/views/default/groups/css/elements/components.php new file mode 100644 index 000000000..0198fa309 --- /dev/null +++ b/views/default/groups/css/elements/components.php @@ -0,0 +1,6 @@ +/* *************************************** +	Gallery +*************************************** */ +.elgg-gallery-groups > li { +	margin: 0 2px; +} diff --git a/views/default/groups/group_sort_menu.php b/views/default/groups/group_sort_menu.php new file mode 100644 index 000000000..7e4d1bca6 --- /dev/null +++ b/views/default/groups/group_sort_menu.php @@ -0,0 +1,46 @@ +<?php +/** + * All groups listing page navigation + * + * @uses $vars['selected'] Name of the tab that has been selected + */ + +$tabs = array( +	'newest' => array( +		'text' => elgg_echo('groups:newest'), +		'href' => 'groups/all?filter=newest', +		'priority' => 200, +	), + +	'popular' => array( +		'text' => elgg_echo('groups:popular'), +		'href' => 'groups/all?filter=popular', +		'priority' => 400, +	), +	 +	'discussion' => array( +		'text' => elgg_echo('groups:latestdiscussion'), +		'href' => 'groups/all?filter=discussion', +		'priority' => 500, +	), +); + +if ($user = elgg_get_logged_in_user_entity()) { +	$tabs['member'] = array( +		'text' => elgg_echo('groups:yours'), +		'href' => "groups/member/$user->username", +		'priority' => 300, +	); +} + +foreach ($tabs as $name => $tab) { +	$tab['name'] = $name; + +	if ($vars['selected'] == $name) { +		$tab['selected'] = true; +	} + +	elgg_register_menu_item('filter', $tab); +} + +echo elgg_view_menu('filter', array('sort_by' => 'priority', 'class' => 'elgg-menu-hz')); diff --git a/views/default/groups/profile/fields.php b/views/default/groups/profile/fields.php new file mode 100644 index 000000000..41b0de9a0 --- /dev/null +++ b/views/default/groups/profile/fields.php @@ -0,0 +1,41 @@ +<?php +/** + * Group profile fields + */ + +$group = $vars['entity']; + +$profile_fields = elgg_get_config('group'); + +if (is_array($profile_fields) && count($profile_fields) > 0) { + +	$even_odd = 'odd'; +	foreach ($profile_fields as $key => $valtype) { +		// do not show the name or hidden values +		if ($key == 'name' || $valtype == 'hidden') { +			continue; +		} + +		$value = $group->$key; +		if (empty($value)) { +			continue; +		} + +		$options = array('value' => $group->$key); +		if ($valtype == 'tags') { +			$options['tag_names'] = $key; +		} + +		if ($output = elgg_view("output/$valtype", $options)) { + +			echo "<div class=\"{$even_odd}\">"; +			echo "<b>"; +			echo elgg_echo("groups:$key"); +			echo ": </b>"; +			echo $output; +			echo "</div>"; + +			$even_odd = ($even_odd == 'even') ? 'odd' : 'even'; +		} +	} +} diff --git a/views/default/groups/sidebar/subgroups.php b/views/default/groups/sidebar/subgroups.php new file mode 100644 index 000000000..35ffbaef9 --- /dev/null +++ b/views/default/groups/sidebar/subgroups.php @@ -0,0 +1,44 @@ +<?php +/** + * Subgroups sidebar + * + * @package ElggSubgroups + * + * @uses $vars['entity'] Group entity + * @uses $vars['limit']  The number of subgroups to display + */ + +$owner = elgg_get_page_owner_entity(); + +if(!elgg_instanceof($owner, 'group')) { +	return false; +} + +$limit = elgg_extract('limit', $vars, 10); + +$all_link = elgg_view('output/url', array( +	'href' => 'subgroups/owner/' . $owner->guid, +	'text' => elgg_echo('subgroups:more'), +	'is_trusted' => true, +)); + +$params = array( +	'type' => 'group', +	'container_guid' => $owner->guid, +	'limit' => $limit, +	'types' => 'group', +	'list_type' => 'gallery', +	'gallery_class' => 'elgg-gallery-groups', +	'full_view' => false +); + +$params['count'] = true; +if(elgg_get_entities($params) == 0) { +	return true; +} +$params['count'] = false; + +$body = elgg_list_entities($params); +$body .= "<div class='center mts'>$all_link</div>"; + +echo elgg_view_module('aside', elgg_echo('subgroups'), $body); diff --git a/views/default/icon/default.php b/views/default/icon/default.php new file mode 100644 index 000000000..3ef1a05a1 --- /dev/null +++ b/views/default/icon/default.php @@ -0,0 +1,58 @@ +<?php +/** + * Generic icon view. + * + * @package Elgg + * @subpackage Core + * + * @uses $vars['entity']     The entity the icon represents - uses getIconURL() method + * @uses $vars['size']       topbar, tiny, small, medium (default), large, master + * @uses $vars['href']       Optional override for link + * @uses $vars['img_class']  Optional CSS class added to img + * @uses $vars['link_class'] Optional CSS class for the link + */ + +$entity = $vars['entity']; + +$sizes = array('small', 'medium', 'large', 'tiny', 'master', 'topbar'); +// Get size +if (!in_array($vars['size'], $sizes)) { +	$vars['size'] = "medium"; +} + +$class = elgg_extract('img_class', $vars, ''); + +if (isset($entity->name)) { +	$title = $entity->name; +} else { +	$title = $entity->title; +} +$title = htmlspecialchars($title, ENT_QUOTES, 'UTF-8', false); + +$url = $entity->getURL(); +if (isset($vars['href'])) { +	$url = $vars['href']; +} + +$img = elgg_view('output/img', array( +	'src' => $entity->getIconURL($vars['size']), +	'alt' => $title, +	'class' => $class, +)); + +if ($url) { +	$params = array( +		'href' => $url, +		'text' => $img, +		'title' => $title, +		'is_trusted' => true, +	); +	$class = elgg_extract('link_class', $vars, ''); +	if ($class) { +		$params['class'] = $class; +	} + +	echo elgg_view('output/url', $params); +} else { +	echo $img; +} diff --git a/views/default/input/autocomplete.php b/views/default/input/autocomplete.php new file mode 100644 index 000000000..4eedac22a --- /dev/null +++ b/views/default/input/autocomplete.php @@ -0,0 +1,57 @@ +<?php +/** + * Displays an autocomplete text input. + * + * @package Elgg + * @subpackage Core + * + * @todo This currently only works for ONE AUTOCOMPLETE TEXT FIELD on a page. + * + * @uses $vars['value']       Current value for the text input + * @uses $vars['match_on']    Array | str What to match on. all|array(groups|users|friends) + * @uses $vars['match_owner'] Bool.  Match only entities that are owned by logged in user. + * @uses $vars['livesearsh_url'] Alternative livesearch URL + * @uses $vars['class']       Additional CSS class + */ + +if (isset($vars['class'])) { +	$vars['class'] = "elgg-input-autocomplete {$vars['class']}"; +} else { +	$vars['class'] = "elgg-input-autocomplete"; +} + +if (isset($vars['livesearch_url'])) { +	$livesearch_url = $vars['livesearch_url']; +	unset($vars['livesearch_url']); +} else { +	$livesearch_url = elgg_get_site_url() . 'livesearch'; +} + +$defaults = array( +	'value' => '', +	'disabled' => false, +); + +$vars = array_merge($defaults, $vars); + +$params = array(); +if (isset($vars['match_on'])) { +	$params['match_on'] = $vars['match_on']; +	unset($vars['match_on']); +} +if (isset($vars['match_owner'])) { +	$params['match_owner'] = $vars['match_owner']; +	unset($vars['match_owner']); +} +$ac_url_params = http_build_query($params); + +elgg_load_js('elgg.autocomplete'); +elgg_load_js('jquery.ui.autocomplete.html'); + +?> + +<script type="text/javascript"> +elgg.provide('elgg.autocomplete'); +elgg.autocomplete.url = "<?php echo $livesearch_url . '?' . $ac_url_params; ?>"; +</script>  +<input type="text" <?php echo elgg_format_attributes($vars); ?> /> diff --git a/views/default/navigation/breadcrumbs.php b/views/default/navigation/breadcrumbs.php new file mode 100644 index 000000000..6ceb5eacc --- /dev/null +++ b/views/default/navigation/breadcrumbs.php @@ -0,0 +1,83 @@ +<?php +/** + * Displays breadcrumbs. + * + * @package Elgg + * @subpackage Core + * + * @uses $vars['breadcrumbs'] (Optional) Array of arrays with keys 'title' and 'link' + * @uses $vars['class'] + * + * @see elgg_push_breadcrumb + */ + +if (isset($vars['breadcrumbs'])) { +	$breadcrumbs = $vars['breadcrumbs']; +} else { +	$breadcrumbs = elgg_get_breadcrumbs(); +} + + +$page_owner = elgg_get_page_owner_entity(); + +if(elgg_instanceof($page_owner, 'group')) { +	 +	// $breadcrumbs[1] should corresponds to group's breadcrumb +	// we'll look for it in crumbs link +	 +	$link = $breadcrumbs[1]['link']; +	$guid = (string) $page_owner->guid; +	$alias = $page_owner->alias; + +	$title = $breadcrumbs[1]['title']; +	$name = $page_owner->name; + +	if(strpos($link, $guid) || $alias && strpos($link, $alias) || !$link && $title == $name) { +		$first_crumb = array_shift($breadcrumbs); +		$container = get_entity($page_owner->container_guid); +		while(elgg_instanceof($container, 'group')) { +			 +			// TODO: I should find a better solution for this. +			if(strpos($first_crumb['link'], 'groups') !== false) { +				$container_link = str_replace('all', "profile/$container->guid", $first_crumb['link']); +			} elseif(strpos($first_crumb['link'], 'discussion') !== false) { +				$container_link = str_replace('all', "owner/$container->guid", $first_crumb['link']); +			} else { +				$container_link = str_replace('all', "group/$container->guid", $first_crumb['link']); +			} +			 +			$container_link = elgg_trigger_plugin_hook('container_crumb_link', 'breadcrumbs', array('container' => $container, 'first_crumb' => $first_crumb), $container_link); +			 +			array_unshift($breadcrumbs, array( +				'title' => $container->name, +				'link' => $container_link, +			)); +			$container = get_entity($container->container_guid); +		} +		array_unshift($breadcrumbs, $first_crumb); +	} +} + + +$class = 'elgg-menu elgg-breadcrumbs'; +$additional_class = elgg_extract('class', $vars, ''); +if ($additional_class) { +	$class = "$class $additional_class"; +} + +if (is_array($breadcrumbs) && count($breadcrumbs) > 0) { +	echo "<ul class=\"$class\">"; +	foreach ($breadcrumbs as $breadcrumb) { +		if (!empty($breadcrumb['link'])) { +			$crumb = elgg_view('output/url', array( +				'href' => $breadcrumb['link'], +				'text' => $breadcrumb['title'], +				'is_trusted' => true, +			)); +		} else { +			$crumb = $breadcrumb['title']; +		} +		echo "<li>$crumb</li>"; +	} +	echo '</ul>'; +} diff --git a/views/default/subgroups/group_module.php b/views/default/subgroups/group_module.php new file mode 100644 index 000000000..083e50b16 --- /dev/null +++ b/views/default/subgroups/group_module.php @@ -0,0 +1,51 @@ +<?php +/** + * List subgroups on group profile page + * + * @package ElggSubgroups + */ + +$group = elgg_get_page_owner_entity(); + +if ($group->subgroups_enable != "yes") { +	return true; +} + +$all_link = elgg_view('output/url', array( +	'href' => "subgroups/owner/$group->guid/all", +	'text' => elgg_echo('link:view:all'), +	'is_trusted' => true, +)); + +$options = array( +	'type' => 'group', +	'container_guid' => $group->guid, +	'type' => 'group', +	'limit' => 6, +	'full_view' => false, +	'pagination' => false, +); + +elgg_push_context('widgets'); +$content = elgg_list_entities($options); +elgg_pop_context(); + +if (!$content) { +	$content = '<p>' . elgg_echo('subgroups:none') . '</p>'; +} +if($group->canEdit()) { +	$new_link = elgg_view('output/url', array( +		'href' => "subgroups/add/$group->guid", +		'text' => elgg_echo('subgroups:add'), +		'is_trusted' => true, +	)); +} else { +	$new_link = false; +} + +echo elgg_view('groups/profile/module', array( +	'title' => elgg_echo('subgroups:group'), +	'content' => $content, +	'all_link' => $all_link, +	'add_link' => $new_link, +)); diff --git a/views/default/subgroups/groups_i_can_edit.php b/views/default/subgroups/groups_i_can_edit.php new file mode 100644 index 000000000..45b0c9e6e --- /dev/null +++ b/views/default/subgroups/groups_i_can_edit.php @@ -0,0 +1,71 @@ +<?php + +if (!elgg_is_logged_in()) { +	exit(); +} + +$q = sanitise_string(get_input('term')); + +// replace mysql vars with escaped strings +$q = str_replace(array('_', '%'), array('\_', '\%'), $q); + +$user_guid = elgg_get_logged_in_user_guid(); +$entities = elgg_get_entities(array( +	'type' => 'group', +	'owner_guid' => $user_guid, +	'limit' => 0, +)); +$entities = array_merge( +	$entities, +	elgg_get_entities_from_relationship(array( +		'type' => 'group', +		'relationship' => 'operator', +		'relationship_guid' => $user_guid, +		'limit' => 0, +	)) +); + +$all_entities = array(); +while (!empty($entities)) { +	$entity = array_pop($entities); +	$childs = elgg_get_entities(array( +		'type' => 'group', +		'container_guid' => $entity->guid, +	)); +	foreach ($childs as $child) { +		array_push($entities, $child); +	} +	$all_entities[] = $entity; +} + +$results = array(); +foreach ($all_entities as $entity) { + +	if (!preg_match("/^{$q}/i", $entity->name)) { +		continue; +	} + +	$output = elgg_view_list_item($entity, array( +		'use_hover' => false, +		'class' => 'elgg-autocomplete-item', +	)); + +	$icon = elgg_view_entity_icon($entity, 'tiny', array( +		'use_hover' => false, +	)); +	$results[$entity->name . $entity->guid] = array( +		'type' => 'group', +		'name' => $entity->name, +		'desc' => strip_tags($entity->description), +		'guid' => $entity->guid, +		'label' => $output, +		'value' => $entity->guid, +		'icon' => $icon, +		'url' => $entity->getURL(), +	); +} + +ksort($results); +header("Content-Type: application/json"); +echo json_encode(array_values($results)); +exit; diff --git a/views/default/subgroups/subgroups_icons.php b/views/default/subgroups/subgroups_icons.php new file mode 100644 index 000000000..dfd5b29fa --- /dev/null +++ b/views/default/subgroups/subgroups_icons.php @@ -0,0 +1,11 @@ +<?php +elgg_load_library('elgg:subgroups'); + +$subgroups = get_subgroups($vars['entity']); +foreach ($subgroups as $subgroup) { +	echo elgg_view('icon/default', array( +		'entity' => $subgroup, +		'size' => 'tiny' +	)); +	echo " "; +}  | 
