diff options
Diffstat (limited to 'mod/bookmarks/start.php')
-rw-r--r-- | mod/bookmarks/start.php | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/mod/bookmarks/start.php b/mod/bookmarks/start.php new file mode 100644 index 000000000..3846f5165 --- /dev/null +++ b/mod/bookmarks/start.php @@ -0,0 +1,297 @@ +<?php +/** + * Elgg Bookmarks plugin + * + * @package ElggBookmarks + */ + +elgg_register_event_handler('init', 'system', 'bookmarks_init'); + +/** + * Bookmark init + */ +function bookmarks_init() { + + $root = dirname(__FILE__); + elgg_register_library('elgg:bookmarks', "$root/lib/bookmarks.php"); + + // actions + $action_path = "$root/actions/bookmarks"; + elgg_register_action('bookmarks/save', "$action_path/save.php"); + elgg_register_action('bookmarks/delete', "$action_path/delete.php"); + elgg_register_action('bookmarks/share', "$action_path/share.php"); + + // menus + elgg_register_menu_item('site', array( + 'name' => 'bookmarks', + 'text' => elgg_echo('bookmarks'), + 'href' => 'bookmarks/all' + )); + + elgg_register_plugin_hook_handler('register', 'menu:page', 'bookmarks_page_menu'); + elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'bookmarks_owner_block_menu'); + + elgg_register_page_handler('bookmarks', 'bookmarks_page_handler'); + + elgg_extend_view('css/elgg', 'bookmarks/css'); + elgg_extend_view('js/elgg', 'bookmarks/js'); + + elgg_register_widget_type('bookmarks', elgg_echo('bookmarks'), elgg_echo('bookmarks:widget:description')); + + if (elgg_is_logged_in()) { + $user_guid = elgg_get_logged_in_user_guid(); + $address = urlencode(current_page_url()); + + elgg_register_menu_item('extras', array( + 'name' => 'bookmark', + 'text' => elgg_view_icon('push-pin-alt'), + 'href' => "bookmarks/add/$user_guid?address=$address", + 'title' => elgg_echo('bookmarks:this'), + 'rel' => 'nofollow', + )); + } + // Register granular notification for this type + register_notification_object('object', 'bookmarks', elgg_echo('bookmarks:new')); + + // Listen to notification events and supply a more useful message + elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'bookmarks_notify_message'); + + // Register a URL handler for bookmarks + elgg_register_entity_url_handler('object', 'bookmarks', 'bookmark_url'); + + // Register entity type for search + elgg_register_entity_type('object', 'bookmarks'); + + // Groups + add_group_tool_option('bookmarks', elgg_echo('bookmarks:enablebookmarks'), true); + elgg_extend_view('groups/tool_latest', 'bookmarks/group_module'); +} + +/** + * Dispatcher for bookmarks. + * + * URLs take the form of + * All bookmarks: bookmarks/all + * User's bookmarks: bookmarks/owner/<username> + * Friends' bookmarks: bookmarks/friends/<username> + * View bookmark: bookmarks/view/<guid>/<title> + * New bookmark: bookmarks/add/<guid> (container: user, group, parent) + * Edit bookmark: bookmarks/edit/<guid> + * Group bookmarks: bookmarks/group/<guid>/all + * Bookmarklet: bookmarks/bookmarklet/<guid> (user) + * + * Title is ignored + * + * @param array $page + * @return bool + */ +function bookmarks_page_handler($page) { + + elgg_load_library('elgg:bookmarks'); + + if (!isset($page[0])) { + $page[0] = 'all'; + } + + elgg_push_breadcrumb(elgg_echo('bookmarks'), 'bookmarks/all'); + + // old group usernames + if (substr_count($page[0], 'group:')) { + preg_match('/group\:([0-9]+)/i', $page[0], $matches); + $guid = $matches[1]; + if ($entity = get_entity($guid)) { + bookmarks_url_forwarder($page); + } + } + + // user usernames + $user = get_user_by_username($page[0]); + if ($user) { + bookmarks_url_forwarder($page); + } + + $pages = dirname(__FILE__) . '/pages/bookmarks'; + + switch ($page[0]) { + case "all": + include "$pages/all.php"; + break; + + case "owner": + include "$pages/owner.php"; + break; + + case "friends": + include "$pages/friends.php"; + break; + + case "view": + set_input('guid', $page[1]); + include "$pages/view.php"; + break; + case 'read': // Elgg 1.7 compatibility + register_error(elgg_echo("changebookmark")); + forward("bookmarks/view/{$page[1]}"); + break; + + case "add": + gatekeeper(); + include "$pages/add.php"; + break; + + case "edit": + gatekeeper(); + set_input('guid', $page[1]); + include "$pages/edit.php"; + break; + + case 'group': + group_gatekeeper(); + include "$pages/owner.php"; + break; + + case "bookmarklet": + set_input('container_guid', $page[1]); + include "$pages/bookmarklet.php"; + break; + + default: + return false; + } + + elgg_pop_context(); + return true; +} + +/** + * Forward to the new style of URLs + * + * @param string $page + */ +function bookmarks_url_forwarder($page) { + global $CONFIG; + + if (!isset($page[1])) { + $page[1] = 'items'; + } + + switch ($page[1]) { + case "read": + $url = "{$CONFIG->wwwroot}bookmarks/view/{$page[2]}/{$page[3]}"; + break; + case "inbox": + $url = "{$CONFIG->wwwroot}bookmarks/inbox/{$page[0]}"; + break; + case "friends": + $url = "{$CONFIG->wwwroot}bookmarks/friends/{$page[0]}"; + break; + case "add": + $url = "{$CONFIG->wwwroot}bookmarks/add/{$page[0]}"; + break; + case "items": + $url = "{$CONFIG->wwwroot}bookmarks/owner/{$page[0]}"; + break; + case "bookmarklet": + $url = "{$CONFIG->wwwroot}bookmarks/bookmarklet/{$page[0]}"; + break; + } + + register_error(elgg_echo("changebookmark")); + forward($url); +} + +/** + * Populates the ->getUrl() method for bookmarked objects + * + * @param ElggEntity $entity The bookmarked object + * @return string bookmarked item URL + */ +function bookmark_url($entity) { + global $CONFIG; + + $title = $entity->title; + $title = elgg_get_friendly_title($title); + return $CONFIG->url . "bookmarks/view/" . $entity->getGUID() . "/" . $title; +} + +/** + * Add a menu item to an ownerblock + * + * @param string $hook + * @param string $type + * @param array $return + * @param array $params + */ +function bookmarks_owner_block_menu($hook, $type, $return, $params) { + if (elgg_instanceof($params['entity'], 'user')) { + $url = "bookmarks/owner/{$params['entity']->username}"; + $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks'), $url); + $return[] = $item; + } else { + if ($params['entity']->bookmarks_enable != 'no') { + $url = "bookmarks/group/{$params['entity']->guid}/all"; + $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks:group'), $url); + $return[] = $item; + } + } + + return $return; +} + +/** + * Returns the body of a notification message + * + * @param string $hook + * @param string $entity_type + * @param string $returnvalue + * @param array $params + */ +function bookmarks_notify_message($hook, $entity_type, $returnvalue, $params) { + $entity = $params['entity']; + $to_entity = $params['to_entity']; + $method = $params['method']; + if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'bookmarks')) { + $descr = $entity->description; + $title = $entity->title; + $owner = $entity->getOwnerEntity(); + + return elgg_echo('bookmarks:notification', array( + $owner->name, + $title, + $entity->address, + $descr, + $entity->getURL() + )); + } + return null; +} + +/** + * Add a page menu menu. + * + * @param string $hook + * @param string $type + * @param array $return + * @param array $params + */ +function bookmarks_page_menu($hook, $type, $return, $params) { + if (elgg_is_logged_in()) { + // only show bookmarklet in bookmark pages + if (elgg_in_context('bookmarks')) { + $page_owner = elgg_get_page_owner_entity(); + if (!$page_owner) { + $page_owner = elgg_get_logged_in_user_entity(); + } + + if ($page_owner instanceof ElggGroup) { + $title = elgg_echo('bookmarks:bookmarklet:group'); + } else { + $title = elgg_echo('bookmarks:bookmarklet'); + } + + $return[] = new ElggMenuItem('bookmarklet', $title, 'bookmarks/bookmarklet/' . $page_owner->getGUID()); + } + } + + return $return; +} |