aboutsummaryrefslogtreecommitdiff
path: root/mod/blog/start.php
diff options
context:
space:
mode:
Diffstat (limited to 'mod/blog/start.php')
-rw-r--r--mod/blog/start.php368
1 files changed, 228 insertions, 140 deletions
diff --git a/mod/blog/start.php b/mod/blog/start.php
index 6b9f500a2..e724b91c2 100644
--- a/mod/blog/start.php
+++ b/mod/blog/start.php
@@ -3,212 +3,300 @@
* Blogs
*
* @package Blog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.org/
*
* @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');
+
/**
* Init blog plugin.
- *
- * @return TRUE
*/
function blog_init() {
- global $CONFIG;
- require_once dirname(__FILE__) . '/blog_lib.php';
- add_menu(elgg_echo('blog:blogs'), "{$CONFIG->wwwroot}pg/blog/", array());
+ elgg_register_library('elgg:blog', elgg_get_plugins_path() . 'blog/lib/blog.php');
+
+ // add a site navigation item
+ $item = new ElggMenuItem('blog', elgg_echo('blog:blogs'), 'blog/all');
+ elgg_register_menu_item('site', $item);
- // run the setup upon activations or to upgrade old installations.
- run_function_once('blog_runonce', '1269370108');
+ elgg_register_event_handler('upgrade', 'upgrade', 'blog_run_upgrades');
- elgg_extend_view('css', 'blog/css');
+ // add to the main css
+ elgg_extend_view('css/elgg', 'blog/css');
- register_elgg_event_handler('pagesetup', 'system', 'blog_page_setup');
- register_page_handler('blog', 'blog_page_handler');
- register_entity_url_handler('blog_url_handler', 'object', 'blog');
+ // 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);
- // notifications
- register_notification_object('object', 'blog', elgg_echo('blog:newpost'));
- register_plugin_hook('notify:entity:message', 'object', 'blog_notify_message');
+ // 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
- //register_elgg_event_handler('create', 'object', 'blog_incoming_ping');
- //register_plugin_hook('pingback:object:subtypes', 'object', 'blog_pingback_subtypes');
+ //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_widget_type('blog', elgg_echo('blog'), elgg_echo('blog:widget:description'), 'profile, dashboard');
+ // Add group option
+ add_group_tool_option('blog', elgg_echo('blog:enableblog'), true);
+ elgg_extend_view('groups/tool_latest', 'blog/group_module');
- $action_path = dirname(__FILE__) . '/actions/blog';
+ // add a blog widget
+ elgg_register_widget_type('blog', elgg_echo('blog'), elgg_echo('blog:widget:description'));
- register_action('blog/save', FALSE, "$action_path/save.php");
- register_action('blog/auto_save_revision', FALSE, "$action_path/auto_save_revision.php");
- register_action('blog/delete', FALSE, "$action_path/delete.php");
+ // register actions
+ $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");
- // ecml
- register_plugin_hook('get_views', 'ecml', 'blog_ecml_views_hook');
+ // entity menu
+ elgg_register_plugin_hook_handler('register', 'menu:entity', 'blog_entity_menu_setup');
- // Register profile menu hook
- register_plugin_hook('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');
- }
+ // ecml
+ elgg_register_plugin_hook_handler('get_views', 'ecml', 'blog_ecml_views_hook');
}
/**
* Dispatches blog pages.
- * To maintain URL backward compatibility, expects old-style URLs like:
- * pg/blog/[username/[read|edit|archive|new/[time_start|guid/[time_end|title]]]]
+ * URLs take the form of
+ * 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 a username, show all blogs
- * Without an action (read|edit|archive|new), forward to pg/blog/username/read.
- * Without a guid, show all post for that user.
* Title is ignored
*
- * If archive, uses time_start/end
- *
- * @todo There is no way to say "show me archive view for all blog posts" with the
- * current URL scheme because $param[0] is the username instead of an action.
- * Could do something hideous like make '*' mean "all users" (since a username can't be *).
- * Can't change the URL scheme because of URL compatibility.
+ * @todo no archives for all blogs or friends
*
* @param array $page
- * @return NULL
+ * @return bool
*/
function blog_page_handler($page) {
- global $CONFIG;
- // see if we're showing all or just a user's
- if (isset($page[0]) && !empty($page[0])) {
- $username = $page[0];
+ elgg_load_library('elgg:blog');
- // push breadcrumb
- elgg_push_breadcrumb(elgg_echo('blog:blogs'), "{$CONFIG->site->url}pg/blog");
+ // forward to correct URL for blog pages pre-1.8
+ blog_url_forwarder($page);
- // forward away if invalid user.
- if (!$user = get_user_by_username($username)) {
- register_error('blog:error:unknown_username');
- forward($_SERVER['HTTP_REFERER']);
- }
+ // push all blogs breadcrumb
+ elgg_push_breadcrumb(elgg_echo('blog:blogs'), "blog/all");
- set_page_owner($user->getGUID());
- $crumbs_title = sprintf(elgg_echo('blog:owned_blogs'), $user->name);
- $crumbs_url = "{$CONFIG->site->url}pg/blog/$username/read";
- elgg_push_breadcrumb($crumbs_title, $crumbs_url);
-
- $action = isset($page[1]) ? $page[1] : FALSE;
- // 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 'read':
- $title = sprintf(elgg_echo('blog:title:user_blogs'), $user->name);
- $content_info = blog_get_page_content_read($user->getGUID(), $page2);
- break;
-
- case 'new':
- case 'edit':
- gatekeeper();
- $title = elgg_echo('blog:edit');
- $content_info = blog_get_page_content_edit($page2, $page3);
- break;
-
- case 'archive':
- $title = elgg_echo('blog:archives');
- $content_info = blog_get_page_content_archive($user->getGUID(), $page2, $page3);
- break;
-
- case 'friends':
- $title = elgg_echo('blog:title:friends');
- $content_info = blog_get_page_content_friends($user->getGUID());
- break;
-
- default:
- forward("pg/blog/$username/read/");
- break;
- }
- } else {
- $title = elgg_echo('blog:title:all_blogs');
- $content_info = blog_get_page_content_read();
+ if (!isset($page[0])) {
+ $page[0] = 'all';
}
- $sidebar = isset($content_info['sidebar']) ? $content_info['sidebar'] : '';
-
- $sidebar .= elgg_view('blog/sidebar_menu', array(
- 'page' => isset($page[1]) ? $page[1] : FALSE,
- ));
+ $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;
+ }
- $content = elgg_view('navigation/breadcrumbs') . $content_info['content'];
+ 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('one_column_with_sidebar', $content, $sidebar);
+ $body = elgg_view_layout('content', $params);
- page_draw($title, $body);
+ echo elgg_view_page($params['title'], $body);
+ return true;
}
/**
- * Format and return the correct URL for blogs.
+ * Format and return the URL for blogs.
*
- * @param ElggObject $entity
+ * @param ElggObject $entity Blog object
* @return string URL of blog.
*/
function blog_url_handler($entity) {
- global $CONFIG;
-
- if (!$user = get_entity($entity->owner_guid)) {
+ if (!$entity->getOwnerEntity()) {
// default to a standard view if no owner.
return FALSE;
}
- $friendly_title = friendly_title($entity->title);
+ $friendly_title = elgg_get_friendly_title($entity->title);
- $url = "{$CONFIG->site->url}pg/blog/{$user->username}/read/{$entity->getGUID()}/$friendly_title";
- return $url;
+ return "blog/view/{$entity->guid}/$friendly_title";
}
/**
- * Register blogs with ECML.
- *
- * @param unknown_type $hook
- * @param unknown_type $entity_type
- * @param unknown_type $return_value
- * @param unknown_type $params
+ * Add a menu item to an ownerblock
*/
-function blog_ecml_views_hook($hook, $entity_type, $return_value, $params) {
- $return_value['object/blog'] = elgg_echo('blog:blogs');
+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;
+ }
+ }
- return $return_value;
+ return $return;
}
-function blog_profile_menu($hook, $entity_type, $return_value, $params) {
- global $CONFIG;
+/**
+ * Add particular blog links/info to entity menu
+ */
+function blog_entity_menu_setup($hook, $type, $return, $params) {
+ if (elgg_in_context('widgets')) {
+ return $return;
+ }
+
+ $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]);
+ }
+ }
- if (!($params['owner'] instanceof ElggGroup)) {
- $return_value[] = array(
- 'text' => elgg_echo('blog'),
- 'href' => "{$CONFIG->url}pg/blog/{$params['owner']->username}/read",
+ $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 $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.
+ */
+function blog_ecml_views_hook($hook, $entity_type, $return_value, $params) {
+ $return_value['object/blog'] = elgg_echo('blog:blogs');
return $return_value;
}
-register_elgg_event_handler('init', 'system', 'blog_init');
+/**
+ * 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');
+ }
+
+ elgg_set_plugin_setting('upgrade_version', 1, 'blogs');
+ }
+}