aboutsummaryrefslogtreecommitdiff
path: root/mod/blog
diff options
context:
space:
mode:
Diffstat (limited to 'mod/blog')
-rw-r--r--mod/blog/actions/add.php84
-rw-r--r--mod/blog/actions/blog/auto_save_revision.php89
-rw-r--r--mod/blog/actions/blog/delete.php27
-rw-r--r--mod/blog/actions/blog/save.php182
-rw-r--r--mod/blog/actions/delete.php38
-rw-r--r--mod/blog/actions/edit.php86
-rw-r--r--mod/blog/activate.php10
-rw-r--r--mod/blog/add.php36
-rw-r--r--mod/blog/archive.php50
-rw-r--r--mod/blog/classes/ElggBlog.php42
-rw-r--r--mod/blog/deactivate.php6
-rw-r--r--mod/blog/edit.php41
-rw-r--r--mod/blog/everyone.php37
-rw-r--r--mod/blog/friends.php47
-rw-r--r--mod/blog/index.php53
-rw-r--r--mod/blog/languages/en.php153
-rw-r--r--mod/blog/lib/blog.php478
-rw-r--r--mod/blog/manifest.xml25
-rw-r--r--mod/blog/preview.php47
-rw-r--r--mod/blog/read.php59
-rw-r--r--mod/blog/savedraft.php26
-rw-r--r--mod/blog/start.php555
-rw-r--r--mod/blog/views/default/blog/categorylist.php14
-rw-r--r--mod/blog/views/default/blog/css.php214
-rw-r--r--mod/blog/views/default/blog/forms/edit.php200
-rw-r--r--mod/blog/views/default/blog/gallery.php31
-rw-r--r--mod/blog/views/default/blog/group_module.php46
-rw-r--r--mod/blog/views/default/blog/listing.php25
-rw-r--r--mod/blog/views/default/blog/menu.php17
-rw-r--r--mod/blog/views/default/blog/notfound.php21
-rw-r--r--mod/blog/views/default/blog/previewpane.php6
-rw-r--r--mod/blog/views/default/blog/sidebar.php30
-rw-r--r--mod/blog/views/default/blog/sidebar/archives.php34
-rw-r--r--mod/blog/views/default/blog/sidebar/revisions.php79
-rw-r--r--mod/blog/views/default/blog/view.php26
-rw-r--r--mod/blog/views/default/forms/blog/save.php166
-rw-r--r--mod/blog/views/default/js/blog/save_draft.php67
-rw-r--r--mod/blog/views/default/object/blog.php223
-rw-r--r--mod/blog/views/default/river/object/blog/annotate.php13
-rw-r--r--mod/blog/views/default/river/object/blog/create.php29
-rw-r--r--mod/blog/views/default/river/object/blog/update.php13
-rw-r--r--mod/blog/views/default/widgets/blog/content.php30
-rw-r--r--mod/blog/views/default/widgets/blog/edit.php22
43 files changed, 1794 insertions, 1683 deletions
diff --git a/mod/blog/actions/add.php b/mod/blog/actions/add.php
deleted file mode 100644
index 97634638e..000000000
--- a/mod/blog/actions/add.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
- /**
- * Elgg blog: add post action
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.org/
- */
-
- // Make sure we're logged in (send us to the front page if not)
- gatekeeper();
-
- // Get input data
- $title = get_input('blogtitle');
- $body = get_input('blogbody');
- $tags = get_input('blogtags');
- $access = get_input('access_id');
- $comments_on = get_input('comments_select','Off');
-
- // Cache to the session
- $_SESSION['user']->blogtitle = $title;
- $_SESSION['user']->blogbody = $body;
- $_SESSION['user']->blogtags = $tags;
-
- // Convert string of tags into a preformatted array
- $tagarray = string_to_tag_array($tags);
-
- // Make sure the title / description aren't blank
- if (empty($title) || empty($body)) {
- register_error(elgg_echo("blog:blank"));
- forward($_SERVER['HTTP_REFERER']);
- }
-
-
- // Initialise a new ElggObject
- $blog = new ElggObject();
- // Tell the system it's a blog post
- $blog->subtype = "blog";
- // Set its owner to the current user
- $blog->owner_guid = get_loggedin_userid();
- // Set it's container
- $blog->container_guid = (int)get_input('container_guid', get_loggedin_userid());
- // For now, set its access
- $blog->access_id = $access;
- // Set its title and description appropriately
- $blog->title = $title;
- $blog->description = $body;
- // Now let's add tags. We can pass an array directly to the object property! Easy.
- if (is_array($tagarray)) {
- $blog->tags = $tagarray;
- }
- //whether the user wants to allow comments or not on the blog post
- $blog->comments_on = $comments_on;
-
- // Now save the object
- if (!$blog->save()) {
- register_error(elgg_echo("blog:error"));
- forward($_SERVER['HTTP_REFERER']);
- }
-
- // Success message
- system_message(elgg_echo("blog:posted"));
- // add to river
- add_to_river('river/object/blog/create', 'create', get_loggedin_userid(), $blog->guid);
- // Remove the blog post cache
- //unset($_SESSION['blogtitle']); unset($_SESSION['blogbody']); unset($_SESSION['blogtags']);
- remove_metadata($_SESSION['user']->guid,'blogtitle');
- remove_metadata($_SESSION['user']->guid,'blogbody');
- remove_metadata($_SESSION['user']->guid,'blogtags');
-
- // Forward to the main blog page
- $page_owner = get_entity($blog->container_guid);
- if ($page_owner instanceof ElggUser) {
- $username = $page_owner->username;
- } else if ($page_owner instanceof ElggGroup) {
- $username = "group:" . $page_owner->guid;
- }
-
- forward("pg/blog/$username");
-
-?>
diff --git a/mod/blog/actions/blog/auto_save_revision.php b/mod/blog/actions/blog/auto_save_revision.php
new file mode 100644
index 000000000..e33edfaab
--- /dev/null
+++ b/mod/blog/actions/blog/auto_save_revision.php
@@ -0,0 +1,89 @@
+<?php
+/**
+ * Action called by AJAX periodic auto saving when editing.
+ *
+ * @package Blog
+ */
+
+$guid = get_input('guid');
+$user = elgg_get_logged_in_user_entity();
+$title = htmlspecialchars(get_input('title', '', false), ENT_QUOTES, 'UTF-8');
+$description = get_input('description');
+$excerpt = get_input('excerpt');
+
+// because get_input() doesn't use the default if the input is ''
+if (empty($excerpt)) {
+ $excerpt = $description;
+}
+
+// store errors to pass along
+$error = FALSE;
+
+if ($title && $description) {
+
+ if ($guid) {
+ $entity = get_entity($guid);
+ if (elgg_instanceof($entity, 'object', 'blog') && $entity->canEdit()) {
+ $blog = $entity;
+ } else {
+ $error = elgg_echo('blog:error:post_not_found');
+ }
+ } else {
+ $blog = new ElggBlog();
+ $blog->subtype = 'blog';
+
+ // force draft and private for autosaves.
+ $blog->status = 'unsaved_draft';
+ $blog->access_id = ACCESS_PRIVATE;
+ $blog->title = $title;
+ $blog->description = $description;
+ $blog->excerpt = elgg_get_excerpt($excerpt);
+
+ // mark this as a brand new post so we can work out the
+ // river / revision logic in the real save action.
+ $blog->new_post = TRUE;
+
+ if (!$blog->save()) {
+ $error = elgg_echo('blog:error:cannot_save');
+ }
+ }
+
+ // creat draft annotation
+ if (!$error) {
+ // annotations don't have a "time_updated" so
+ // we have to delete everything or the times are wrong.
+
+ // don't save if nothing changed
+ if ($auto_save_annotations = $blog->getAnnotations('blog_auto_save', 1)) {
+ $auto_save = $auto_save_annotations[0];
+ } else {
+ $auto_save == FALSE;
+ }
+
+ if (!$auto_save) {
+ $annotation_id = $blog->annotate('blog_auto_save', $description);
+ } elseif ($auto_save instanceof ElggAnnotation && $auto_save->value != $description) {
+ $blog->deleteAnnotations('blog_auto_save');
+ $annotation_id = $blog->annotate('blog_auto_save', $description);
+ } elseif ($auto_save instanceof ElggAnnotation && $auto_save->value == $description) {
+ // this isn't an error because we have an up to date annotation.
+ $annotation_id = $auto_save->id;
+ }
+
+ if (!$annotation_id) {
+ $error = elgg_echo('blog:error:cannot_auto_save');
+ }
+ }
+} else {
+ $error = elgg_echo('blog:error:missing:description');
+}
+
+if ($error) {
+ $json = array('success' => FALSE, 'message' => $error);
+ echo json_encode($json);
+} else {
+ $msg = elgg_echo('blog:message:saved');
+ $json = array('success' => TRUE, 'message' => $msg, 'guid' => $blog->getGUID());
+ echo json_encode($json);
+}
+exit;
diff --git a/mod/blog/actions/blog/delete.php b/mod/blog/actions/blog/delete.php
new file mode 100644
index 000000000..ca4eb8a7f
--- /dev/null
+++ b/mod/blog/actions/blog/delete.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Delete blog entity
+ *
+ * @package Blog
+ */
+
+$blog_guid = get_input('guid');
+$blog = get_entity($blog_guid);
+
+if (elgg_instanceof($blog, 'object', 'blog') && $blog->canEdit()) {
+ $container = get_entity($blog->container_guid);
+ if ($blog->delete()) {
+ system_message(elgg_echo('blog:message:deleted_post'));
+ if (elgg_instanceof($container, 'group')) {
+ forward("blog/group/$container->guid/all");
+ } else {
+ forward("blog/owner/$container->username");
+ }
+ } else {
+ register_error(elgg_echo('blog:error:cannot_delete_post'));
+ }
+} else {
+ register_error(elgg_echo('blog:error:post_not_found'));
+}
+
+forward(REFERER); \ No newline at end of file
diff --git a/mod/blog/actions/blog/save.php b/mod/blog/actions/blog/save.php
new file mode 100644
index 000000000..82a9e6c51
--- /dev/null
+++ b/mod/blog/actions/blog/save.php
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Save blog entity
+ *
+ * Can be called by clicking save button or preview button. If preview button,
+ * we automatically save as draft. The preview button is only available for
+ * non-published drafts.
+ *
+ * Drafts are saved with the access set to private.
+ *
+ * @package Blog
+ */
+
+// start a new sticky form session in case of failure
+elgg_make_sticky_form('blog');
+
+// save or preview
+$save = (bool)get_input('save');
+
+// store errors to pass along
+$error = FALSE;
+$error_forward_url = REFERER;
+$user = elgg_get_logged_in_user_entity();
+
+// edit or create a new entity
+$guid = get_input('guid');
+
+if ($guid) {
+ $entity = get_entity($guid);
+ if (elgg_instanceof($entity, 'object', 'blog') && $entity->canEdit()) {
+ $blog = $entity;
+ } else {
+ register_error(elgg_echo('blog:error:post_not_found'));
+ forward(get_input('forward', REFERER));
+ }
+
+ // save some data for revisions once we save the new edit
+ $revision_text = $blog->description;
+ $new_post = $blog->new_post;
+} else {
+ $blog = new ElggBlog();
+ $blog->subtype = 'blog';
+ $new_post = TRUE;
+}
+
+// set the previous status for the hooks to update the time_created and river entries
+$old_status = $blog->status;
+
+// set defaults and required values.
+$values = array(
+ 'title' => '',
+ 'description' => '',
+ 'status' => 'draft',
+ 'access_id' => ACCESS_DEFAULT,
+ 'comments_on' => 'On',
+ 'excerpt' => '',
+ 'tags' => '',
+ 'container_guid' => (int)get_input('container_guid'),
+);
+
+// fail if a required entity isn't set
+$required = array('title', 'description');
+
+// load from POST and do sanity and access checking
+foreach ($values as $name => $default) {
+ if ($name === 'title') {
+ $value = htmlspecialchars(get_input('title', $default, false), ENT_QUOTES, 'UTF-8');
+ } else {
+ $value = get_input($name, $default);
+ }
+
+ if (in_array($name, $required) && empty($value)) {
+ $error = elgg_echo("blog:error:missing:$name");
+ }
+
+ if ($error) {
+ break;
+ }
+
+ switch ($name) {
+ case 'tags':
+ $values[$name] = string_to_tag_array($value);
+ break;
+
+ case 'excerpt':
+ if ($value) {
+ $values[$name] = elgg_get_excerpt($value);
+ }
+ break;
+
+ case 'container_guid':
+ // this can't be empty or saving the base entity fails
+ if (!empty($value)) {
+ if (can_write_to_container($user->getGUID(), $value)) {
+ $values[$name] = $value;
+ } else {
+ $error = elgg_echo("blog:error:cannot_write_to_container");
+ }
+ } else {
+ unset($values[$name]);
+ }
+ break;
+
+ default:
+ $values[$name] = $value;
+ break;
+ }
+}
+
+// if preview, force status to be draft
+if ($save == false) {
+ $values['status'] = 'draft';
+}
+
+// if draft, set access to private and cache the future access
+if ($values['status'] == 'draft') {
+ $values['future_access'] = $values['access_id'];
+ $values['access_id'] = ACCESS_PRIVATE;
+}
+
+// assign values to the entity, stopping on error.
+if (!$error) {
+ foreach ($values as $name => $value) {
+ $blog->$name = $value;
+ }
+}
+
+// only try to save base entity if no errors
+if (!$error) {
+ if ($blog->save()) {
+ // remove sticky form entries
+ elgg_clear_sticky_form('blog');
+
+ // remove autosave draft if exists
+ $blog->deleteAnnotations('blog_auto_save');
+
+ // no longer a brand new post.
+ $blog->deleteMetadata('new_post');
+
+ // if this was an edit, create a revision annotation
+ if (!$new_post && $revision_text) {
+ $blog->annotate('blog_revision', $revision_text);
+ }
+
+ system_message(elgg_echo('blog:message:saved'));
+
+ $status = $blog->status;
+
+ // add to river if changing status or published, regardless of new post
+ // because we remove it for drafts.
+ if (($new_post || $old_status == 'draft') && $status == 'published') {
+ add_to_river('river/object/blog/create', 'create', $blog->owner_guid, $blog->getGUID());
+
+ // we only want notifications sent when post published
+ register_notification_object('object', 'blog', elgg_echo('blog:newpost'));
+ elgg_trigger_event('publish', 'object', $blog);
+
+ // reset the creation time for posts that move from draft to published
+ if ($guid) {
+ $blog->time_created = time();
+ $blog->save();
+ }
+ } elseif ($old_status == 'published' && $status == 'draft') {
+ elgg_delete_river(array(
+ 'object_guid' => $blog->guid,
+ 'action_type' => 'create',
+ ));
+ }
+
+ if ($blog->status == 'published' || $save == false) {
+ forward($blog->getURL());
+ } else {
+ forward("blog/edit/$blog->guid");
+ }
+ } else {
+ register_error(elgg_echo('blog:error:cannot_save'));
+ forward($error_forward_url);
+ }
+} else {
+ register_error($error);
+ forward($error_forward_url);
+}
diff --git a/mod/blog/actions/delete.php b/mod/blog/actions/delete.php
deleted file mode 100644
index c01ca3844..000000000
--- a/mod/blog/actions/delete.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
- /**
- * Elgg blog: delete post action
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.org/
- */
-
- // Make sure we're logged in (send us to the front page if not)
- gatekeeper();
-
- // Get input data
- $guid = (int) get_input('blogpost');
-
- // Make sure we actually have permission to edit
- $blog = get_entity($guid);
- if ($blog->getSubtype() == "blog" && $blog->canEdit()) {
-
- // Get owning user
- $owner = get_entity($blog->getOwner());
- // Delete it!
- $rowsaffected = $blog->delete();
- if ($rowsaffected > 0) {
- // Success message
- system_message(elgg_echo("blog:deleted"));
- } else {
- register_error(elgg_echo("blog:notdeleted"));
- }
- // Forward to the main blog page
- forward("mod/blog/?username=" . $owner->username);
-
- }
-
-?> \ No newline at end of file
diff --git a/mod/blog/actions/edit.php b/mod/blog/actions/edit.php
deleted file mode 100644
index b44106645..000000000
--- a/mod/blog/actions/edit.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
- /**
- * Elgg blog: edit post action
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.org/
- */
-
- // Make sure we're logged in (send us to the front page if not)
- gatekeeper();
-
- // Get input data
- $guid = (int) get_input('blogpost');
- $title = get_input('blogtitle');
- $body = get_input('blogbody');
- $access = get_input('access_id');
- $tags = get_input('blogtags');
- $comments_on = get_input('comments_select','Off');
-
- // Make sure we actually have permission to edit
- $blog = get_entity($guid);
- if ($blog->getSubtype() == "blog" && $blog->canEdit()) {
-
- // Cache to the session
-
- $_SESSION['user']->blogtitle = $title;
- $_SESSION['user']->blogbody = $body;
- $_SESSION['user']->blogtags = $tags;
-
- // Convert string of tags into a preformatted array
- $tagarray = string_to_tag_array($tags);
-
- // Make sure the title / description aren't blank
- if (empty($title) || empty($body)) {
- register_error(elgg_echo("blog:blank"));
- forward("mod/blog/add.php");
-
- // Otherwise, save the blog post
- } else {
-
- // Get owning user
- $owner = get_entity($blog->getOwner());
- // For now, set its access to public (we'll add an access dropdown shortly)
- $blog->access_id = $access;
- // Set its title and description appropriately
- $blog->title = $title;
- $blog->description = $body;
- // Before we can set metadata, we need to save the blog post
- if (!$blog->save()) {
- register_error(elgg_echo("blog:error"));
- forward("mod/blog/edit.php?blogpost=" . $guid);
- }
- // Now let's add tags. We can pass an array directly to the object property! Easy.
- $blog->clearMetadata('tags');
- if (is_array($tagarray)) {
- $blog->tags = $tagarray;
- }
-
- $blog->comments_on = $comments_on; //whether the users wants to allow comments or not on the blog post
-
- // Success message
- system_message(elgg_echo("blog:posted"));
- //add to the river
- add_to_river('river/object/blog/update','update',$_SESSION['user']->guid,$blog->guid);
- // Remove the blog post cache
- //unset($_SESSION['blogtitle']); unset($_SESSION['blogbody']); unset($_SESSION['blogtags']);
- remove_metadata($_SESSION['user']->guid,'blogtitle');
- remove_metadata($_SESSION['user']->guid,'blogbody');
- remove_metadata($_SESSION['user']->guid,'blogtags');
- // Forward to the main blog page
- $page_owner = get_entity($blog->container_guid);
- if ($page_owner instanceof ElggUser)
- $username = $page_owner->username;
- else if ($page_owner instanceof ElggGroup)
- $username = "group:" . $page_owner->guid;
- forward("pg/blog/$username");
-
- }
-
- }
-
-?>
diff --git a/mod/blog/activate.php b/mod/blog/activate.php
new file mode 100644
index 000000000..a90525291
--- /dev/null
+++ b/mod/blog/activate.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Register the ElggBlog class for the object/blog subtype
+ */
+
+if (get_subtype_id('object', 'blog')) {
+ update_subtype('object', 'blog', 'ElggBlog');
+} else {
+ add_subtype('object', 'blog', 'ElggBlog');
+}
diff --git a/mod/blog/add.php b/mod/blog/add.php
deleted file mode 100644
index cb3a3fc93..000000000
--- a/mod/blog/add.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
- /**
- * Elgg blog add entry page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
- gatekeeper();
-
- // Get the current page's owner
- $page_owner = page_owner_entity();
- if ($page_owner === false || is_null($page_owner)) {
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
- }
- if ($page_owner instanceof ElggGroup)
- $container = $page_owner->guid;
-
- //set the title
- $area1 = elgg_view_title(elgg_echo('blog:addpost'));
-
- // Get the form
- $area1 .= elgg_view("blog/forms/edit", array('container_guid' => $container));
-
- // Display page
- page_draw(elgg_echo('blog:addpost'),elgg_view_layout("edit_layout", $area1));
-
-
-?> \ No newline at end of file
diff --git a/mod/blog/archive.php b/mod/blog/archive.php
deleted file mode 100644
index a1a6a528e..000000000
--- a/mod/blog/archive.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
- /**
- * Elgg blog archive page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-
- // Get the current page's owner
- $page_owner = page_owner_entity();
- if ($page_owner === false || is_null($page_owner)) {
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
- }
-
- // Get timestamp upper and lower bounds
- $timelower = (int) get_input('param2');
- $timeupper = (int) get_input('param3');
- if (empty($timelower)) {
- forward('pg/blog/'.$page_owner->username);
- exit;
- }
- if (empty($timeupper)) {
- $timeupper = $timelower + (86400 * 30);
- }
-
- // Set blog title
- $area2 = elgg_view_title(sprintf(elgg_echo('date:month:'.date('m',$timelower)),date('Y',$timelower)));
-
- // Get a list of blog posts
- $area2 .= list_user_objects($page_owner->getGUID(),'blog',10,false,false,true,$timelower,$timeupper);
-
- // Get blog tags
-
- // Get blog categories
-
- // Display them in the page
- $body = elgg_view_layout("two_column_left_sidebar", '', $area1 . $area2);
-
- // Display page
- page_draw(sprintf(elgg_echo('blog:user'),$page_owner->name),$body);
-
-?> \ No newline at end of file
diff --git a/mod/blog/classes/ElggBlog.php b/mod/blog/classes/ElggBlog.php
new file mode 100644
index 000000000..8d4401c57
--- /dev/null
+++ b/mod/blog/classes/ElggBlog.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Extended class to override the time_created
+ *
+ * @property string $status The published status of the blog post (published, draft)
+ * @property string $comments_on Whether commenting is allowed (Off, On)
+ * @property string $excerpt An excerpt of the blog post used when displaying the post
+ */
+class ElggBlog extends ElggObject {
+
+ /**
+ * Set subtype to blog.
+ */
+ protected function initializeAttributes() {
+ parent::initializeAttributes();
+
+ $this->attributes['subtype'] = "blog";
+ }
+
+ /**
+ * Can a user comment on this blog?
+ *
+ * @see ElggObject::canComment()
+ *
+ * @param int $user_guid User guid (default is logged in user)
+ * @return bool
+ * @since 1.8.0
+ */
+ public function canComment($user_guid = 0) {
+ $result = parent::canComment($user_guid);
+ if ($result == false) {
+ return $result;
+ }
+
+ if ($this->comments_on == 'Off') {
+ return false;
+ }
+
+ return true;
+ }
+
+} \ No newline at end of file
diff --git a/mod/blog/deactivate.php b/mod/blog/deactivate.php
new file mode 100644
index 000000000..4a275fa94
--- /dev/null
+++ b/mod/blog/deactivate.php
@@ -0,0 +1,6 @@
+<?php
+/**
+ * Deregister the ElggBlog class
+ */
+
+update_subtype('object', 'blog');
diff --git a/mod/blog/edit.php b/mod/blog/edit.php
deleted file mode 100644
index fbaf79108..000000000
--- a/mod/blog/edit.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
- /**
- * Elgg blog edit entry page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
- gatekeeper();
-
- // Get the current page's owner
- $page_owner = page_owner_entity();
- if ($page_owner === false || is_null($page_owner)) {
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
- }
-
- // Get the post, if it exists
- $blogpost = (int) get_input('blogpost');
- if ($post = get_entity($blogpost)) {
-
- if ($post->canEdit()) {
-
- $area1 = elgg_view_title(elgg_echo('blog:editpost'));
- $area1 .= elgg_view("blog/forms/edit", array('entity' => $post));
- $body = elgg_view_layout("edit_layout", $area1);
-
- }
-
- }
-
- // Display page
- page_draw(sprintf(elgg_echo('blog:editpost'),$post->title),$body);
-
-?> \ No newline at end of file
diff --git a/mod/blog/everyone.php b/mod/blog/everyone.php
deleted file mode 100644
index 47d22f35b..000000000
--- a/mod/blog/everyone.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
- /**
- * Elgg view all blog posts from all users page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- define('everyoneblog','true');
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-
-// Get the current page's owner
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
-
- $area2 = elgg_view_title(elgg_echo('blog:everyone'));
-
- $area2 .= "<div id='blogs'>" . elgg_list_entities(array('type' => 'object', 'subtype' => 'blog', 'limit' => 10, 'full_view' => FALSE)) . "<div class='clearfloat'></div></div>";
-
- // get tagcloud
- // $area3 = "This will be a tagcloud for all blog posts";
-
- // Get categories, if they're installed
- global $CONFIG;
- $area3 = elgg_view('blog/categorylist',array('baseurl' => $CONFIG->wwwroot . 'search/?subtype=blog&tagtype=universal_categories&tag=','subtype' => 'blog'));
-
- $body = elgg_view_layout("two_column_left_sidebar", '', $area2, $area3);
-
- // Display page
- page_draw(elgg_echo('blog:everyone'),$body);
-
-?> \ No newline at end of file
diff --git a/mod/blog/friends.php b/mod/blog/friends.php
deleted file mode 100644
index 2cef9c9e8..000000000
--- a/mod/blog/friends.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
- /**
- * Elgg blog friends page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- define('everyoneblog','true');
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-
- // Get the current page's owner
- $page_owner = page_owner_entity();
- if ($page_owner === false || is_null($page_owner)) {
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
- }
- if (!($page_owner instanceof ElggEntity)) forward();
-
- //set the title
- if($page_owner == $_SESSION['user']){
- $title = elgg_echo('blog:yourfriends');
- }else{
- $title = $page_owner->name . "'s " . elgg_echo('blog:friends');
- }
-
- $area2 = elgg_view_title($title);
-
- // Get a list of blog posts
- $area2 .= "<div id='blogs'>" . list_user_friends_objects($page_owner->getGUID(),'blog',10,false) . "<div class='clearfloat'></div></div>";
-
- // Get categories, if they're installed
- global $CONFIG;
- $area3 = elgg_view('blog/categorylist',array('baseurl' => $CONFIG->wwwroot . 'search/?subtype=blog&owner_guid='.$page_owner->guid.'&friends='.$page_owner->guid.'&tagtype=universal_categories&tag=','subtype' => 'blog'));
-
- // Display them in the page
- $body = elgg_view_layout("two_column_left_sidebar", '', $area1 . $area2, $area3);
-
- // Display page
- page_draw($title, $body);
-
-?> \ No newline at end of file
diff --git a/mod/blog/index.php b/mod/blog/index.php
deleted file mode 100644
index 7c23e4089..000000000
--- a/mod/blog/index.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
- /**
- * Elgg blog index page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-
- // Get the current page's owner
- $page_owner = page_owner_entity();
- if ($page_owner === false || is_null($page_owner)) {
-
- // guess that logged in user is the owner - if no logged in send to all blogs page
- if (!isloggedin()) {
- forward('mod/blog/everyone.php');
- }
-
- $page_owner = $_SESSION['user'];
- set_page_owner($_SESSION['guid']);
- }
-
- //set blog title
- if($page_owner == $_SESSION['user']){
- $area2 = elgg_view_title(elgg_echo('blog:your'));
- }else{
- //$area1 = elgg_view_title($page_owner->username . "'s " . elgg_echo('blog'));
- }
-
- // Get a list of blog posts
- $area2 .= "<div id=\"blogs\">";
- $area2 .= elgg_list_entities(array('type' => 'object', 'subtype' => 'blog', 'container_guid' => page_owner(), 'limit' => 10, 'full_view' => FALSE, 'view_type_toggle' => FALSE));
- $area2 .= "<div class='clearfloat'></div></div>";
-
- // Get blog tags
-
- // Get categories, if they're installed
- global $CONFIG;
- $area3 = elgg_view('blog/categorylist',array('baseurl' => $CONFIG->wwwroot . 'search/?subtype=blog&owner_guid='.$page_owner->guid.'&tagtype=universal_categories&tag=','subtype' => 'blog', 'owner_guid' => $page_owner->guid));
-
- // Display them in the page
- $body = elgg_view_layout("two_column_left_sidebar", '', $area1 . $area2, $area3);
-
- // Display page
- page_draw(sprintf(elgg_echo('blog:user'),$page_owner->name),$body);
-
-?> \ No newline at end of file
diff --git a/mod/blog/languages/en.php b/mod/blog/languages/en.php
index 9496cee00..5248a6f51 100644
--- a/mod/blog/languages/en.php
+++ b/mod/blog/languages/en.php
@@ -1,81 +1,78 @@
<?php
+/**
+ * Blog English language file.
+ *
+ */
- $english = array(
-
- /**
- * Menu items and titles
- */
-
- 'blog' => "Blog",
- 'blogs' => "Blogs",
- 'blog:user' => "%s's blog",
- 'blog:user:friends' => "%s's friends' blog",
- 'blog:your' => "Your blog",
- 'blog:posttitle' => "%s's blog: %s",
- 'blog:friends' => "Friends' blogs",
- 'blog:yourfriends' => "Your friends' latest blogs",
- 'blog:everyone' => "All site blogs",
- 'blog:newpost' => "New blog post",
- 'blog:via' => "via blog",
- 'blog:read' => "Read blog",
-
- 'blog:addpost' => "Write a blog post",
- 'blog:editpost' => "Edit blog post",
-
- 'blog:text' => "Blog text",
-
- 'blog:strapline' => "%s",
-
- 'item:object:blog' => 'Blog posts',
-
- 'blog:never' => 'never',
- 'blog:preview' => 'Preview',
-
- 'blog:draft:save' => 'Save draft',
- 'blog:draft:saved' => 'Draft last saved',
- 'blog:comments:allow' => 'Allow comments',
-
- 'blog:preview:description' => 'This is an unsaved preview of your blog post.',
- 'blog:preview:description:link' => 'To continue editing or save your post, click here.',
-
- 'blog:enableblog' => 'Enable group blog',
-
- 'blog:group' => 'Group blog',
-
- /**
- * Blog river
- **/
-
- //generic terms to use
- 'blog:river:created' => "%s wrote",
- 'blog:river:updated' => "%s updated",
- 'blog:river:posted' => "%s posted",
-
- //these get inserted into the river links to take the user to the entity
- 'blog:river:create' => "a new blog post titled",
- 'blog:river:update' => "a blog post titled",
- 'blog:river:annotate' => "a comment on this blog post",
-
-
- /**
- * Status messages
- */
-
- 'blog:posted' => "Your blog post was successfully posted.",
- 'blog:deleted' => "Your blog post was successfully deleted.",
-
- /**
- * Error messages
- */
-
- 'blog:error' => 'Something went wrong. Please try again.',
- 'blog:save:failure' => "Your blog post could not be saved. Please try again.",
- 'blog:blank' => "Sorry; you need to fill in both the title and body before you can make a post.",
- 'blog:notfound' => "Sorry; we could not find the specified blog post.",
- 'blog:notdeleted' => "Sorry; we could not delete this blog post.",
-
- );
-
- add_translation("en",$english);
+$english = array(
+ 'blog' => 'Blogs',
+ 'blog:blogs' => 'Blogs',
+ 'blog:revisions' => 'Revisions',
+ 'blog:archives' => 'Archives',
+ 'blog:blog' => 'Blog',
+ 'item:object:blog' => 'Blogs',
-?> \ No newline at end of file
+ 'blog:title:user_blogs' => '%s\'s blogs',
+ 'blog:title:all_blogs' => 'All site blogs',
+ 'blog:title:friends' => 'Friends\' blogs',
+
+ 'blog:group' => 'Group blog',
+ 'blog:enableblog' => 'Enable group blog',
+ 'blog:write' => 'Write a blog post',
+
+ // Editing
+ 'blog:add' => 'Add blog post',
+ 'blog:edit' => 'Edit blog post',
+ 'blog:excerpt' => 'Excerpt',
+ 'blog:body' => 'Body',
+ 'blog:save_status' => 'Last saved: ',
+ 'blog:never' => 'Never',
+
+ // Statuses
+ 'blog:status' => 'Status',
+ 'blog:status:draft' => 'Draft',
+ 'blog:status:published' => 'Published',
+ 'blog:status:unsaved_draft' => 'Unsaved Draft',
+
+ 'blog:revision' => 'Revision',
+ 'blog:auto_saved_revision' => 'Auto Saved Revision',
+
+ // messages
+ 'blog:message:saved' => 'Blog post saved.',
+ 'blog:error:cannot_save' => 'Cannot save blog post.',
+ 'blog:error:cannot_write_to_container' => 'Insufficient access to save blog to group.',
+ 'blog:messages:warning:draft' => 'There is an unsaved draft of this post!',
+ 'blog:edit_revision_notice' => '(Old version)',
+ 'blog:message:deleted_post' => 'Blog post deleted.',
+ 'blog:error:cannot_delete_post' => 'Cannot delete blog post.',
+ 'blog:none' => 'No blog posts',
+ 'blog:error:missing:title' => 'Please enter a blog title!',
+ 'blog:error:missing:description' => 'Please enter the body of your blog!',
+ 'blog:error:cannot_edit_post' => 'This post may not exist or you may not have permissions to edit it.',
+ 'blog:error:revision_not_found' => 'Cannot find this revision.',
+
+ // river
+ 'river:create:object:blog' => '%s published a blog post %s',
+ 'river:comment:object:blog' => '%s commented on the blog %s',
+
+ // notifications
+ 'blog:newpost' => 'A new blog post',
+ 'blog:notification' =>
+'
+%s made a new blog post.
+
+%s
+%s
+
+View and comment on the new blog post:
+%s
+',
+
+ // widget
+ 'blog:widget:description' => 'Display your latest blog posts',
+ 'blog:moreblogs' => 'More blog posts',
+ 'blog:numbertodisplay' => 'Number of blog posts to display',
+ 'blog:noblogs' => 'No blog posts'
+);
+
+add_translation('en', $english);
diff --git a/mod/blog/lib/blog.php b/mod/blog/lib/blog.php
new file mode 100644
index 000000000..9753f27a8
--- /dev/null
+++ b/mod/blog/lib/blog.php
@@ -0,0 +1,478 @@
+<?php
+/**
+ * Blog helper functions
+ *
+ * @package Blog
+ */
+
+
+/**
+ * Get page components to view a blog post.
+ *
+ * @param int $guid GUID of a blog entity.
+ * @return array
+ */
+function blog_get_page_content_read($guid = NULL) {
+
+ $return = array();
+
+ $blog = get_entity($guid);
+
+ // no header or tabs for viewing an individual blog
+ $return['filter'] = '';
+
+ if (!elgg_instanceof($blog, 'object', 'blog')) {
+ register_error(elgg_echo('noaccess'));
+ $_SESSION['last_forward_from'] = current_page_url();
+ forward('');
+ }
+
+ $return['title'] = $blog->title;
+
+ $container = $blog->getContainerEntity();
+ $crumbs_title = $container->name;
+ if (elgg_instanceof($container, 'group')) {
+ elgg_push_breadcrumb($crumbs_title, "blog/group/$container->guid/all");
+ } else {
+ elgg_push_breadcrumb($crumbs_title, "blog/owner/$container->username");
+ }
+
+ elgg_push_breadcrumb($blog->title);
+ $return['content'] = elgg_view_entity($blog, array('full_view' => true));
+ // check to see if we should allow comments
+ if ($blog->comments_on != 'Off' && $blog->status == 'published') {
+ $return['content'] .= elgg_view_comments($blog);
+ }
+
+ return $return;
+}
+
+/**
+ * Get page components to list a user's or all blogs.
+ *
+ * @param int $container_guid The GUID of the page owner or NULL for all blogs
+ * @return array
+ */
+function blog_get_page_content_list($container_guid = NULL) {
+
+ $return = array();
+
+ $return['filter_context'] = $container_guid ? 'mine' : 'all';
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'full_view' => false,
+ );
+
+ $current_user = elgg_get_logged_in_user_entity();
+
+ if ($container_guid) {
+ // access check for closed groups
+ group_gatekeeper();
+
+ $options['container_guid'] = $container_guid;
+ $container = get_entity($container_guid);
+ if (!$container) {
+
+ }
+ $return['title'] = elgg_echo('blog:title:user_blogs', array($container->name));
+
+ $crumbs_title = $container->name;
+ elgg_push_breadcrumb($crumbs_title);
+
+ if ($current_user && ($container_guid == $current_user->guid)) {
+ $return['filter_context'] = 'mine';
+ } else if (elgg_instanceof($container, 'group')) {
+ $return['filter'] = false;
+ } else {
+ // do not show button or select a tab when viewing someone else's posts
+ $return['filter_context'] = 'none';
+ }
+ } else {
+ $return['filter_context'] = 'all';
+ $return['title'] = elgg_echo('blog:title:all_blogs');
+ elgg_pop_breadcrumb();
+ elgg_push_breadcrumb(elgg_echo('blog:blogs'));
+ }
+
+ elgg_register_title_button();
+
+ // show all posts for admin or users looking at their own blogs
+ // show only published posts for other users.
+ $show_only_published = true;
+ if ($current_user) {
+ if (($current_user->guid == $container_guid) || $current_user->isAdmin()) {
+ $show_only_published = false;
+ }
+ }
+ if ($show_only_published) {
+ $options['metadata_name_value_pairs'] = array(
+ array('name' => 'status', 'value' => 'published'),
+ );
+ }
+
+ $list = elgg_list_entities_from_metadata($options);
+ if (!$list) {
+ $return['content'] = elgg_echo('blog:none');
+ } else {
+ $return['content'] = $list;
+ }
+
+ return $return;
+}
+
+/**
+ * Get page components to list of the user's friends' posts.
+ *
+ * @param int $user_guid
+ * @return array
+ */
+function blog_get_page_content_friends($user_guid) {
+
+ $user = get_user($user_guid);
+ if (!$user) {
+ forward('blog/all');
+ }
+
+ $return = array();
+
+ $return['filter_context'] = 'friends';
+ $return['title'] = elgg_echo('blog:title:friends');
+
+ $crumbs_title = $user->name;
+ elgg_push_breadcrumb($crumbs_title, "blog/owner/{$user->username}");
+ elgg_push_breadcrumb(elgg_echo('friends'));
+
+ elgg_register_title_button();
+
+ if (!$friends = get_user_friends($user_guid, ELGG_ENTITIES_ANY_VALUE, 0)) {
+ $return['content'] .= elgg_echo('friends:none:you');
+ return $return;
+ } else {
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'full_view' => FALSE,
+ );
+
+ foreach ($friends as $friend) {
+ $options['container_guids'][] = $friend->getGUID();
+ }
+
+ // admin / owners can see any posts
+ // everyone else can only see published posts
+ $show_only_published = true;
+ $current_user = elgg_get_logged_in_user_entity();
+ if ($current_user) {
+ if (($user_guid == $current_user->guid) || $current_user->isAdmin()) {
+ $show_only_published = false;
+ }
+ }
+ if ($show_only_published) {
+ $options['metadata_name_value_pairs'][] = array(
+ array('name' => 'status', 'value' => 'published')
+ );
+ }
+
+ $list = elgg_list_entities_from_metadata($options);
+ if (!$list) {
+ $return['content'] = elgg_echo('blog:none');
+ } else {
+ $return['content'] = $list;
+ }
+ }
+
+ return $return;
+}
+
+/**
+ * Get page components to show blogs with publish dates between $lower and $upper
+ *
+ * @param int $owner_guid The GUID of the owner of this page
+ * @param int $lower Unix timestamp
+ * @param int $upper Unix timestamp
+ * @return array
+ */
+function blog_get_page_content_archive($owner_guid, $lower = 0, $upper = 0) {
+
+ $now = time();
+
+ $owner = get_entity($owner_guid);
+ elgg_set_page_owner_guid($owner_guid);
+
+ $crumbs_title = $owner->name;
+ if (elgg_instanceof($owner, 'user')) {
+ $url = "blog/owner/{$owner->username}";
+ } else {
+ $url = "blog/group/$owner->guid/all";
+ }
+ elgg_push_breadcrumb($crumbs_title, $url);
+ elgg_push_breadcrumb(elgg_echo('blog:archives'));
+
+ if ($lower) {
+ $lower = (int)$lower;
+ }
+
+ if ($upper) {
+ $upper = (int)$upper;
+ }
+
+ $options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'full_view' => FALSE,
+ );
+
+ if ($owner_guid) {
+ $options['container_guid'] = $owner_guid;
+ }
+
+ // admin / owners can see any posts
+ // everyone else can only see published posts
+ if (!(elgg_is_admin_logged_in() || (elgg_is_logged_in() && $owner_guid == elgg_get_logged_in_user_guid()))) {
+ if ($upper > $now) {
+ $upper = $now;
+ }
+
+ $options['metadata_name_value_pairs'] = array(
+ array('name' => 'status', 'value' => 'published')
+ );
+ }
+
+ if ($lower) {
+ $options['created_time_lower'] = $lower;
+ }
+
+ if ($upper) {
+ $options['created_time_upper'] = $upper;
+ }
+
+ $list = elgg_list_entities_from_metadata($options);
+ if (!$list) {
+ $content = elgg_echo('blog:none');
+ } else {
+ $content = $list;
+ }
+
+ $title = elgg_echo('date:month:' . date('m', $lower), array(date('Y', $lower)));
+
+ return array(
+ 'content' => $content,
+ 'title' => $title,
+ 'filter' => '',
+ );
+}
+
+/**
+ * Get page components to edit/create a blog post.
+ *
+ * @param string $page 'edit' or 'new'
+ * @param int $guid GUID of blog post or container
+ * @param int $revision Annotation id for revision to edit (optional)
+ * @return array
+ */
+function blog_get_page_content_edit($page, $guid = 0, $revision = NULL) {
+
+ elgg_load_js('elgg.blog');
+
+ $return = array(
+ 'filter' => '',
+ );
+
+ $vars = array();
+ $vars['id'] = 'blog-post-edit';
+ $vars['class'] = 'elgg-form-alt';
+
+ $sidebar = '';
+ if ($page == 'edit') {
+ $blog = get_entity((int)$guid);
+
+ $title = elgg_echo('blog:edit');
+
+ if (elgg_instanceof($blog, 'object', 'blog') && $blog->canEdit()) {
+ $vars['entity'] = $blog;
+
+ $title .= ": \"$blog->title\"";
+
+ if ($revision) {
+ $revision = elgg_get_annotation_from_id((int)$revision);
+ $vars['revision'] = $revision;
+ $title .= ' ' . elgg_echo('blog:edit_revision_notice');
+
+ if (!$revision || !($revision->entity_guid == $guid)) {
+ $content = elgg_echo('blog:error:revision_not_found');
+ $return['content'] = $content;
+ $return['title'] = $title;
+ return $return;
+ }
+ }
+
+ $body_vars = blog_prepare_form_vars($blog, $revision);
+
+ elgg_push_breadcrumb($blog->title, $blog->getURL());
+ elgg_push_breadcrumb(elgg_echo('edit'));
+
+ elgg_load_js('elgg.blog');
+
+ $content = elgg_view_form('blog/save', $vars, $body_vars);
+ $sidebar = elgg_view('blog/sidebar/revisions', $vars);
+ } else {
+ $content = elgg_echo('blog:error:cannot_edit_post');
+ }
+ } else {
+ elgg_push_breadcrumb(elgg_echo('blog:add'));
+ $body_vars = blog_prepare_form_vars(null);
+
+ $title = elgg_echo('blog:add');
+ $content = elgg_view_form('blog/save', $vars, $body_vars);
+ }
+
+ $return['title'] = $title;
+ $return['content'] = $content;
+ $return['sidebar'] = $sidebar;
+ return $return;
+}
+
+/**
+ * Pull together blog variables for the save form
+ *
+ * @param ElggBlog $post
+ * @param ElggAnnotation $revision
+ * @return array
+ */
+function blog_prepare_form_vars($post = NULL, $revision = NULL) {
+
+ // input names => defaults
+ $values = array(
+ 'title' => NULL,
+ 'description' => NULL,
+ 'status' => 'published',
+ 'access_id' => ACCESS_DEFAULT,
+ 'comments_on' => 'On',
+ 'excerpt' => NULL,
+ 'tags' => NULL,
+ 'container_guid' => NULL,
+ 'guid' => NULL,
+ 'draft_warning' => '',
+ );
+
+ if ($post) {
+ foreach (array_keys($values) as $field) {
+ if (isset($post->$field)) {
+ $values[$field] = $post->$field;
+ }
+ }
+
+ if ($post->status == 'draft') {
+ $values['access_id'] = $post->future_access;
+ }
+ }
+
+ if (elgg_is_sticky_form('blog')) {
+ $sticky_values = elgg_get_sticky_values('blog');
+ foreach ($sticky_values as $key => $value) {
+ $values[$key] = $value;
+ }
+ }
+
+ elgg_clear_sticky_form('blog');
+
+ if (!$post) {
+ return $values;
+ }
+
+ // load the revision annotation if requested
+ if ($revision instanceof ElggAnnotation && $revision->entity_guid == $post->getGUID()) {
+ $values['revision'] = $revision;
+ $values['description'] = $revision->value;
+ }
+
+ // display a notice if there's an autosaved annotation
+ // and we're not editing it.
+ if ($auto_save_annotations = $post->getAnnotations('blog_auto_save', 1)) {
+ $auto_save = $auto_save_annotations[0];
+ } else {
+ $auto_save = false;
+ }
+
+ if ($auto_save && $auto_save->id != $revision->id) {
+ $values['draft_warning'] = elgg_echo('blog:messages:warning:draft');
+ }
+
+ return $values;
+}
+
+/**
+ * Forward to the new style of URLs
+ *
+ * Pre-1.7.5
+ * Group blogs page: /blog/group:<container_guid>/
+ * Group blog view: /blog/group:<container_guid>/read/<guid>/<title>
+ * 1.7.5-1.8
+ * Group blogs page: /blog/owner/group:<container_guid>/
+ * Group blog view: /blog/read/<guid>
+ *
+ *
+ * @param string $page
+ */
+function blog_url_forwarder($page) {
+
+ $viewtype = elgg_get_viewtype();
+ $qs = ($viewtype === 'default') ? "" : "?view=$viewtype";
+
+ $url = "blog/all";
+
+ // easier to work with & no notices
+ $page = array_pad($page, 4, "");
+
+ // group usernames
+ if (preg_match('~/group\:([0-9]+)/~', "/{$page[0]}/{$page[1]}/", $matches)) {
+ $guid = $matches[1];
+ $entity = get_entity($guid);
+ if (elgg_instanceof($entity, 'group')) {
+ if (!empty($page[2])) {
+ $url = "blog/view/$page[2]/";
+ } else {
+ $url = "blog/group/$guid/all";
+ }
+ register_error(elgg_echo("changebookmark"));
+ forward($url . $qs);
+ }
+ }
+
+ if (empty($page[0])) {
+ return;
+ }
+
+ // user usernames
+ $user = get_user_by_username($page[0]);
+ if (!$user) {
+ return;
+ }
+
+ if (empty($page[1])) {
+ $page[1] = 'owner';
+ }
+
+ switch ($page[1]) {
+ case "read":
+ $url = "blog/view/{$page[2]}/{$page[3]}";
+ break;
+ case "archive":
+ $url = "blog/archive/{$page[0]}/{$page[2]}/{$page[3]}";
+ break;
+ case "friends":
+ $url = "blog/friends/{$page[0]}";
+ break;
+ case "new":
+ $url = "blog/add/$user->guid";
+ break;
+ case "owner":
+ $url = "blog/owner/{$page[0]}";
+ break;
+ }
+
+ register_error(elgg_echo("changebookmark"));
+ forward($url . $qs);
+}
diff --git a/mod/blog/manifest.xml b/mod/blog/manifest.xml
index 98c22b76f..29ee1bfc8 100644
--- a/mod/blog/manifest.xml
+++ b/mod/blog/manifest.xml
@@ -1,10 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
-<plugin_manifest>
- <field key="author" value="Curverider" />
- <field key="version" value="1.7" />
- <field key="description" value="Elgg blog plugin" />
- <field key="website" value="http://www.elgg.org/" />
- <field key="copyright" value="(C) Curverider 2008-2010" />
- <field key="licence" value="GNU Public License version 2" />
- <field key="elgg_version" value="2010030101" />
+<plugin_manifest xmlns="http://www.elgg.org/plugin_manifest/1.8">
+ <name>Blog</name>
+ <author>Core developers</author>
+ <version>1.8</version>
+ <category>bundled</category>
+ <category>content</category>
+ <category>widget</category>
+ <blurb>Blog plugin</blurb>
+ <description>Adds simple blogging capabilities to your Elgg installation.</description>
+ <website>http://elgg.org/</website>
+ <copyright>See COPYRIGHT.txt</copyright>
+ <license>GNU General Public License version 2</license>
+ <requires>
+ <type>elgg_release</type>
+ <version>1.8</version>
+ </requires>
+ <activate_on_install>true</activate_on_install>
</plugin_manifest>
diff --git a/mod/blog/preview.php b/mod/blog/preview.php
deleted file mode 100644
index 88d293487..000000000
--- a/mod/blog/preview.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
- /**
- * Elgg blog: preview page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.org/
- */
-
- require_once(dirname(dirname(dirname(__FILE__))).'/engine/start.php');
-
- // Make sure we're logged in (send us to the front page if not)
- gatekeeper();
-
- // Get input data
-
- $blogpost = new stdClass;
- $blogpost->title = get_input('blogtitle');
- $blogpost->description = get_input('blogbody');
- $blogpost->tags = get_input('blogtags');
- $blogpost->access = get_input('access_id');
- $blogpost->comments_on = get_input('comments_select');
- $blogpost->time_created = time();
-
- // Convert string of tags into a preformatted array
- $blogpost->tags = string_to_tag_array($blogpost->tags);
-
- // Display it
- $area2 = elgg_view("blog/previewpane") .
- elgg_view("object/blog",array(
- 'entity' => $blogpost,
- 'entity_owner' => $_SESSION['user']->guid,
- 'comments' => false,
- 'full' => true
- ));
-
- // Set the title appropriately
- $title = sprintf(elgg_echo("blog:posttitle"),$_SESSION['user']->name,$blogpost->title);
-
- // Display through the correct canvas area
- $body = elgg_view_layout("two_column_left_sidebar", '', $area1 . $area2);
- page_draw($blogpost->title,$body);
-
-?>
diff --git a/mod/blog/read.php b/mod/blog/read.php
deleted file mode 100644
index 7be396759..000000000
--- a/mod/blog/read.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
- /**
- * Elgg read blog post page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load Elgg engine
- require_once(dirname(dirname(dirname(__FILE__))) . "/engine/start.php");
-
- // Get the specified blog post
- $post = (int) get_input('blogpost');
-
- // If we can get out the blog post ...
- if ($blogpost = get_entity($post)) {
-
- // Get any comments
- //$comments = $blogpost->getAnnotations('comments');
-
- // Set the page owner
- if ($blogpost->container_guid) {
- set_page_owner($blogpost->container_guid);
- } else {
- set_page_owner($blogpost->owner_guid);
- }
-
- // Display it
- $area2 = elgg_view_entity($blogpost, true);
- /*$area2 = elgg_view("object/blog",array(
- 'entity' => $blogpost,
- 'entity_owner' => $page_owner,
- 'comments' => $comments,
- 'full' => true
- ));
- */
- // Set the title appropriately
- $title = sprintf(elgg_echo("blog:posttitle"),$page_owner->name,$blogpost->title);
-
- // Display through the correct canvas area
- $body = elgg_view_layout("two_column_left_sidebar", '', $area1 . $area2);
-
- // If we're not allowed to see the blog post
- } else {
-
- // Display the 'post not found' page instead
- $body = elgg_view("blog/notfound");
- $title = elgg_echo("blog:notfound");
-
- }
-
- // Display page
- page_draw($title,$body);
-
-?> \ No newline at end of file
diff --git a/mod/blog/savedraft.php b/mod/blog/savedraft.php
deleted file mode 100644
index fd8197abd..000000000
--- a/mod/blog/savedraft.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
- /**
- * Elgg blog autosaver
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- // Load engine
- require_once(dirname(dirname(dirname(__FILE__))) . '/engine/start.php');
- gatekeeper();
-
- // Get input data
- $title = $_POST['blogtitle'];
- $body = $_POST['blogbody'];
- $tags = $_POST['blogtags'];
-
- $_SESSION['user']->blogtitle = $title;
- $_SESSION['user']->blogbody = $body;
- $_SESSION['user']->blogtags = $tags;
-
-?> \ No newline at end of file
diff --git a/mod/blog/start.php b/mod/blog/start.php
index 358c0f014..e724b91c2 100644
--- a/mod/blog/start.php
+++ b/mod/blog/start.php
@@ -1,283 +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 blog plugin
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- /**
- * Blog initialisation
- *
- * These parameters are required for the event API, but we won't use them:
- *
- * @param unknown_type $event
- * @param unknown_type $object_type
- * @param unknown_type $object
- */
-
- function blog_init() {
-
- // Load system configuration
- global $CONFIG;
-
- // Set up menu for logged in users
- if (isloggedin()) {
-
- add_menu(elgg_echo('blogs'), $CONFIG->wwwroot . "pg/blog/" . $_SESSION['user']->username);
-
- // And for logged out users
- } else {
- add_menu(elgg_echo('blogs'), $CONFIG->wwwroot . "mod/blog/everyone.php");
- }
-
- // Extend system CSS with our own styles, which are defined in the blog/css view
- elgg_extend_view('css','blog/css');
-
- // Extend hover-over menu
- elgg_extend_view('profile/menu/links','blog/menu');
-
- // Register a page handler, so we can have nice URLs
- register_page_handler('blog','blog_page_handler');
-
- // Register a URL handler for blog posts
- register_entity_url_handler('blog_url','object','blog');
-
- // Register this plugin's object for sending pingbacks
- register_plugin_hook('pingback:object:subtypes', 'object', 'blog_pingback_subtypes');
-
- // Register granular notification for this type
- if (is_callable('register_notification_object'))
- register_notification_object('object', 'blog', elgg_echo('blog:newpost'));
-
- // Listen to notification events and supply a more useful message
- register_plugin_hook('notify:entity:message', 'object', 'blog_notify_message');
-
-
- // Listen for new pingbacks
- register_elgg_event_handler('create', 'object', 'blog_incoming_ping');
-
- // Register entity type
- register_entity_type('object','blog');
-
- // Register an annotation handler for comments etc
- register_plugin_hook('entity:annotate', 'object', 'blog_annotate_comments');
-
- // Add group menu option
- add_group_tool_option('blog',elgg_echo('blog:enableblog'),true);
- }
-
- function blog_pagesetup() {
-
- global $CONFIG;
-
- //add submenu options
- if (get_context() == "blog") {
- $page_owner = page_owner_entity();
-
- if ((page_owner() == $_SESSION['guid'] || !page_owner()) && isloggedin()) {
- add_submenu_item(elgg_echo('blog:your'),$CONFIG->wwwroot."pg/blog/" . $_SESSION['user']->username);
- add_submenu_item(elgg_echo('blog:friends'),$CONFIG->wwwroot."pg/blog/" . $_SESSION['user']->username . "/friends/");
- add_submenu_item(elgg_echo('blog:everyone'),$CONFIG->wwwroot."mod/blog/everyone.php");
-
- } else if (page_owner()) {
- add_submenu_item(sprintf(elgg_echo('blog:user'),$page_owner->name),$CONFIG->wwwroot."pg/blog/" . $page_owner->username);
- if ($page_owner instanceof ElggUser) { // Sorry groups, this isn't for you.
- add_submenu_item(sprintf(elgg_echo('blog:user:friends'),$page_owner->name),$CONFIG->wwwroot."pg/blog/" . $page_owner->username . "/friends/");
- }
- add_submenu_item(elgg_echo('blog:everyone'),$CONFIG->wwwroot."mod/blog/everyone.php");
- } else {
- add_submenu_item(elgg_echo('blog:everyone'),$CONFIG->wwwroot."mod/blog/everyone.php");
- }
-
- if (can_write_to_container(0, page_owner()) && isloggedin())
- add_submenu_item(elgg_echo('blog:addpost'),$CONFIG->wwwroot."pg/blog/{$page_owner->username}/new/");
-
- if (!defined('everyoneblog') && page_owner()) {
-
- if ($dates = get_entity_dates('object','blog',page_owner())) {
- foreach($dates as $date) {
- $timestamplow = mktime(0,0,0,substr($date,4,2),1,substr($date,0,4));
- $timestamphigh = mktime(0,0,0,((int) substr($date,4,2)) + 1,1,substr($date,0,4));
- if (!isset($page_owner)) $page_owner = page_owner_entity();
- $link = $CONFIG->wwwroot . 'pg/blog/' . $page_owner->username . '/archive/' . $timestamplow . '/' . $timestamphigh;
- add_submenu_item(sprintf(elgg_echo('date:month:'.substr($date,4,2)),substr($date,0,4)),$link,'filter');
- }
- }
-
- }
-
- }
-
- // Group submenu
- $page_owner = page_owner_entity();
-
- if ($page_owner instanceof ElggGroup && get_context() == 'groups') {
- if($page_owner->blog_enable != "no"){
- add_submenu_item(sprintf(elgg_echo("blog:group"),$page_owner->name), $CONFIG->wwwroot . "pg/blog/" . $page_owner->username );
- }
- }
- }
-
- /**
- * Blog page handler; allows the use of fancy URLs
- *
- * @param array $page From the page_handler function
- * @return true|false Depending on success
- */
- function blog_page_handler($page) {
-
- // The first component of a blog URL is the username
- if (isset($page[0])) {
- set_input('username',$page[0]);
+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');
}
-
- // In case we have further input
- if (isset($page[2])) {
- set_input('param2',$page[2]);
+ $params = blog_get_page_content_friends($user->guid);
+ break;
+ case 'archive':
+ $user = get_user_by_username($page[1]);
+ if (!$user) {
+ forward('', '404');
}
- // In case we have further input
- if (isset($page[3])) {
- set_input('param3',$page[3]);
+ $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');
}
-
- // The second part dictates what we're doing
- if (isset($page[1])) {
- switch($page[1]) {
- case "read": set_input('blogpost',$page[2]);
- include(dirname(__FILE__) . "/read.php"); return true;
- break;
- case "archive": include(dirname(__FILE__) . "/archive.php"); return true;
- break;
- case "friends": include(dirname(__FILE__) . "/friends.php"); return true;
- break;
- case "new": include(dirname(__FILE__) . "/add.php"); return true;
- break;
-
- }
- // If the URL is just 'blog/username', or just 'blog/', load the standard blog index
+ if (!isset($page[2]) || $page[2] == 'all') {
+ $params = blog_get_page_content_list($page[1]);
} else {
- include(dirname(__FILE__) . "/index.php");
- return true;
+ $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;
-
- }
-
- /**
- * Hook into the framework and provide comments on blog entities.
- *
- * @param unknown_type $hook
- * @param unknown_type $entity_type
- * @param unknown_type $returnvalue
- * @param unknown_type $params
- * @return unknown
- */
- function blog_annotate_comments($hook, $entity_type, $returnvalue, $params)
- {
- $entity = $params['entity'];
- $full = $params['full'];
-
- if (
- ($entity instanceof ElggEntity) && // Is the right type
- ($entity->getSubtype() == 'blog') && // Is the right subtype
- ($entity->comments_on!='Off') && // Comments are enabled
- ($full) // This is the full view
- )
- {
- // Display comments
- return elgg_view_comments($entity);
- }
-
+ }
+
+ 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;
}
+ }
- /**
- * Returns a more meaningful message
- *
- * @param unknown_type $hook
- * @param unknown_type $entity_type
- * @param unknown_type $returnvalue
- * @param unknown_type $params
- */
- function blog_notify_message($hook, $entity_type, $returnvalue, $params)
- {
- $entity = $params['entity'];
- $to_entity = $params['to_entity'];
- $method = $params['method'];
- if (($entity instanceof ElggEntity) && ($entity->getSubtype() == 'blog'))
- {
- $descr = $entity->description;
- $title = $entity->title;
- if ($method == 'sms') {
- $owner = $entity->getOwnerEntity();
- return $owner->name . ' via blog: ' . $title;
- }
- if ($method == 'email') {
- $owner = $entity->getOwnerEntity();
- return $owner->name . ' via blog: ' . $title . "\n\n" . $descr . "\n\n" . $entity->getURL();
- }
+ 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]);
}
- return null;
}
+ $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);
+ }
- /**
- * Populates the ->getUrl() method for blog objects
- *
- * @param ElggEntity $blogpost Blog post entity
- * @return string Blog post URL
- */
- function blog_url($blogpost) {
-
- global $CONFIG;
- $title = $blogpost->title;
- $title = friendly_title($title);
- return $CONFIG->url . "pg/blog/" . $blogpost->getOwnerEntity()->username . "/read/" . $blogpost->getGUID() . "/" . $title;
-
- }
-
- /**
- * This function adds 'blog' to the list of objects which will be looked for pingback urls.
- *
- * @param unknown_type $hook
- * @param unknown_type $entity_type
- * @param unknown_type $returnvalue
- * @param unknown_type $params
- * @return unknown
- */
- function blog_pingback_subtypes($hook, $entity_type, $returnvalue, $params)
- {
- $returnvalue[] = 'blog';
-
- return $returnvalue;
- }
-
- /**
- * Listen to incoming pings, this parses an incoming target url - sees if its for me, and then
- * either passes it back or prevents it from being created and attaches it as an annotation to a given
- *
- * @param unknown_type $event
- * @param unknown_type $object_type
- * @param unknown_type $object
- */
- function blog_incoming_ping($event, $object_type, $object)
- {
- // TODO: Get incoming ping object, see if its a ping on a blog and if so attach it as a comment
+ 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');
}
-
- // Make sure the blog initialisation function is called on initialisation
- register_elgg_event_handler('init','system','blog_init');
- register_elgg_event_handler('pagesetup','system','blog_pagesetup');
-
- // Register actions
- global $CONFIG;
- register_action("blog/add",false,$CONFIG->pluginspath . "blog/actions/add.php");
- register_action("blog/edit",false,$CONFIG->pluginspath . "blog/actions/edit.php");
- register_action("blog/delete",false,$CONFIG->pluginspath . "blog/actions/delete.php");
-
-?> \ No newline at end of file
+
+ elgg_set_plugin_setting('upgrade_version', 1, 'blogs');
+ }
+}
diff --git a/mod/blog/views/default/blog/categorylist.php b/mod/blog/views/default/blog/categorylist.php
deleted file mode 100644
index 90403c550..000000000
--- a/mod/blog/views/default/blog/categorylist.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
- $list = elgg_view('categories/list',$vars);
- if (!empty($list)) {
-?>
-
- <div class="blog_categories">
- <?php echo $list; ?>
- </div>
-
-<?php
-
- }
-
-?> \ No newline at end of file
diff --git a/mod/blog/views/default/blog/css.php b/mod/blog/views/default/blog/css.php
index c9522c901..12ac4df2a 100644
--- a/mod/blog/views/default/blog/css.php
+++ b/mod/blog/views/default/blog/css.php
@@ -1,210 +1,14 @@
<?php
-
- /**
- * Elgg blog CSS extender
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
+/**
+ * Blog CSS
+ *
+ * @package Blog
+*/
?>
-#blogs .pagination {
- margin:5px 10px 0 10px;
- padding:5px;
- display:block;
-}
-#blogs #two_column_left_sidebar_maincontent {
- padding-bottom:10px;
-}
-
-.singleview {
- margin-top:10px;
-}
-
-.blog_post_icon {
- float:left;
- margin:3px 0 0 0;
- padding:0;
-}
-
-.blog_post h3 {
- font-size: 150%;
- margin:0 0 10px 0;
- padding:0;
-}
-
-.blog_post h3 a {
- text-decoration: none;
-}
-
-.blog_post p {
- margin: 0 0 5px 0;
-}
-
-.blog_post .strapline {
- margin: 0 0 0 35px;
- padding:0;
- color: #aaa;
- line-height:1em;
-}
-.blog_post p.tags {
- background:transparent url(<?php echo $vars['url']; ?>_graphics/icon_tag.gif) no-repeat scroll left 2px;
- margin:0 0 7px 35px;
- padding:0pt 0pt 0pt 16px;
- min-height:22px;
-}
-.blog_post .options {
- margin:0;
- padding:0;
-}
-
-.blog_post_body img[align="left"] {
- margin: 10px 10px 10px 0;
- float:left;
-}
-.blog_post_body img[align="right"] {
- margin: 10px 0 10px 10px;
- float:right;
-}
-.blog_post_body img {
- margin: 10px !important;
-}
-
-.blog-comments h3 {
- font-size: 150%;
- margin-bottom: 10px;
-}
-.blog-comment {
- margin-top: 10px;
- margin-bottom:20px;
- border-bottom: 1px solid #aaaaaa;
-}
-.blog-comment img {
- float:left;
- margin: 0 10px 0 0;
-}
-.blog-comment-menu {
- margin:0;
-}
-.blog-comment-byline {
- background: #dddddd;
- height:22px;
- padding-top:3px;
- margin:0;
-}
-.blog-comment-text {
- margin:5px 0 5px 0;
-}
-/* New blog edit column */
-#blog_edit_page {
- /* background: #bbdaf7; */
- margin-top:-10px;
-}
-#blog_edit_page #content_area_user_title h2 {
- background: none;
- border-top: none;
- margin:0 0 10px 0px;
- padding:0px 0 0 0;
-}
-#blog_edit_page #blog_edit_sidebar #content_area_user_title h2 {
- background:none;
- border-top:none;
- margin:inherit;
- padding:0 0 5px 5px;
- font-size:1.25em;
- line-height:1.2em;
-}
-#blog_edit_page #blog_edit_sidebar {
- margin:0px 0 22px 0;
- background: #dedede;
- padding:5px;
- -webkit-border-radius: 8px;
- -moz-border-radius: 8px;
- border-bottom:1px solid #cccccc;
- border-right:1px solid #cccccc;
-}
-#blog_edit_page #two_column_left_sidebar_210 {
- width:210px;
- margin:0px 0 20px 0px;
- min-height:360px;
- float:left;
- padding:0;
-}
-#blog_edit_page #two_column_left_sidebar_maincontent {
- margin:0 0px 20px 20px;
- padding:10px 20px 20px 20px;
- width:670px;
- background: #bbdaf7;
-}
-/* unsaved blog post preview */
-.blog_previewpane {
- border:1px solid #D3322A;
- background:#F7DAD8;
- padding:10px;
- margin:10px;
- -webkit-border-radius: 8px;
- -moz-border-radius: 8px;
-}
-.blog_previewpane p {
- margin:0;
-}
+/* Blog Plugin */
-#blog_edit_sidebar .publish_controls,
-#blog_edit_sidebar .blog_access,
-#blog_edit_sidebar .publish_options,
-#blog_edit_sidebar .publish_blog,
-#blog_edit_sidebar .allow_comments,
-#blog_edit_sidebar .categories {
- margin:0 5px 5px 5px;
- border-top:1px solid #cccccc;
-}
-#blog_edit_page ul {
- padding-left:0px;
- margin:5px 0 5px 0;
- list-style: none;
+/* force tinymce input height for a more useful editing / blog creation area */
+form#blog-post-edit #description_parent #description_ifr {
+ height:400px !important;
}
-#blog_edit_page p {
- margin:5px 0 5px 0;
-}
-#blog_edit_page #two_column_left_sidebar_maincontent p {
- margin:0 0 15px 0;
-}
-#blog_edit_page .publish_blog input[type="submit"] {
- font-weight: bold;
- padding:2px;
- height:auto;
-}
-#blog_edit_page .preview_button a {
- font: 12px/100% Arial, Helvetica, sans-serif;
- font-weight: bold;
- background:white;
- border: 1px solid #cccccc;
- color:#999999;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- width: auto;
- height: auto;
- padding: 3px;
- margin:1px 1px 5px 10px;
- cursor: pointer;
- float:right;
-}
-#blog_edit_page .preview_button a:hover {
- background:#4690D6;
- color:white;
- text-decoration: none;
- border: 1px solid #4690D6;
-}
-#blog_edit_page .allow_comments label {
- font-size: 100%;
-}
-
-
-
-
-
-
diff --git a/mod/blog/views/default/blog/forms/edit.php b/mod/blog/views/default/blog/forms/edit.php
deleted file mode 100644
index d3f4d7e52..000000000
--- a/mod/blog/views/default/blog/forms/edit.php
+++ /dev/null
@@ -1,200 +0,0 @@
-<?php
-
- /**
- * Elgg blog edit/add page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- *
- * @uses $vars['object'] Optionally, the blog post to edit
- */
-
- // Set title, form destination
- if (isset($vars['entity'])) {
- $title = sprintf(elgg_echo("blog:editpost"),$object->title);
- $action = "blog/edit";
- $title = $vars['entity']->title;
- $body = $vars['entity']->description;
- $tags = $vars['entity']->tags;
- if ($vars['entity']->comments_on == 'Off') {
- $comments_on = false;
- } else {
- $comments_on = true;
- }
- $access_id = $vars['entity']->access_id;
- } else {
- $title = elgg_echo("blog:addpost");
- $action = "blog/add";
- $tags = "";
- $title = "";
- $comments_on = true;
- $description = "";
- if (defined('ACCESS_DEFAULT'))
- $access_id = ACCESS_DEFAULT;
- else
- $access_id = 0;
-
- $container = $vars['container_guid'] ? elgg_view('input/hidden', array('internalname' => 'container_guid', 'value' => $vars['container_guid'])) : "";
- }
-
- // Just in case we have some cached details
- if (empty($body)) {
- $body = $vars['user']->blogbody;
- if (!empty($body)) {
- $title = $vars['user']->blogtitle;
- $tags = $vars['user']->blogtags;
- }
- }
-
- // set the required variables
-
- $title_label = elgg_echo('title');
- $title_textbox = elgg_view('input/text', array('internalname' => 'blogtitle', 'value' => $title));
- $text_label = elgg_echo('blog:text');
- $text_textarea = elgg_view('input/longtext', array('internalname' => 'blogbody', 'value' => $body));
- $tag_label = elgg_echo('tags');
- $tag_input = elgg_view('input/tags', array('internalname' => 'blogtags', 'value' => $tags));
- $access_label = elgg_echo('access');
-
- //$comments_select = elgg_view('input/checkboxes', array('internalname' => 'comments_on', 'value' => ''));
- if($comments_on)
- $comments_on_switch = "checked=\"checked\"";
- else
- $comment_on_switch = "";
-
- $access_input = elgg_view('input/access', array('internalname' => 'access_id', 'value' => $access_id));
- $submit_input = elgg_view('input/submit', array('internalname' => 'submit', 'value' => elgg_echo('publish')));
- $conversation = elgg_echo('Conversation');
- $publish = elgg_echo('publish');
- $cat = elgg_echo('categories');
- $preview = elgg_echo('blog:preview');
- $privacy = elgg_echo('access');
- $savedraft = elgg_echo('blog:draft:save');
- $draftsaved = elgg_echo('blog:draft:saved');
- $never = elgg_echo('blog:never');
- $allowcomments = elgg_echo('blog:comments:allow');
-
- // INSERT EXTRAS HERE
- $extras = elgg_view('categories',$vars);
- if (!empty($extras)) $extras = '<div id="blog_edit_sidebar">' . $extras . '</div>';
-
-?>
-
-<?php
-
- $form_body = <<<EOT
-
- <div id="two_column_left_sidebar_210">
-
- <div id="blog_edit_sidebar">
- <div id="content_area_user_title">
- <div class="preview_button"><a onclick="javascript:saveDraft(true);return true;">{$preview}</a></div>
- <h2>{$publish}</h2></div>
- <div class="publish_controls">
- <p>
- <a href="#" onclick="javascript:saveDraft(false);return false;">{$savedraft}</a>
- </p>
- </div>
- <div class="publish_options">
- <!-- <p><b>{$publish}:</b> now <a href="">edit</a></p> -->
- <p class="auto_save">{$draftsaved}: <span id="draftSavedCounter">{$never}</span></p>
- </div>
- <div class="blog_access">
- <p>{$privacy}: {$access_input}
- </p></div>
- <div class="publish_blog">
- {$submit_input}
- </div>
- </div>
-
- <div id="blog_edit_sidebar">
- <div id="content_area_user_title"><h2>{$conversation}</h2></div>
- <div class="allow_comments">
- <p><label>
- <input type="checkbox" name="comments_select" {$comments_on_switch} /> {$allowcomments}
- </label></p>
- </div>
- </div>
-
- {$extras}
-
- $container
-
- </div><!-- /two_column_left_sidebar_210 -->
-
- <!-- main content -->
- <div id="two_column_left_sidebar_maincontent">
-EOT;
-
-?>
-
-<?php
-
- if (isset($vars['entity'])) {
- $entity_hidden = elgg_view('input/hidden', array('internalname' => 'blogpost', 'value' => $vars['entity']->getGUID()));
- } else {
- $entity_hidden = '';
- }
-
- $form_body .= <<<EOT
- <p>
- <label>$title_label</label><br />
- $title_textbox
- </p>
- <p class='longtext_editarea'>
- <label>$text_label</label><br />
- $text_textarea
- </p>
- <p>
- <label>$tag_label</label><br />
- $tag_input
- </p>
- <!-- <p>
- <label>$access_label</label><br />
- $access_input
- </p> -->
- <p>
- $entity_hidden
- <!-- $submit_input -->
- </p>
- </div><div class="clearfloat"></div><!-- /two_column_left_sidebar_maincontent -->
-EOT;
-
- echo elgg_view('input/form', array('action' => "{$vars['url']}action/$action", 'body' => $form_body, 'internalid' => 'blogPostForm'));
-?>
-
-<script type="text/javascript">
- setInterval( "saveDraft(false)", 120000);
- function saveDraft(preview) {
- temppreview = preview;
-
- if (typeof(tinyMCE) != 'undefined') {
- tinyMCE.triggerSave();
- }
-
- var drafturl = "<?php echo $vars['url']; ?>mod/blog/savedraft.php";
- var temptitle = $("input[name='blogtitle']").val();
- var tempbody = $("textarea[name='blogbody']").val();
- var temptags = $("input[name='blogtags']").val();
-
- var postdata = { blogtitle: temptitle, blogbody: tempbody, blogtags: temptags };
-
- $.post(drafturl, postdata, function() {
- var d = new Date();
- var mins = d.getMinutes() + '';
- if (mins.length == 1) mins = '0' + mins;
- $("span#draftSavedCounter").html(d.getHours() + ":" + mins);
- if (temppreview == true) {
- $("form#blogPostForm").attr("action","<?php echo $vars['url']; ?>mod/blog/preview.php");
- $("input[name='submit']").click();
- //$("form#blogPostForm").submit();
- //document.blogPostForm.submit();
- }
- });
-
- }
-
-</script>
diff --git a/mod/blog/views/default/blog/gallery.php b/mod/blog/views/default/blog/gallery.php
deleted file mode 100644
index 23f0418bc..000000000
--- a/mod/blog/views/default/blog/gallery.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
- /**
- * Elgg blog listing
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- $owner = $vars['entity']->getOwnerEntity();
- $friendlytime = friendly_time($vars['entity']->time_created);
- $icon = elgg_view(
- "profile/icon", array(
- 'entity' => $owner,
- 'size' => 'small',
- )
- );
- $info = "<p>" . elgg_echo('blog') . ": <a href=\"{$vars['entity']->getURL()}\">{$vars['entity']->title}</a></p>";
- $info .= "<p><a href=\"{$owner->getURL()}\">{$owner->name}</a> {$friendlytime}</p>";
-
- //display
- echo "<div class=\"blog_gallery\">";
- echo "<div class=\"blog_gallery_icon\">" . $icon . "</div>";
- echo "<div class=\"blog_gallery_content\">" . $info . "</div>";
- echo "</div>";
-
-
-?> \ No newline at end of file
diff --git a/mod/blog/views/default/blog/group_module.php b/mod/blog/views/default/blog/group_module.php
new file mode 100644
index 000000000..6082cdafd
--- /dev/null
+++ b/mod/blog/views/default/blog/group_module.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Group blog module
+ */
+
+$group = elgg_get_page_owner_entity();
+
+if ($group->blog_enable == "no") {
+ return true;
+}
+
+$all_link = elgg_view('output/url', array(
+ 'href' => "blog/group/$group->guid/all",
+ 'text' => elgg_echo('link:view:all'),
+ 'is_trusted' => true,
+));
+
+elgg_push_context('widgets');
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'container_guid' => elgg_get_page_owner_guid(),
+ 'metadata_name_value_pairs' => array('name' => 'status', 'value' => 'published'),
+ 'limit' => 6,
+ 'full_view' => false,
+ 'pagination' => false,
+);
+$content = elgg_list_entities_from_metadata($options);
+elgg_pop_context();
+
+if (!$content) {
+ $content = '<p>' . elgg_echo('blog:none') . '</p>';
+}
+
+$new_link = elgg_view('output/url', array(
+ 'href' => "blog/add/$group->guid",
+ 'text' => elgg_echo('blog:write'),
+ 'is_trusted' => true,
+));
+
+echo elgg_view('groups/profile/module', array(
+ 'title' => elgg_echo('blog:group'),
+ 'content' => $content,
+ 'all_link' => $all_link,
+ 'add_link' => $new_link,
+));
diff --git a/mod/blog/views/default/blog/listing.php b/mod/blog/views/default/blog/listing.php
deleted file mode 100644
index b2dad2570..000000000
--- a/mod/blog/views/default/blog/listing.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
- /**
- * Elgg blog listing
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
- $owner = $vars['entity']->getOwnerEntity();
- $friendlytime = friendly_time($vars['entity']->time_created);
- $icon = elgg_view(
- "profile/icon", array(
- 'entity' => $owner,
- 'size' => 'small',
- )
- );
- $info = "<p>" . elgg_echo('blog') . ": <a href=\"{$vars['entity']->getURL()}\">{$vars['entity']->title}</a></p>";
- $info .= "<p class=\"owner_timestamp\"><a href=\"{$owner->getURL()}\">{$owner->name}</a> {$friendlytime}</p>";
- echo elgg_view_listing($icon,$info);
-
-?> \ No newline at end of file
diff --git a/mod/blog/views/default/blog/menu.php b/mod/blog/views/default/blog/menu.php
deleted file mode 100644
index 45384ae72..000000000
--- a/mod/blog/views/default/blog/menu.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
- /**
- * Elgg hoverover extender for blog
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
-?>
-
- <p class="user_menu_blog">
- <a href="<?php echo $vars['url']; ?>pg/blog/<?php echo $vars['entity']->username; ?>"><?php echo elgg_echo("blog"); ?></a>
- </p> \ No newline at end of file
diff --git a/mod/blog/views/default/blog/notfound.php b/mod/blog/views/default/blog/notfound.php
deleted file mode 100644
index 543b98374..000000000
--- a/mod/blog/views/default/blog/notfound.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
- /**
- * Elgg blog not found page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- */
-
-?>
-
- <p>
- <?php
-
- echo elgg_echo("blog:notfound");
-
- ?>
- </p> \ No newline at end of file
diff --git a/mod/blog/views/default/blog/previewpane.php b/mod/blog/views/default/blog/previewpane.php
deleted file mode 100644
index 0828c06a9..000000000
--- a/mod/blog/views/default/blog/previewpane.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<div class="blog_previewpane">
- <p>
- <?php echo elgg_echo("blog:preview:description"); ?>
- <a href="javascript:history.go(-1);"><?php echo elgg_echo("blog:preview:description:link"); ?></a>
- </p>
-</div> \ No newline at end of file
diff --git a/mod/blog/views/default/blog/sidebar.php b/mod/blog/views/default/blog/sidebar.php
new file mode 100644
index 000000000..0ae2b431c
--- /dev/null
+++ b/mod/blog/views/default/blog/sidebar.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Blog sidebar
+ *
+ * @package Blog
+ */
+
+// fetch & display latest comments
+if ($vars['page'] == 'all') {
+ echo elgg_view('page/elements/comments_block', array(
+ 'subtypes' => 'blog',
+ ));
+} elseif ($vars['page'] == 'owner') {
+ echo elgg_view('page/elements/comments_block', array(
+ 'subtypes' => 'blog',
+ 'owner_guid' => elgg_get_page_owner_guid(),
+ ));
+}
+
+// only users can have archives at present
+if ($vars['page'] == 'owner' || $vars['page'] == 'group') {
+ echo elgg_view('blog/sidebar/archives', $vars);
+}
+
+if ($vars['page'] != 'friends') {
+ echo elgg_view('page/elements/tagcloud_block', array(
+ 'subtypes' => 'blog',
+ 'owner_guid' => elgg_get_page_owner_guid(),
+ ));
+}
diff --git a/mod/blog/views/default/blog/sidebar/archives.php b/mod/blog/views/default/blog/sidebar/archives.php
new file mode 100644
index 000000000..5098e6e3e
--- /dev/null
+++ b/mod/blog/views/default/blog/sidebar/archives.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Blog archives
+ */
+
+$loggedin_user = elgg_get_logged_in_user_entity();
+$page_owner = elgg_get_page_owner_entity();
+
+if (elgg_instanceof($page_owner, 'user')) {
+ $url_segment = 'blog/archive/' . $page_owner->username;
+} else {
+ $url_segment = 'blog/group/' . $page_owner->getGUID() . '/archive';
+}
+
+// This is a limitation of the URL schema.
+if ($page_owner && $vars['page'] != 'friends') {
+ $dates = array_reverse(get_entity_dates('object', 'blog', $page_owner->getGUID()));
+
+ if ($dates) {
+ $title = elgg_echo('blog:archives');
+ $content = '<ul class="blog-archives">';
+ foreach ($dates as $date) {
+ $timestamplow = mktime(0, 0, 0, substr($date,4,2) , 1, substr($date, 0, 4));
+ $timestamphigh = mktime(0, 0, 0, ((int) substr($date, 4, 2)) + 1, 1, substr($date, 0, 4));
+
+ $link = elgg_get_site_url() . $url_segment . '/' . $timestamplow . '/' . $timestamphigh;
+ $month = elgg_echo('date:month:' . substr($date, 4, 2), array(substr($date, 0, 4)));
+ $content .= "<li><a href=\"$link\" title=\"$month\">$month</a></li>";
+ }
+ $content .= '</ul>';
+
+ echo elgg_view_module('aside', $title, $content);
+ }
+} \ No newline at end of file
diff --git a/mod/blog/views/default/blog/sidebar/revisions.php b/mod/blog/views/default/blog/sidebar/revisions.php
new file mode 100644
index 000000000..cd2e7f3d8
--- /dev/null
+++ b/mod/blog/views/default/blog/sidebar/revisions.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Blog sidebar menu showing revisions
+ *
+ * @package Blog
+ */
+
+//If editing a post, show the previous revisions and drafts.
+$blog = elgg_extract('entity', $vars, FALSE);
+
+if (elgg_instanceof($blog, 'object', 'blog') && $blog->canEdit()) {
+ $owner = $blog->getOwnerEntity();
+ $revisions = array();
+
+ $auto_save_annotations = $blog->getAnnotations('blog_auto_save', 1);
+ if ($auto_save_annotations) {
+ $revisions[] = $auto_save_annotations[0];
+ }
+
+ // count(FALSE) == 1! AHHH!!!
+ $saved_revisions = $blog->getAnnotations('blog_revision', 10, 0, 'time_created DESC');
+ if ($saved_revisions) {
+ $revision_count = count($saved_revisions);
+ } else {
+ $revision_count = 0;
+ }
+
+ $revisions = array_merge($revisions, $saved_revisions);
+
+ if ($revisions) {
+ $title = elgg_echo('blog:revisions');
+
+ $n = count($revisions);
+ $body = '<ul class="blog-revisions">';
+
+ $load_base_url = "blog/edit/{$blog->getGUID()}";
+
+ // show the "published revision"
+ if ($blog->status == 'published') {
+ $load = elgg_view('output/url', array(
+ 'href' => $load_base_url,
+ 'text' => elgg_echo('blog:status:published'),
+ 'is_trusted' => true,
+ ));
+
+ $time = "<span class='elgg-subtext'>"
+ . elgg_view_friendly_time($blog->time_created) . "</span>";
+
+ $body .= "<li>$load : $time</li>";
+ }
+
+ foreach ($revisions as $revision) {
+ $time = "<span class='elgg-subtext'>"
+ . elgg_view_friendly_time($revision->time_created) . "</span>";
+
+ if ($revision->name == 'blog_auto_save') {
+ $revision_lang = elgg_echo('blog:auto_saved_revision');
+ } else {
+ $revision_lang = elgg_echo('blog:revision') . " $n";
+ }
+ $load = elgg_view('output/url', array(
+ 'href' => "$load_base_url/$revision->id",
+ 'text' => $revision_lang,
+ 'is_trusted' => true,
+ ));
+
+ $text = "$load: $time";
+ $class = 'class="auto-saved"';
+
+ $n--;
+
+ $body .= "<li $class>$text</li>";
+ }
+
+ $body .= '</ul>';
+
+ echo elgg_view_module('aside', $title, $body);
+ }
+} \ No newline at end of file
diff --git a/mod/blog/views/default/blog/view.php b/mod/blog/views/default/blog/view.php
deleted file mode 100644
index 18841d224..000000000
--- a/mod/blog/views/default/blog/view.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
- /**
- * Elgg blog view page
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Curverider Ltd <info@elgg.com>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- *
- * @uses $vars['posts'] An array of posts to view
- */
-
- // If there are any posts to view, view them
- if (is_array($vars['posts']) && sizeof($vars['posts']) > 0) {
-
- foreach($vars['posts'] as $post) {
-
- echo elgg_view_entity($post);
-
- }
-
- }
-
-?> \ No newline at end of file
diff --git a/mod/blog/views/default/forms/blog/save.php b/mod/blog/views/default/forms/blog/save.php
new file mode 100644
index 000000000..f825acca1
--- /dev/null
+++ b/mod/blog/views/default/forms/blog/save.php
@@ -0,0 +1,166 @@
+<?php
+/**
+ * Edit blog form
+ *
+ * @package Blog
+ */
+
+$blog = get_entity($vars['guid']);
+$vars['entity'] = $blog;
+
+$draft_warning = $vars['draft_warning'];
+if ($draft_warning) {
+ $draft_warning = '<span class="mbm elgg-text-help">' . $draft_warning . '</span>';
+}
+
+$action_buttons = '';
+$delete_link = '';
+$preview_button = '';
+
+if ($vars['guid']) {
+ // add a delete button if editing
+ $delete_url = "action/blog/delete?guid={$vars['guid']}";
+ $delete_link = elgg_view('output/confirmlink', array(
+ 'href' => $delete_url,
+ 'text' => elgg_echo('delete'),
+ 'class' => 'elgg-button elgg-button-delete float-alt'
+ ));
+}
+
+// published blogs do not get the preview button
+if (!$vars['guid'] || ($blog && $blog->status != 'published')) {
+ $preview_button = elgg_view('input/submit', array(
+ 'value' => elgg_echo('preview'),
+ 'name' => 'preview',
+ 'class' => 'mls',
+ ));
+}
+
+$save_button = elgg_view('input/submit', array(
+ 'value' => elgg_echo('save'),
+ 'name' => 'save',
+));
+$action_buttons = $save_button . $preview_button . $delete_link;
+
+$title_label = elgg_echo('title');
+$title_input = elgg_view('input/text', array(
+ 'name' => 'title',
+ 'id' => 'blog_title',
+ 'value' => $vars['title']
+));
+
+$excerpt_label = elgg_echo('blog:excerpt');
+$excerpt_input = elgg_view('input/text', array(
+ 'name' => 'excerpt',
+ 'id' => 'blog_excerpt',
+ 'value' => _elgg_html_decode($vars['excerpt'])
+));
+
+$body_label = elgg_echo('blog:body');
+$body_input = elgg_view('input/longtext', array(
+ 'name' => 'description',
+ 'id' => 'blog_description',
+ 'value' => $vars['description']
+));
+
+$save_status = elgg_echo('blog:save_status');
+if ($vars['guid']) {
+ $entity = get_entity($vars['guid']);
+ $saved = date('F j, Y @ H:i', $entity->time_created);
+} else {
+ $saved = elgg_echo('blog:never');
+}
+
+$status_label = elgg_echo('blog:status');
+$status_input = elgg_view('input/dropdown', array(
+ 'name' => 'status',
+ 'id' => 'blog_status',
+ 'value' => $vars['status'],
+ 'options_values' => array(
+ 'draft' => elgg_echo('blog:status:draft'),
+ 'published' => elgg_echo('blog:status:published')
+ )
+));
+
+$comments_label = elgg_echo('comments');
+$comments_input = elgg_view('input/dropdown', array(
+ 'name' => 'comments_on',
+ 'id' => 'blog_comments_on',
+ 'value' => $vars['comments_on'],
+ 'options_values' => array('On' => elgg_echo('on'), 'Off' => elgg_echo('off'))
+));
+
+$tags_label = elgg_echo('tags');
+$tags_input = elgg_view('input/tags', array(
+ 'name' => 'tags',
+ 'id' => 'blog_tags',
+ 'value' => $vars['tags']
+));
+
+$access_label = elgg_echo('access');
+$access_input = elgg_view('input/access', array(
+ 'name' => 'access_id',
+ 'id' => 'blog_access_id',
+ 'value' => $vars['access_id']
+));
+
+$categories_input = elgg_view('input/categories', $vars);
+
+// hidden inputs
+$container_guid_input = elgg_view('input/hidden', array('name' => 'container_guid', 'value' => elgg_get_page_owner_guid()));
+$guid_input = elgg_view('input/hidden', array('name' => 'guid', 'value' => $vars['guid']));
+
+
+echo <<<___HTML
+
+$draft_warning
+
+<div>
+ <label for="blog_title">$title_label</label>
+ $title_input
+</div>
+
+<div>
+ <label for="blog_excerpt">$excerpt_label</label>
+ $excerpt_input
+</div>
+
+<div>
+ <label for="blog_description">$body_label</label>
+ $body_input
+</div>
+
+<div>
+ <label for="blog_tags">$tags_label</label>
+ $tags_input
+</div>
+
+$categories_input
+
+<div>
+ <label for="blog_comments_on">$comments_label</label>
+ $comments_input
+</div>
+
+<div>
+ <label for="blog_access_id">$access_label</label>
+ $access_input
+</div>
+
+<div>
+ <label for="blog_status">$status_label</label>
+ $status_input
+</div>
+
+<div class="elgg-foot">
+ <div class="elgg-subtext mbm">
+ $save_status <span class="blog-save-status-time">$saved</span>
+ </div>
+
+ $guid_input
+ $container_guid_input
+
+ $action_buttons
+</div>
+
+___HTML;
diff --git a/mod/blog/views/default/js/blog/save_draft.php b/mod/blog/views/default/js/blog/save_draft.php
new file mode 100644
index 000000000..8cd07ff5d
--- /dev/null
+++ b/mod/blog/views/default/js/blog/save_draft.php
@@ -0,0 +1,67 @@
+<?php
+/**
+ * Save draft through ajax
+ *
+ * @package Blog
+ */
+?>
+elgg.provide('elgg.blog');
+
+/*
+ * Attempt to save and update the input with the guid.
+ */
+elgg.blog.saveDraftCallback = function(data, textStatus, XHR) {
+ if (textStatus == 'success' && data.success == true) {
+ var form = $('form[id=blog-post-edit]');
+
+ // update the guid input element for new posts that now have a guid
+ form.find('input[name=guid]').val(data.guid);
+
+ oldDescription = form.find('textarea[name=description]').val();
+
+ var d = new Date();
+ var mins = d.getMinutes() + '';
+ if (mins.length == 1) {
+ mins = '0' + mins;
+ }
+ $(".blog-save-status-time").html(d.toLocaleDateString() + " @ " + d.getHours() + ":" + mins);
+ } else {
+ $(".blog-save-status-time").html(elgg.echo('error'));
+ }
+};
+
+elgg.blog.saveDraft = function() {
+ if (typeof(tinyMCE) != 'undefined') {
+ tinyMCE.triggerSave();
+ }
+
+ // only save on changed content
+ var form = $('form[id=blog-post-edit]');
+ var description = form.find('textarea[name=description]').val();
+ var title = form.find('input[name=title]').val();
+
+ if (!(description && title) || (description == oldDescription)) {
+ return false;
+ }
+
+ var draftURL = elgg.config.wwwroot + "action/blog/auto_save_revision";
+ var postData = form.serializeArray();
+
+ // force draft status
+ $(postData).each(function(i, e) {
+ if (e.name == 'status') {
+ e.value = 'draft';
+ }
+ });
+
+ $.post(draftURL, postData, elgg.blog.saveDraftCallback, 'json');
+};
+
+elgg.blog.init = function() {
+ // get a copy of the body to compare for auto save
+ oldDescription = $('form[id=blog-post-edit]').find('textarea[name=description]').val();
+
+ setInterval(elgg.blog.saveDraft, 60000);
+};
+
+elgg.register_hook_handler('init', 'system', elgg.blog.init); \ No newline at end of file
diff --git a/mod/blog/views/default/object/blog.php b/mod/blog/views/default/object/blog.php
index 898705911..4403a6006 100644
--- a/mod/blog/views/default/object/blog.php
+++ b/mod/blog/views/default/object/blog.php
@@ -1,150 +1,99 @@
<?php
+/**
+ * View for blog objects
+ *
+ * @package Blog
+ */
- /**
- * Elgg blog individual post view
- *
- * @package ElggBlog
- * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU Public License version 2
- * @author Ben Werdmuller <ben@curverider.co.uk>
- * @copyright Curverider Ltd 2008-2010
- * @link http://elgg.com/
- *
- * @uses $vars['entity'] Optionally, the blog post to view
- */
+$full = elgg_extract('full_view', $vars, FALSE);
+$blog = elgg_extract('entity', $vars, FALSE);
- if (isset($vars['entity'])) {
-
- //display comments link?
- if ($vars['entity']->comments_on == 'Off') {
- $comments_on = false;
- } else {
- $comments_on = true;
- }
-
- if (get_context() == "search" && $vars['entity'] instanceof ElggObject) {
-
- //display the correct layout depending on gallery or list view
- if (get_input('search_viewtype') == "gallery") {
+if (!$blog) {
+ return TRUE;
+}
- //display the gallery view
- echo elgg_view("blog/gallery",$vars);
+$owner = $blog->getOwnerEntity();
+$container = $blog->getContainerEntity();
+$categories = elgg_view('output/categories', $vars);
+$excerpt = $blog->excerpt;
+if (!$excerpt) {
+ $excerpt = elgg_get_excerpt($blog->description);
+}
- } else {
-
- echo elgg_view("blog/listing",$vars);
+$owner_icon = elgg_view_entity_icon($owner, 'tiny');
+$owner_link = elgg_view('output/url', array(
+ 'href' => "blog/owner/$owner->username",
+ 'text' => $owner->name,
+ 'is_trusted' => true,
+));
+$author_text = elgg_echo('byline', array($owner_link));
+$date = elgg_view_friendly_time($blog->time_created);
- }
+// The "on" status changes for comments, so best to check for !Off
+if ($blog->comments_on != 'Off') {
+ $comments_count = $blog->countComments();
+ //only display if there are commments
+ if ($comments_count != 0) {
+ $text = elgg_echo("comments") . " ($comments_count)";
+ $comments_link = elgg_view('output/url', array(
+ 'href' => $blog->getURL() . '#blog-comments',
+ 'text' => $text,
+ 'is_trusted' => true,
+ ));
+ } else {
+ $comments_link = '';
+ }
+} else {
+ $comments_link = '';
+}
-
- } else {
-
- if ($vars['entity'] instanceof ElggObject) {
-
- $url = $vars['entity']->getURL();
- $owner = $vars['entity']->getOwnerEntity();
- $canedit = $vars['entity']->canEdit();
-
- } else {
-
- $url = 'javascript:history.go(-1);';
- $owner = $vars['user'];
- $canedit = false;
-
- }
-?>
+$metadata = elgg_view_menu('entity', array(
+ 'entity' => $vars['entity'],
+ 'handler' => 'blog',
+ 'sort_by' => 'priority',
+ 'class' => 'elgg-menu-hz',
+));
- <div class="contentWrapper singleview">
-
- <div class="blog_post">
- <h3><a href="<?php echo $url; ?>"><?php echo $vars['entity']->title; ?></a></h3>
- <!-- display the user icon -->
- <div class="blog_post_icon">
- <?php
- echo elgg_view("profile/icon",array('entity' => $owner, 'size' => 'tiny'));
- ?>
- </div>
- <p class="strapline">
- <?php
-
- echo sprintf(elgg_echo("blog:strapline"),
- date("F j, Y",$vars['entity']->time_created)
- );
-
- ?>
- <?php echo elgg_echo('by'); ?> <a href="<?php echo $vars['url']; ?>pg/blog/<?php echo $owner->username; ?>"><?php echo $owner->name; ?></a> &nbsp;
- <!-- display the comments link -->
- <?php
- if($comments_on && $vars['entity'] instanceof ElggObject){
- //get the number of comments
- $num_comments = elgg_count_comments($vars['entity']);
- ?>
- <a href="<?php echo $url; ?>"><?php echo sprintf(elgg_echo("comments")) . " (" . $num_comments . ")"; ?></a><br />
- <?php
- }
- ?>
- </p>
- <!-- display tags -->
- <?php
-
- $tags = elgg_view('output/tags', array('tags' => $vars['entity']->tags));
- if (!empty($tags)) {
- echo '<p class="tags">' . $tags . '</p>';
- }
-
- $categories = elgg_view('categories/view', $vars);
- if (!empty($categories)) {
- echo '<p class="categories">' . $categories . '</p>';
- }
-
- ?>
- <div class="clearfloat"></div>
- <div class="blog_post_body">
+$subtitle = "$author_text $date $comments_link $categories";
- <!-- display the actual blog post -->
- <?php
-
- echo elgg_view('output/longtext',array('value' => $vars['entity']->description));
-
- ?>
- </div><div class="clearfloat"></div>
- <!-- display edit options if it is the blog post owner -->
- <p class="options">
- <?php
-
- if ($canedit) {
-
- ?>
- <a href="<?php echo $vars['url']; ?>mod/blog/edit.php?blogpost=<?php echo $vars['entity']->getGUID(); ?>"><?php echo elgg_echo("edit"); ?></a> &nbsp;
- <?php
-
- echo elgg_view("output/confirmlink", array(
- 'href' => $vars['url'] . "action/blog/delete?blogpost=" . $vars['entity']->getGUID(),
- 'text' => elgg_echo('delete'),
- 'confirm' => elgg_echo('deleteconfirm'),
- ));
-
- // Allow the menu to be extended
- echo elgg_view("editmenu",array('entity' => $vars['entity']));
-
- ?>
- <?php
- }
-
- ?>
- </p>
- </div>
- </div>
+// do not show the metadata and controls in widget view
+if (elgg_in_context('widgets')) {
+ $metadata = '';
+}
-<?php
+if ($full) {
+
+ $body = elgg_view('output/longtext', array(
+ 'value' => $blog->description,
+ 'class' => 'blog-post',
+ ));
+
+ $params = array(
+ 'entity' => $blog,
+ 'title' => false,
+ 'metadata' => $metadata,
+ 'subtitle' => $subtitle,
+ );
+ $params = $params + $vars;
+ $summary = elgg_view('object/elements/summary', $params);
+
+ echo elgg_view('object/elements/full', array(
+ 'summary' => $summary,
+ 'icon' => $owner_icon,
+ 'body' => $body,
+ ));
- // If we've been asked to display the full view
- // Now handled by annotation framework
- /*if (isset($vars['full']) && $vars['full'] == true && $comments_on == 'on' && $vars['entity'] instanceof ElggEntity) {
- echo elgg_view_comments($vars['entity']);
- }*/
-
- }
+} else {
+ // brief view
- }
+ $params = array(
+ 'entity' => $blog,
+ 'metadata' => $metadata,
+ 'subtitle' => $subtitle,
+ 'content' => $excerpt,
+ );
+ $params = $params + $vars;
+ $list_body = elgg_view('object/elements/summary', $params);
-?>
+ echo elgg_view_image_block($owner_icon, $list_body);
+}
diff --git a/mod/blog/views/default/river/object/blog/annotate.php b/mod/blog/views/default/river/object/blog/annotate.php
deleted file mode 100644
index 77b75c6d9..000000000
--- a/mod/blog/views/default/river/object/blog/annotate.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
- $statement = $vars['statement'];
- $performed_by = $statement->getSubject();
- $object = $statement->getObject();
-
- $url = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a>";
- $string = sprintf(elgg_echo("blog:river:posted"),$url) . " ";
- $string .= elgg_echo("blog:river:annotate:create") . " <a href=\"" . $object->getURL() . "\">" . $object->title . "</a>";
-
-?>
-
-<?php echo $string; ?> \ No newline at end of file
diff --git a/mod/blog/views/default/river/object/blog/create.php b/mod/blog/views/default/river/object/blog/create.php
index b5b3dc2e4..b808f1bdc 100644
--- a/mod/blog/views/default/river/object/blog/create.php
+++ b/mod/blog/views/default/river/object/blog/create.php
@@ -1,20 +1,15 @@
<?php
+/**
+ * Blog river view.
+ */
- $performed_by = get_entity($vars['item']->subject_guid); // $statement->getSubject();
- $object = get_entity($vars['item']->object_guid);
- $url = $object->getURL();
-
- $url = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a>";
- $contents = strip_tags($object->description); //strip tags from the contents to stop large images etc blowing out the river view
- $string = sprintf(elgg_echo("blog:river:created"),$url) . " ";
- $string .= elgg_echo("blog:river:create") . " <a href=\"" . $object->getURL() . "\">" . $object->title . "</a>";
- $string .= "<div class=\"river_content_display\">";
- if(strlen($contents) > 200) {
- $string .= substr($contents, 0, strpos($contents, ' ', 200)) . "...";
- }else{
- $string .= $contents;
- }
- $string .= "</div>";
-?>
+$object = $vars['item']->getObjectEntity();
-<?php echo $string; ?> \ No newline at end of file
+$excerpt = $object->excerpt ? $object->excerpt : $object->description;
+$excerpt = strip_tags($excerpt);
+$excerpt = elgg_get_excerpt($excerpt);
+
+echo elgg_view('river/elements/layout', array(
+ 'item' => $vars['item'],
+ 'message' => $excerpt,
+));
diff --git a/mod/blog/views/default/river/object/blog/update.php b/mod/blog/views/default/river/object/blog/update.php
deleted file mode 100644
index cf98afa8b..000000000
--- a/mod/blog/views/default/river/object/blog/update.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
- $performed_by = get_entity($vars['item']->subject_guid); // $statement->getSubject();
- $object = get_entity($vars['item']->object_guid);
- $url = $object->getURL();
-
- $url = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a>";
- $string = sprintf(elgg_echo("blog:river:updated"),$url) . " ";
- $string .= elgg_echo("blog:river:update") . " <a href=\"" . $object->getURL() . "\">" . $object->title . "</a>";
-
-?>
-
-<?php echo $string; ?> \ No newline at end of file
diff --git a/mod/blog/views/default/widgets/blog/content.php b/mod/blog/views/default/widgets/blog/content.php
new file mode 100644
index 000000000..330171662
--- /dev/null
+++ b/mod/blog/views/default/widgets/blog/content.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * User blog widget display view
+ */
+
+$num = $vars['entity']->num_display;
+
+$options = array(
+ 'type' => 'object',
+ 'subtype' => 'blog',
+ 'container_guid' => $vars['entity']->owner_guid,
+ 'limit' => $num,
+ 'full_view' => FALSE,
+ 'pagination' => FALSE,
+);
+$content = elgg_list_entities($options);
+
+echo $content;
+
+if ($content) {
+ $blog_url = "blog/owner/" . elgg_get_page_owner_entity()->username;
+ $more_link = elgg_view('output/url', array(
+ 'href' => $blog_url,
+ 'text' => elgg_echo('blog:moreblogs'),
+ 'is_trusted' => true,
+ ));
+ echo "<span class=\"elgg-widget-more\">$more_link</span>";
+} else {
+ echo elgg_echo('blog:noblogs');
+}
diff --git a/mod/blog/views/default/widgets/blog/edit.php b/mod/blog/views/default/widgets/blog/edit.php
new file mode 100644
index 000000000..30c3b2e73
--- /dev/null
+++ b/mod/blog/views/default/widgets/blog/edit.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * User blog widget edit view
+ */
+
+// set default value
+if (!isset($vars['entity']->num_display)) {
+ $vars['entity']->num_display = 4;
+}
+
+$params = array(
+ 'name' => 'params[num_display]',
+ 'value' => $vars['entity']->num_display,
+ 'options' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
+);
+$dropdown = elgg_view('input/dropdown', $params);
+
+?>
+<div>
+ <?php echo elgg_echo('blog:numbertodisplay'); ?>:
+ <?php echo $dropdown; ?>
+</div>