]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
generic like this functionality added
authordave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
Sun, 21 Mar 2010 16:22:19 +0000 (16:22 +0000)
committerdave <dave@36083f99-b078-4883-b0ff-0f9b5a30f544>
Sun, 21 Mar 2010 16:22:19 +0000 (16:22 +0000)
git-svn-id: http://code.elgg.org/elgg/trunk@5456 36083f99-b078-4883-b0ff-0f9b5a30f544

actions/likes/add.php [new file with mode: 0644]
actions/likes/delete.php [new file with mode: 0644]
engine/lib/annotations.php
engine/lib/elgglib.php
languages/en.php
views/default/annotation/annotatelike.php [new file with mode: 0644]
views/default/annotation/likes.php [new file with mode: 0644]
views/default/likes/forms/edit.php [new file with mode: 0644]

diff --git a/actions/likes/add.php b/actions/likes/add.php
new file mode 100644 (file)
index 0000000..36672d3
--- /dev/null
@@ -0,0 +1,64 @@
+<?php\r
+/**\r
+ * Elgg add like action\r
+ *\r
+ * @package Elgg\r
+ * @author Curverider <curverider.co.uk>\r
+ * @link http://elgg.org/\r
+ */\r
+\r
+// Make sure we're logged in; forward to the front page if not\r
+gatekeeper();\r
+\r
+// Get input\r
+$entity_guid = (int) get_input('guid');\r
+//check to see if the user has already liked the item\r
+if(elgg_already_created_annotation($entity_guid, 'likes')){\r
+       system_message(elgg_echo("likes:alreadyliked"));\r
+       forward($_SERVER['HTTP_REFERER']);\r
+}\r
+// Let's see if we can get an entity with the specified GUID\r
+$entity = get_entity($entity_guid);\r
+if (!$entity) {\r
+       register_error(elgg_echo("likes:notfound"));\r
+       forward($_SERVER['HTTP_REFERER']);\r
+}\r
+\r
+$user = get_loggedin_user();\r
+$annotation = create_annotation($entity->guid, \r
+                                                               'likes',\r
+                                                               "likes", \r
+                                                               "", \r
+                                                               $user->guid, \r
+                                                               $entity->access_id);\r
+\r
+// tell user annotation didn't work if that is the case\r
+if (!$annotation) {\r
+       register_error(elgg_echo("likes:failure"));\r
+       forward($_SERVER['HTTP_REFERER']);\r
+}\r
+\r
+// notify if poster wasn't owner\r
+if ($entity->owner_guid != $user->guid) {\r
+                       \r
+       notify_user($entity->owner_guid,\r
+                               $user->guid,\r
+                               elgg_echo('likes:email:subject'),\r
+                               sprintf(\r
+                                       elgg_echo('likes:email:body'),\r
+                                       $entity->title,\r
+                                       $user->name,\r
+                                       $comment_text,\r
+                                       $entity->getURL(),\r
+                                       $user->name,\r
+                                       $user->getURL()\r
+                               )\r
+                       );\r
+}\r
+\r
+system_message(elgg_echo("likes:likes"));\r
+//add to river\r
+add_to_river('annotation/annotatelike','likes',$user->guid,$entity->guid, "", 0, $annotation);\r
+\r
+// Forward back to the page where the user 'liked' the object\r
+forward($_SERVER['HTTP_REFERER']);\r
diff --git a/actions/likes/delete.php b/actions/likes/delete.php
new file mode 100644 (file)
index 0000000..cbb89f6
--- /dev/null
@@ -0,0 +1,32 @@
+<?php\r
+/**\r
+ * Elgg delete like action\r
+ *\r
+ * @package Elgg\r
+ * @author Curverider <curverider.co.uk>\r
+ * @link http://elgg.org/\r
+ */\r
+\r
+// Ensure we're logged in\r
+if (!isloggedin()) {\r
+       forward();\r
+}\r
+\r
+// Make sure we can get the comment in question\r
+$annotation_id = (int) get_input('annotation_id');\r
+if ($likes = get_annotation($annotation_id)) {\r
+\r
+       $entity = get_entity($likes->entity_guid);\r
+\r
+       if ($likes->canEdit()) {\r
+               $likes->delete();\r
+               system_message(elgg_echo("likes:deleted"));\r
+               forward($entity->getURL());\r
+       }\r
+\r
+} else {\r
+       $url = "";\r
+}\r
+\r
+register_error(elgg_echo("likes:notdeleted"));\r
+forward($entity->getURL());
\ No newline at end of file
index b18475d5710737f69466d80280024c9252b3e513..b7dc1b9d30375522da4fded3b9a52678386c0c21 100644 (file)
@@ -1250,6 +1250,29 @@ function get_annotation_url($id) {
        return false;
 }
 
+/**
+ * Check to see if a user has already created an annotation on an object
+ *
+ * @param ElggEntity $entity
+ * @return true | false
+ */
+function elgg_already_created_annotation($entity_guid, $annotation_type) {
+       global $CONFIG;
+       $entity_guid = (int)$entity_guid;
+       $annotation_type = sanitise_string($annotation_type);
+       $owner_guid = get_loggedin_userid();
+       $sql = "select a.id" .
+                       " FROM {$CONFIG->dbprefix}annotations a, {$CONFIG->dbprefix}metastrings m " .
+                       " WHERE a.owner_guid={$owner_guid} AND a.entity_guid={$entity_guid} " . 
+                       " AND a.name_id=m.id AND m.string='{$annotation_type}'";
+       //get the annotation type id
+       $check_annotation = get_data_row($sql);
+       //check to see if the user has already liked
+       if($check_annotation)
+               return true;
+       else
+               return false;
+}
 
 /**
  * Register an annotation url handler.
index 7691ca5bbbf759afb4ada2172d3e03756d5a16ff..fb61b7d10fd9b71d59f96fb3a50783cf063c42b2 100644 (file)
@@ -1002,7 +1002,38 @@ function get_submenu() {
 
        return $submenu_total;
 }
-
+/**
+ * Automatically views likes and a like input relating to the given entity
+ *
+ * @param ElggEntity $entity The entity to like
+ * @return string|false The HTML (etc) for the likes, or false on failure
+ */
+function elgg_view_likes($entity){
+       if (!($entity instanceof ElggEntity)) {
+               return false;
+       }
+       if ($likes = trigger_plugin_hook('likes',$entity->getType(),array('entity' => $entity),false)) {
+               return $likes;
+       } else {
+               //display the form
+               $likes = elgg_view('likes/forms/edit',array('entity' => $entity));
+               return $likes;
+       }
+}
+/**
+ * Count the number of likes attached to an entity
+ *
+ * @param ElggEntity $entity
+ * @return int Number of likes
+ */
+function elgg_count_likes($entity) {
+       if ($likeno = trigger_plugin_hook('likes:count', $entity->getType(),
+               array('entity' => $entity), false)) {
+               return $likeno;
+       } else {
+               return count_annotations($entity->getGUID(), "", "", "likes");
+       }
+}
 
 /**
  * Automatically views comments and a comment form relating to the given entity
@@ -2901,6 +2932,8 @@ function elgg_boot() {
        // Actions
        register_action('comments/add');
        register_action('comments/delete');
+       register_action('likes/add');
+       register_action('likes/delete');
 
        elgg_view_register_simplecache('css');
        elgg_view_register_simplecache('js/friendsPickerv1');
index f51940e6e7171a74d881344877b354138c245be1..0fc4e3ba6448ef45129859d5704792eb5c63655c 100644 (file)
@@ -823,6 +823,21 @@ If you requested this click on the link below, otherwise ignore this email.
  * XML-RPC
  */
        'xmlrpc:noinputdata'    =>      "Input data missing",
+       
+/**
+ * Likes
+ **/
+       'likes:this' => 'liked this',
+       'likes:deleted' => 'Your like has been removed',
+       'likes:notdeleted' => 'There was a problem removing your like',
+       'likes:likes' => 'You now like this item',
+       'likes:failure' => 'There was a problem liking this item',
+       'likes:alreadyliked' => 'You have already liked this item',
+       'likes:notfound' => 'The item you are trying to like cannot be found',
+       'likes:likethis' => 'Like this',
+       'likes:userlikedthis' => 'user liked this',
+       'likes:userslikethis' => 'users liked this',
+       'likes:river:annotate' => 'likes',
 
 /**
  * Comments
diff --git a/views/default/annotation/annotatelike.php b/views/default/annotation/annotatelike.php
new file mode 100644 (file)
index 0000000..7c7b188
--- /dev/null
@@ -0,0 +1,11 @@
+<?php\r
+\r
+$performed_by = get_entity($vars['item']->subject_guid);\r
+$object = get_entity($vars['item']->object_guid);\r
+$url = $object->getURL();\r
+$title = $object->title;\r
\r
+$string = "<a href=\"{$performed_by->getURL()}\">{$performed_by->name}</a> ";\r
+$string .= elgg_echo("likes:river:annotate") . "  <a href=\"{$object->getURL()}\">" . $title . "</a> " . friendly_time($object->time_created);\r
+       \r
+echo $string;
\ No newline at end of file
diff --git a/views/default/annotation/likes.php b/views/default/annotation/likes.php
new file mode 100644 (file)
index 0000000..d095c82
--- /dev/null
@@ -0,0 +1,39 @@
+<?php\r
+/**\r
+ * Elgg show the user who liked the object\r
+ */\r
+\r
+$owner = get_user($vars['annotation']->owner_guid);\r
+\r
+?>\r
+<div class="elgg_likes clearfloat">\r
+       <div class="elgg_likes_icon">\r
+               <?php\r
+                       echo elgg_view("profile/icon", array(\r
+                                       'entity' => $owner,\r
+                                       'size' => 'tiny'\r
+                                       ));\r
+               ?>\r
+       </div>\r
+       \r
+       <div class="elgg_likes_details">\r
+               <?php\r
+               // if the user looking at the like listing can edit, show the delete link\r
+               if ($vars['annotation']->canEdit()) {\r
+               ?>\r
+                       <span class="delete_button">\r
+                               <?php echo elgg_view("output/confirmlink",array(\r
+                                               'href' => $vars['url'] . "action/likes/delete?annotation_id=" . $vars['annotation']->id,\r
+                                               'text' => elgg_echo('remove'),\r
+                                               'confirm' => elgg_echo('deleteconfirm')\r
+                                               ));\r
+                               ?>\r
+                       </span>\r
+               <?php\r
+                       } //end of can edit if statement\r
+               ?>\r
+               <p class="elgg_likes_owner">\r
+                       <a href="<?php echo $owner->getURL(); ?>"><?php echo $owner->name; ?></a> <?php echo elgg_echo('likes:this'); ?>\r
+               </p>\r
+       </div>\r
+</div>
\ No newline at end of file
diff --git a/views/default/likes/forms/edit.php b/views/default/likes/forms/edit.php
new file mode 100644 (file)
index 0000000..4a9bbb7
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Elgg likes add form
+ *
+ * @package Elgg
+ * @author Curverider Ltd <info@elgg.com>
+ * @link http://elgg.com/
+ *
+ * @uses $vars['entity']
+ */
+        
+if (isset($vars['entity']) && isloggedin()) { 
+       $guid = $vars['entity']->getGuid();
+       $url = elgg_add_action_tokens_to_url($vars['url'] . "action/likes/add?guid={$guid}");
+       //check to see if the user has already liked
+       if(!elgg_already_created_annotation($guid, 'likes'))
+               echo "<a href=\"{$url}\">" . elgg_echo('likes:likethis') . "</a>";              
+       //display the number of likes
+       $numoflikes = elgg_count_likes($vars['entity']);
+       if($numoflikes != 0){
+               if($numoflikes == 1)
+                       echo "<br /><a onclick=\" $('#showLikes').show('slow');\">" . elgg_count_likes($vars['entity']) . " " . elgg_echo('likes:userlikedthis') . "</a>";
+               else
+                       echo "<br /><a onclick=\" $('#showLikes').show('slow');\">" . elgg_count_likes($vars['entity']) . " " . elgg_echo('likes:userslikethis') . "</a>";
+       }
+       //show the users who liked the object
+       echo "<div id=\"showLikes\" style=\"display:none;\">";
+       echo list_annotations($vars['entity']->getGUID(),'likes');
+       echo "</div>";
+}
\ No newline at end of file