Hi All!
I'm trying to build a plugin that will notify all users that comment on any post, I attempt to do this by creating a new metadata called commenters, commenters will be an array of GUIDs of users who hv added a comment and then notify them all using the notify_user() function.
The concept worked but however whenever a new user joins the comment stream, older users start getting DOUBLE notifications i.e there GUIDs are inserted twice, below is code for my modified actions/comments/add.php
<?php
/**
* Elgg add comment action
*
* @package Elgg
* @author Curverider <curverider.co.uk>
* @link http://elgg.org/
*/
// Make sure we're logged in; forward to the front page if not
gatekeeper();
// Get input
$entity_guid = (int) get_input('entity_guid');
$comment_text = get_input('generic_comment');
// make sure comment is not empty
if (empty($comment_text)) {
register_error(elgg_echo("generic_comment:blank"));
forward($_SERVER['HTTP_REFERER']);
}
// Let's see if we can get an entity with the specified GUID
$entity = get_entity($entity_guid);
if (!$entity) {
register_error(elgg_echo("generic_comment:notfound"));
forward($_SERVER['HTTP_REFERER']);
}
$user = get_loggedin_user();
$annotation = create_annotation($entity->guid,
'generic_comment',
$comment_text,
"",
$user->guid,
$entity->access_id);
// tell user annotation posted
if (!$annotation) {
register_error(elgg_echo("generic_comment:failure"));
forward($_SERVER['HTTP_REFERER']);
}
//Notify everybody!
//create metadata to do that!
if (!$entity->commenters || !is_array($entity->commenters)){
if ($entity->owner_guid != $user->guid) {
$commenters = array();
//add owner_guid
$commenters[] = $entity->owner_guid;
//add poster's guid
$commenters[] = $user->guid;
$entity->commenters = $commenters;
}
}else{
//check if guid is inside, else add it!
if (!in_array($user->guid,$entity->commenters)){
$commenters = array();
$commenters = $entity->commenters;
$commenters[] = $user->guid;
//clean up first
//remove_metadata($entity->guid, commenters);
$entity->commenters = $commenters;
}
}
notify_user($entity->commenters,
$user->guid,
elgg_echo('generic_comment:email:subject'),
sprintf(
elgg_echo('generic_comment:email:body'),
$entity->title,
$user->name,
$comment_text,
$entity->getURL(),
$user->name,
$user->getURL()
)
);
system_message(elgg_echo("generic_comment:posted"));
//add to river
add_to_river('annotation/annotate','comment',$user->guid,$entity->guid, "", 0, $annotation);
// Forward to the entity page
forward($entity->getURL());
I'm planning to release it as a full plugin and would appreciate any help.
info@elgg.org
Security issues should be reported to security@elgg.org!
©2014 the Elgg Foundation
Elgg is a registered trademark of Thematic Networks.
Cover image by RaĆ¼l Utrera is used under Creative Commons license.
Icons by Flaticon and FontAwesome.
It will be great to also combine it with the notification plugin. So that the notification won't be going to the message instead it will be going to the new notification area.
Yeah, that's the Grand plan ;-) but first we need to debug the code i pasted above. Did you try out the code?
PHPlord,
have you made any progress with this? This is some really good work and is something Ive been looking for. keep me posted and keep up the great work!
One more thing, how can i get this to work with "river comments" plug in.
mod/river_comments/actions/comments.php
<?php
/**
* river_comments
*
* @author Pedro Prez
* @link http://community.elgg.org/pg/profile/pedroprez
* @copyright (c) Keetup 2010
* @link http://www.keetup.com/
* @license GNU General Public License (GPL) version 2
*/
// Make sure we're logged in; forward to the front page if not
if ($callback && !isloggedin()) {
echo 'loginerror';
exit;
}
gatekeeper();
// Get input
$entity_guid = (int) get_input('guid');
$comment_text = get_input('river_comment_text');
// make sure comment is not empty
if (empty($comment_text)) {
if (!$callback) {
register_error(elgg_echo("generic_comment:blank"));
forward($_SERVER['HTTP_REFERER']);
} else {
echo "<p class='comment_error'>" . elgg_echo("generic_comment:blank") . "</p>";
exit;
}
}
// Let's see if we can get an entity with the specified GUID
$entity = get_entity($entity_guid);
if (!$entity) {
if (!$callback) {
register_error(elgg_echo("generic_comment:notfound"));
forward($_SERVER['HTTP_REFERER']);
} else {
echo "<p class='comment_error'>" . elgg_echo("generic_comment:notfound") . "</p>";
exit;
}
}
$user = get_loggedin_user();
$annotation = create_annotation($entity->guid,
'generic_comment',
$comment_text,
"",
$user->guid,
$entity->access_id);
// tell user annotation posted
if (!$annotation) {
if (!$callback) {
register_error(elgg_echo("generic_comment:failure"));
forward($_SERVER['HTTP_REFERER']);
} else {
echo "<p class='comment_error'>" . elgg_echo("generic_comment:failure") . "</p>";
exit;
}
}
// notify if poster wasn't owner
if ($entity->owner_guid != $user->guid) {
notify_user($entity->owner_guid,
$user->guid,
elgg_echo('generic_comment:email:subject'),
sprintf(
elgg_echo('generic_comment:email:body'),
$entity->title,
$user->name,
$comment_text,
$entity->getURL(),
$user->name,
$user->getURL()
)
);
}
if (!$callback) {
system_message(elgg_echo("generic_comment:posted"));
// Forward to the entity page
forward($_SERVER['HTTP_REFERER']);
} else {
//Fix for elgg version minor or equal than 1.6.2
if (get_version() <= 2009072201 && $annotation) {
$annotation = get_annotations($entity_guid, '','', 'generic_comment', $comment_text, $user->guid, 1);
if (!empty($annotation)) {
$annotation = array_shift($annotation);
}
$comment = $annotation;
} else {
$comment = get_annotation($annotation);
}
if ($comment) {
$owner = get_user($comment->owner_guid);
echo elgg_view('river_comments/river_comment', array(
'owner' => $owner,
'annotation' => $comment
));
}
}
Hello Everyone,
here is what my final code looked like. But i abandoned the project because In had other pressing issues to attend to.
<?php
/**
* Elgg add comment action
*
* @package Elgg
* @author Curverider <curverider.co.uk>
* @link http://elgg.org/
*/
// Make sure we're logged in; forward to the front page if not
gatekeeper();
// Get input
$entity_guid = (int) get_input('entity_guid');
$comment_text = get_input('generic_comment');
// make sure comment is not empty
if (empty($comment_text)) {
register_error(elgg_echo("generic_comment:blank"));
forward($_SERVER['HTTP_REFERER']);
}
// Let's see if we can get an entity with the specified GUID
$entity = get_entity($entity_guid);
if (!$entity) {
register_error(elgg_echo("generic_comment:notfound"));
forward($_SERVER['HTTP_REFERER']);
}
$user = get_loggedin_user();
$annotation = create_annotation($entity->guid,
'generic_comment',
$comment_text,
"",
$user->guid,
$entity->access_id);
// tell user annotation posted
if (!$annotation) {
register_error(elgg_echo("generic_comment:failure"));
forward($_SERVER['HTTP_REFERER']);
}
// notify if poster wasn't owner
//load description
if (strlen($comment_text) > 90) {
$notice = substr($comment_text, 0, strpos($comment_text, ' ', 90)) . "... (cont'd)";
} else {
$notice = $comment_text;
}
if ($entity->owner_guid != $user->guid) {
notify_user($entity->owner_guid,
$user->guid,
elgg_echo('generic_comment:email:subject'),
sprintf(
elgg_echo('generic_comment:email:body'),
$entity->title,
$user->name,
$comment_text,
$entity->getURL(),
$user->name,
$user->getURL()
)
);
}
//Notify everybody!
//extract annotations and ping each!
//$commenters = get_annotations($entity->guid, "", "", 'generic_comment', , get_loggedin_userid(), 1);
$commenters = get_annotations($entity->guid, "", "", 'generic_comment');
$pinged_users = array('');
foreach ($commenters as $item)
{
$cowner = $item->getOwnerEntity();
$commenter_guid = $cowner->guid;
//dont notify poster and owner again!
if ($user->guid != $commenter_guid && $entity->owner_guid != $commenter_guid){
if (!in_array($commenter_guid, $pinged_users )) {
notify_user($commenter_guid,
$user->guid,
elgg_echo('generic_comment:email:subject'),
sprintf(
elgg_echo('generic_comment:email:body'),
$entity->title,
$user->name,
$comment_text,
$entity->getURL(),
$user->name,
$user->getURL()
)
);
}
$pinged_users[] = $commenter_guid;
}
}
system_message(elgg_echo("generic_comment:posted"));
//add to river
add_to_river('annotation/annotate','comment',$user->guid,$entity->guid, "", 0, $annotation);
// Forward to the entity page
forward($entity->getURL());
and ecomments ???
@phplord
Works perfectly! you are good!
@anyone
can this be integrated with "ecomments"?
and ecomments ?
new_comments.php
<?php
require_once(dirname(dirname(dirname(dirname(dirname(dirname(dirname(__FILE__))))))) . "/engine/start.php");
gatekeeper();
action_gatekeeper();
$value = get_input('value');
$entity_guid = (int)get_input('entity_guid');
$entity = get_entity($entity_guid);
$user = get_loggedin_user();
if ($entity instanceof ElggObject) {
if ($entity->getSubtype() == 'groupforumtopic') {
$annotation_type = 'group_topic_post';
} else {
$annotation_type = 'generic_comment';
}
create_annotation($entity->getGUID(), $annotation_type, $value, '', get_loggedin_userid(), $entity->access_id);
new_notification(1,$entity->owner_guid, $user->guid, sprintf("a comentado uno de tus articulos ( {$value} ) <a href=\"{$vars['url']}/pg/dashboard/#{$entity_guid}\">Click para ver</a>"));
}
die();
?>
@stuartsloan might want to try this hook
<?php
if(is_plugin_enabled('eComments')){
echo elgg_view('eComments/river/bar', $vars);
}
?>
- Previous
- 1
- 2
- 3
- 4
- Next
You must log in to post replies.