diff options
Diffstat (limited to 'mod/blog/start.php')
| -rw-r--r-- | mod/blog/start.php | 302 | 
1 files changed, 302 insertions, 0 deletions
diff --git a/mod/blog/start.php b/mod/blog/start.php new file mode 100644 index 000000000..e724b91c2 --- /dev/null +++ b/mod/blog/start.php @@ -0,0 +1,302 @@ +<?php +/** + * Blogs + * + * @package Blog + * + * @todo + * - Either drop support for "publish date" or duplicate more entity getter + * functions to work with a non-standard time_created. + * - Pingbacks + * - Notifications + * - River entry for posts saved as drafts and later published + */ + +elgg_register_event_handler('init', 'system', 'blog_init'); + +/** + * Init blog plugin. + */ +function blog_init() { + +	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); + +	elgg_register_event_handler('upgrade', 'upgrade', 'blog_run_upgrades'); + +	// add to the main css +	elgg_extend_view('css/elgg', 'blog/css'); + +	// 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. +	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 a blog widget +	elgg_register_widget_type('blog', elgg_echo('blog'), elgg_echo('blog:widget:description')); + +	// 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"); + +	// 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'); +} + +/** + * Dispatches blog pages. + * 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 + * + * Title is ignored + * + * @todo no archives for all blogs or friends + * + * @param array $page + * @return bool + */ +function blog_page_handler($page) { + +	elgg_load_library('elgg:blog'); + +	// 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'; +	} + +	$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; +	} + +	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($params['title'], $body); +	return true; +} + +/** + * Format and return the URL for blogs. + * + * @param ElggObject $entity Blog object + * @return string URL of blog. + */ +function blog_url_handler($entity) { +	if (!$entity->getOwnerEntity()) { +		// default to a standard view if no owner. +		return FALSE; +	} + +	$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; +		} +	} + +	return $return; +} + +/** + * 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]); +			} +		} + +		$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; +} + +/** + * 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'); +	} +}  | 
