<?php /** * Elgg Bookmarks plugin * * @package ElggBookmarks */ elgg_register_event_handler('init', 'system', 'bookmarks_init'); /** * Bookmark init */ function bookmarks_init() { global $CONFIG; $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", 'logged_in'); elgg_register_action('bookmarks/delete', "$action_path/delete.php", 'logged_in'); elgg_register_action('bookmarks/share', "$action_path/share.php", 'logged_in'); // menus elgg_register_menu_item('site', array( 'name' => 'bookmarks', 'title' => elgg_echo('bookmarks'), 'url' => 'pg/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_plugin_hook_handler('register', 'menu:user_hover', 'bookmarks_user_hover_menu'); elgg_register_page_handler('bookmarks', 'bookmarks_page_handler'); elgg_extend_view('css/screen', 'bookmarks/css'); elgg_extend_view('js/elgg', 'bookmarks/js'); elgg_extend_view('page/links', 'bookmarks/page_links'); // Register granular notification for this type if (is_callable('register_notification_object')) { 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: pg/bookmarks/all * User's bookmarks: pg/bookmarks/owner/<username> * Friends' bookmarks: pg/bookmarks/friends/<username> * View bookmark: pg/bookmarks/view/<guid>/<title> * New bookmark: pg/bookmarks/add/<guid> (container: user, group, parent) * Edit bookmark: pg/bookmarks/edit/<guid> * Group bookmarks: pg/bookmarks/group/<guid>/owner * Bookmarklet: pg/bookmarks/bookmarklet/<guid> (user) * * Title is ignored * * @param array $page */ function bookmarks_page_handler($page) { elgg_load_library('elgg:bookmarks'); elgg_push_breadcrumb(elgg_echo('bookmarks'), 'pg/bookmarks/all'); elgg_push_context('bookmarks'); // 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'; switch ($page[0]) { case "all": include "$pages/all.php"; break; case "owner": set_input('username', $page[1]); include "$pages/owner.php"; break; case "friends": set_input('username', $page[1]); include "$pages/friends.php"; break; case "read": case "view": set_input('guid', $page[1]); include "$pages/view.php"; break; case "add": gatekeeper(); set_input('container_guid', $page[1]); include "$pages/add.php"; break; case "edit": gatekeeper(); set_input('guid', $page[1]); include "$pages/edit.php"; break; case 'group': group_gatekeeper(); set_input('guid', $page[1]); 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}pg/bookmarks/view/{$page[2]}/{$page[3]}"; break; case "inbox": $url = "{$CONFIG->wwwroot}pg/bookmarks/inbox/{$page[0]}/"; break; case "friends": $url = "{$CONFIG->wwwroot}pg/bookmarks/friends/{$page[0]}/"; break; case "add": $url = "{$CONFIG->wwwroot}pg/bookmarks/add/{$page[0]}/"; break; case "items": $url = "{$CONFIG->wwwroot}pg/bookmarks/owner/{$page[0]}/"; break; case "bookmarklet": $url = "{$CONFIG->wwwroot}pg/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 . "pg/bookmarks/view/" . $entity->getGUID() . "/" . $title; } /** * Add a menu item to an ownerblock */ function bookmarks_owner_block_menu($hook, $type, $return, $params) { if (elgg_instanceof($params['entity'], 'user')) { $url = "pg/bookmarks/owner/{$params['entity']->username}"; $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks'), $url); $return[] = $item; } else { if ($params['entity']->bookmarks_enable != 'no') { $url = "pg/bookmarks/group/{$params['entity']->guid}/owner"; $item = new ElggMenuItem('bookmarks', elgg_echo('bookmarks:group'), $url); $return[] = $item; } } return $return; } /** * Returns a more meaningful message * * @param unknown_type $hook * @param unknown_type $entity_type * @param unknown_type $returnvalue * @param unknown_type $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; global $CONFIG; $url = elgg_get_site_url() . "pg/view/" . $entity->guid; if ($method == 'sms') { $owner = $entity->getOwnerEntity(); return $owner->name . ' ' . elgg_echo("bookmarks:via") . ': ' . $url . ' (' . $title . ')'; } if ($method == 'email') { $owner = $entity->getOwnerEntity(); return $owner->name . ' ' . elgg_echo("bookmarks:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL(); } if ($method == 'web') { $owner = $entity->getOwnerEntity(); return $owner->name . ' ' . elgg_echo("bookmarks:via") . ': ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL(); } } return null; } /** * Add a user hover menu. * * @param unknown_type $hook * @param unknown_type $type * @param unknown_type $return * @param unknown_type $params */ function bookmarks_user_hover_menu($hook, $type, $return, $params) { $user = $params['entity']; $title = elgg_echo('bookmarks'); $url = "pg/bookmarks/owner/$user->username"; $return[] = new ElggMenuItem('bookmarks', $title, $url); return $return; } /** * Add a page menu menu. * * @param unknown_type $hook * @param unknown_type $type * @param unknown_type $return * @param unknown_type $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 instanceof ElggGroup) { $title = elgg_echo('bookmarks:bookmarklet:group'); } else { $title = elgg_echo('bookmarks:bookmarklet'); } $return[] = new ElggMenuItem('bookmarklet', $title, 'pg/bookmarks/bookmarklet/' . $page_owner->getGUID()); } } return $return; }