diff options
Diffstat (limited to 'mod/blog/start.php')
| -rw-r--r-- | mod/blog/start.php | 372 |
1 files changed, 209 insertions, 163 deletions
diff --git a/mod/blog/start.php b/mod/blog/start.php index 8caffcb5f..e724b91c2 100644 --- a/mod/blog/start.php +++ b/mod/blog/start.php @@ -5,12 +5,11 @@ * @package Blog * * @todo - * Either drop support for "publish date" or duplicate more entity getter + * - Either drop support for "publish date" or duplicate more entity getter * functions to work with a non-standard time_created. - * Show friends blog posts - * Widget - * Pingbacks - * Notifications + * - Pingbacks + * - Notifications + * - River entry for posts saved as drafts and later published */ elgg_register_event_handler('init', 'system', 'blog_init'); @@ -19,223 +18,265 @@ elgg_register_event_handler('init', 'system', 'blog_init'); * Init blog plugin. */ function blog_init() { - - elgg_register_library('elgg:blog', elgg_get_plugin_path() . 'blog/lib/blog.php'); - add_menu(elgg_echo('blog:blogs'), "pg/blog/all/", array()); + elgg_register_library('elgg:blog', elgg_get_plugins_path() . 'blog/lib/blog.php'); - // run the setup upon activations or to upgrade old installations. - run_function_once('blog_runonce', '1269370108'); + // add a site navigation item + $item = new ElggMenuItem('blog', elgg_echo('blog:blogs'), 'blog/all'); + elgg_register_menu_item('site', $item); - elgg_extend_view('css/screen', 'blog/css'); + elgg_register_event_handler('upgrade', 'upgrade', 'blog_run_upgrades'); - elgg_register_event_handler('pagesetup', 'system', 'blog_page_setup'); - register_page_handler('blog', 'blog_page_handler'); - register_entity_url_handler('blog_url_handler', 'object', 'blog'); + // add to the main css + elgg_extend_view('css/elgg', 'blog/css'); - // notifications - register_notification_object('object', 'blog', elgg_echo('blog:newpost')); + // register the blog's JavaScript + $blog_js = elgg_get_simplecache_url('js', 'blog/save_draft'); + elgg_register_simplecache_view('js/blog/save_draft'); + elgg_register_js('elgg.blog', $blog_js); + + // routing of urls + elgg_register_page_handler('blog', 'blog_page_handler'); + + // override the default url to view a blog object + elgg_register_entity_url_handler('object', 'blog', 'blog_url_handler'); + + // notifications - need to register for unique event because of draft/published status + elgg_register_event_handler('publish', 'object', 'object_notifications'); elgg_register_plugin_hook_handler('notify:entity:message', 'object', 'blog_notify_message'); + // add blog link to + elgg_register_plugin_hook_handler('register', 'menu:owner_block', 'blog_owner_block_menu'); + // pingbacks //elgg_register_event_handler('create', 'object', 'blog_incoming_ping'); //elgg_register_plugin_hook_handler('pingback:object:subtypes', 'object', 'blog_pingback_subtypes'); // Register for search. - register_entity_type('object', 'blog'); + elgg_register_entity_type('object', 'blog'); + + // Add group option + add_group_tool_option('blog', elgg_echo('blog:enableblog'), true); + elgg_extend_view('groups/tool_latest', 'blog/group_module'); - //add_widget_type('blog', elgg_echo('blog'), elgg_echo('blog:widget:description'), 'profile, dashboard'); + // add a blog widget + elgg_register_widget_type('blog', elgg_echo('blog'), elgg_echo('blog:widget:description')); // register actions - $action_path = elgg_get_plugin_path() . 'blog/actions/blog'; + $action_path = elgg_get_plugins_path() . 'blog/actions/blog'; elgg_register_action('blog/save', "$action_path/save.php"); elgg_register_action('blog/auto_save_revision', "$action_path/auto_save_revision.php"); elgg_register_action('blog/delete', "$action_path/delete.php"); + // entity menu + elgg_register_plugin_hook_handler('register', 'menu:entity', 'blog_entity_menu_setup'); + // ecml elgg_register_plugin_hook_handler('get_views', 'ecml', 'blog_ecml_views_hook'); - - // Register profile menu hook - elgg_register_plugin_hook_handler('profile_menu', 'profile', 'blog_profile_menu'); -} - -/** - * Register entity class for object:blog -> ElggBlog - */ -function blog_runonce() { - if (!update_subtype('object', 'blog', 'ElggBlog')) { - add_subtype('object', 'blog', 'ElggBlog'); - } } /** * Dispatches blog pages. * URLs take the form of - * pg/blog/[all|owner|read|edit|archive|new]/[username]/[time_start|guid]/[time_end|title] + * All blogs: blog/all + * User's blogs: blog/owner/<username> + * Friends' blog: blog/friends/<username> + * User's archives: blog/archives/<username>/<time_start>/<time_stop> + * Blog post: blog/view/<guid>/<title> + * New post: blog/add/<guid> + * Edit post: blog/edit/<guid>/<revision> + * Preview post: blog/preview/<guid> + * Group blog: blog/group/<guid>/all * - * Without an action, show all blogs - * Without a guid, show all post for that user. * Title is ignored * - * If archive, uses time_start/end - * * @todo no archives for all blogs or friends * * @param array $page - * @return NULL + * @return bool */ function blog_page_handler($page) { - // @todo remove the forwarder in 1.9 - // forward to correct URL for bookmaarks pre-1.7.5 - // 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)) { - blog_url_forwarder($page); - } - } - // user usernames - $user = get_user_by_username($page[0]); - if ($user) { - blog_url_forwarder($page); - } - elgg_load_library('elgg:blog'); - // push breadcrumb - elgg_push_breadcrumb(elgg_echo('blog:blogs'), "pg/blog/all/"); + // forward to correct URL for blog pages pre-1.8 + blog_url_forwarder($page); + + // push all blogs breadcrumb + elgg_push_breadcrumb(elgg_echo('blog:blogs'), "blog/all"); if (!isset($page[0])) { $page[0] = 'all'; } - // if username not set, we are showing all blog posts - if (!isset($page[1])) { - $title = elgg_echo('blog:title:all_blogs'); - $params = blog_get_page_content_list(); - } else { - $username = $page[1]; - // forward away if invalid user. - if (!$user = get_user_by_username($username)) { - register_error('blog:error:unknown_username'); - forward(REFERER); - } - - set_page_owner($user->getGUID()); - $crumbs_title = elgg_echo('blog:owned_blogs', array($user->name)); - $crumbs_url = "pg/blog/owner/$username/"; - elgg_push_breadcrumb($crumbs_title, $crumbs_url); - - $action = $page[0]; - // yeah these are crap names, but they're used for different things. - $page2 = isset($page[2]) ? $page[2] : FALSE; - $page3 = isset($page[3]) ? $page[3] : FALSE; - - switch ($action) { - case 'owner': - $title = elgg_echo('blog:title:user_blogs', array($user->name)); - $params = blog_get_page_content_list($user->getGUID()); - break; - - case 'read': - $title = elgg_echo('blog:title:user_blogs', array($user->name)); - $params = blog_get_page_content_read($page2); - break; - - case 'new': - case 'edit': - gatekeeper(); - $title = elgg_echo('blog:edit'); - $params = blog_get_page_content_edit($page2, $page3); - break; - - case 'archive': - $title = elgg_echo('blog:archives'); - $params = blog_get_page_content_archive($user->getGUID(), $page2, $page3); - break; - - case 'friends': - $title = elgg_echo('blog:title:friends'); - $params = blog_get_page_content_friends($user->getGUID()); - break; - - default: - forward("pg/blog/owner/$username/"); - break; - } + $page_type = $page[0]; + switch ($page_type) { + case 'owner': + $user = get_user_by_username($page[1]); + if (!$user) { + forward('', '404'); + } + $params = blog_get_page_content_list($user->guid); + break; + case 'friends': + $user = get_user_by_username($page[1]); + if (!$user) { + forward('', '404'); + } + $params = blog_get_page_content_friends($user->guid); + break; + case 'archive': + $user = get_user_by_username($page[1]); + if (!$user) { + forward('', '404'); + } + $params = blog_get_page_content_archive($user->guid, $page[2], $page[3]); + break; + case 'view': + $params = blog_get_page_content_read($page[1]); + break; + case 'read': // Elgg 1.7 compatibility + register_error(elgg_echo("changebookmark")); + forward("blog/view/{$page[1]}"); + break; + case 'add': + gatekeeper(); + $params = blog_get_page_content_edit($page_type, $page[1]); + break; + case 'edit': + gatekeeper(); + $params = blog_get_page_content_edit($page_type, $page[1], $page[2]); + break; + case 'group': + $group = get_entity($page[1]); + if (!elgg_instanceof($group, 'group')) { + forward('', '404'); + } + if (!isset($page[2]) || $page[2] == 'all') { + $params = blog_get_page_content_list($page[1]); + } else { + $params = blog_get_page_content_archive($page[1], $page[3], $page[4]); + } + break; + case 'all': + $params = blog_get_page_content_list(); + break; + default: + return false; } - $sidebar_menu = elgg_view('blog/sidebar_menu', array( - 'page' => $action, - )); - - $params['sidebar'] .= $sidebar_menu; + if (isset($params['sidebar'])) { + $params['sidebar'] .= elgg_view('blog/sidebar', array('page' => $page_type)); + } else { + $params['sidebar'] = elgg_view('blog/sidebar', array('page' => $page_type)); + } $body = elgg_view_layout('content', $params); - echo elgg_view_page($title, $body); + echo elgg_view_page($params['title'], $body); + return true; } /** - * Forward to the new style of URLs + * Format and return the URL for blogs. * - * @param string $page + * @param ElggObject $entity Blog object + * @return string URL of blog. */ -function blog_url_forwarder($page) { - global $CONFIG; - - if (!isset($page[1])) { - $page[1] = 'owner'; +function blog_url_handler($entity) { + if (!$entity->getOwnerEntity()) { + // default to a standard view if no owner. + return FALSE; } - switch ($page[1]) { - case "read": - $url = "{$CONFIG->wwwroot}pg/blog/read/{$page[2]}/{$page[3]}"; - break; - case "archive": - $url = "{$CONFIG->wwwroot}pg/blog/archive/{$page[0]}/{$page[2]}/{$page[3]}"; - break; - case "friends": - $url = "{$CONFIG->wwwroot}pg/blog/friends/{$page[0]}/"; - break; - case "new": - $url = "{$CONFIG->wwwroot}pg/blog/new/{$page[0]}/"; - break; - case "owner": - $url = "{$CONFIG->wwwroot}pg/blog/owner/{$page[0]}/"; - break; + $friendly_title = elgg_get_friendly_title($entity->title); + + return "blog/view/{$entity->guid}/$friendly_title"; +} + +/** + * Add a menu item to an ownerblock + */ +function blog_owner_block_menu($hook, $type, $return, $params) { + if (elgg_instanceof($params['entity'], 'user')) { + $url = "blog/owner/{$params['entity']->username}"; + $item = new ElggMenuItem('blog', elgg_echo('blog'), $url); + $return[] = $item; + } else { + if ($params['entity']->blog_enable != "no") { + $url = "blog/group/{$params['entity']->guid}/all"; + $item = new ElggMenuItem('blog', elgg_echo('blog:group'), $url); + $return[] = $item; + } } - register_error(elgg_echo("changebookmark")); - forward($url); + return $return; } /** - * Format and return the correct URL for blogs. - * - * @param ElggObject $entity - * @return string URL of blog. + * Add particular blog links/info to entity menu */ -function blog_url_handler($entity) { - if (!$user = get_entity($entity->owner_guid)) { - // default to a standard view if no owner. - return FALSE; +function blog_entity_menu_setup($hook, $type, $return, $params) { + if (elgg_in_context('widgets')) { + return $return; } - $friendly_title = elgg_get_friendly_title($entity->title); + $entity = $params['entity']; + $handler = elgg_extract('handler', $params, false); + if ($handler != 'blog') { + return $return; + } + + if ($entity->status != 'published') { + // draft status replaces access + foreach ($return as $index => $item) { + if ($item->getName() == 'access') { + unset($return[$index]); + } + } + + $status_text = elgg_echo("blog:status:{$entity->status}"); + $options = array( + 'name' => 'published_status', + 'text' => "<span>$status_text</span>", + 'href' => false, + 'priority' => 150, + ); + $return[] = ElggMenuItem::factory($options); + } - return "pg/blog/read/{$user->username}/{$entity->guid}/$friendly_title"; + return $return; +} + +/** + * Set the notification message body + * + * @param string $hook Hook name + * @param string $type Hook type + * @param string $message The current message body + * @param array $params Parameters about the blog posted + * @return string + */ +function blog_notify_message($hook, $type, $message, $params) { + $entity = $params['entity']; + $to_entity = $params['to_entity']; + $method = $params['method']; + if (elgg_instanceof($entity, 'object', 'blog')) { + $descr = $entity->excerpt; + $title = $entity->title; + $owner = $entity->getOwnerEntity(); + return elgg_echo('blog:notification', array( + $owner->name, + $title, + $descr, + $entity->getURL() + )); + } + return null; } /** * Register blogs with ECML. - * - * @param unknown_type $hook - * @param unknown_type $entity_type - * @param unknown_type $return_value - * @param unknown_type $params */ function blog_ecml_views_hook($hook, $entity_type, $return_value, $params) { $return_value['object/blog'] = elgg_echo('blog:blogs'); @@ -243,14 +284,19 @@ function blog_ecml_views_hook($hook, $entity_type, $return_value, $params) { return $return_value; } -function blog_profile_menu($hook, $entity_type, $return_value, $params) { +/** + * Upgrade from 1.7 to 1.8. + */ +function blog_run_upgrades($event, $type, $details) { + $blog_upgrade_version = elgg_get_plugin_setting('upgrade_version', 'blogs'); + + if (!$blog_upgrade_version) { + // When upgrading, check if the ElggBlog class has been registered as this + // was added in Elgg 1.8 + if (!update_subtype('object', 'blog', 'ElggBlog')) { + add_subtype('object', 'blog', 'ElggBlog'); + } - if (!($params['owner'] instanceof ElggGroup)) { - $return_value[] = array( - 'text' => elgg_echo('blog'), - 'href' => "pg/blog/owner/{$params['owner']->username}/", - ); + elgg_set_plugin_setting('upgrade_version', 1, 'blogs'); } - - return $return_value; } |
