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.
@ Mariano
This only notifies the second user. user A makes the post, user B comments on that post but user A is never notified. When user A comments again than user B is notified. when user B replies user A never recieves a notification.
it also sends a notification to the users mail as well as the live notifications plugin. how can i shut it off to the mail and just have it go to the live notificatins plugin?
<?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($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()
)
);
}
//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()
)
);
new_notification(1,$cowner->guid, $user->guid, sprintf("a comentado un articulo donde tu comentaste ( {$comment_text} ) <a href=\"{$vars['url']}/pg/dashboard/#{$annotation}\">Click para ver</a>"));
}
$pinged_users[] = $commenter_guid;
}
}
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
));
}
}
@Stuart,
You're not really a code person are you ?
Did you read the part that says :-
// notify if poster wasn't owner
??
So of course -- the owner "user A is never notified" ;-)
@ Peter M
your right im learning how to code as we speek.
// notify if poster wasn't owner
refers to the person making the comment not to the person who made the wire post.
// notify if poster wasn't owner
if ($entity->owner_guid != $user->guid) {
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()
)
);
this bit of code tells the origanl "wire poster" they have a comment. your not really a coder either are you?
you'll need to retrieve the owning entity, then fetch that entity's owner - to get the original wire poster ;-)
(btw... i work fulltime in the arena of coding )
pues a mi me funciona si A es el dueño de su articulo luego EL USUARIO B comenta ese articulo notifica al usuario A pero derepente aparece C y comenta sobre el articulo del usuario A pues notifica a EL USUARIO A Y B
it works for me if A is the owner of his article says then the user B notifies the user that article but derepente A C appears and comments on the article by then notifies User A USER AND B
google translator
a: create an article
b: comment on this article
c: comment on this article
then A, B and C are reported. that B is not even a friend of C
live notify tis code is
------------------------------------------
new_notification(1,$cowner->guid, $user->guid, sprintf("to and article where you said you told ( {$comment_text} ) <a href=\"{$vars['url']}/pg/dashboard/#{$annotation}\">Click para ver</a>"));
-------------------------------------------
@ Mariano
Thank you. Is there any reason why i get a live notifications and along side messages. I looked at engine/lib/users.php and set it like so
// Turn on email and site notifications by default
set_user_notification_setting($user->getGUID(), 'email', false);
set_user_notification_setting($user->getGUID(), 'site', true);
I GOT IT!!!
<?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()
),
$live = "commented on your Zone post <a href=\"{$vars['url']}/pg/river_comments/allcomments/?guid={$entity_guid}\">click here to see it</a>"
);
}
//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()
),
$live = "commented under your comment <a href=\"{$vars['url']}/pg/river_comments/allcomments/?guid={$entity_guid}\">click here to see it</a>"
);
}
$pinged_users[] = $commenter_guid;
}
}
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
));
}
}
- Previous
- 1
- 2
- 3
- 4
- Next
You must log in to post replies.