From 707ac913339a7f07f2b561218e97bfe9c3ee336a Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Sat, 19 Jul 2014 12:36:43 +0200 Subject: [PATCH] Fixed some issues will grouped notifications / cronjob --- .../UserNotificationEditor.class.php | 3 +- .../comment/CommentDataHandler.class.php | 14 ++- .../DailyMailNotificationCronjob.class.php | 102 +++++++++++------- ...sponseOwnerUserNotificationEvent.class.php | 15 +++ ...entResponseUserNotificationEvent.class.php | 26 +++-- ...fileCommentUserNotificationEvent.class.php | 13 +++ wcfsetup/install/lang/de.xml | 22 ++-- wcfsetup/install/lang/en.xml | 18 ++-- 8 files changed, 148 insertions(+), 65 deletions(-) diff --git a/wcfsetup/install/files/lib/data/user/notification/UserNotificationEditor.class.php b/wcfsetup/install/files/lib/data/user/notification/UserNotificationEditor.class.php index 52d53d509b..37715e65d3 100644 --- a/wcfsetup/install/files/lib/data/user/notification/UserNotificationEditor.class.php +++ b/wcfsetup/install/files/lib/data/user/notification/UserNotificationEditor.class.php @@ -24,7 +24,8 @@ class UserNotificationEditor extends DatabaseObjectEditor { */ public function markAsConfirmed() { $this->update(array( - 'confirmed' => 1 + 'confirmed' => 1, + 'mailNotified' => 1 )); // delete notification_to_user assignment (mimic legacy notification system) diff --git a/wcfsetup/install/files/lib/system/comment/CommentDataHandler.class.php b/wcfsetup/install/files/lib/system/comment/CommentDataHandler.class.php index f787c3b28b..eb1960bec1 100644 --- a/wcfsetup/install/files/lib/system/comment/CommentDataHandler.class.php +++ b/wcfsetup/install/files/lib/system/comment/CommentDataHandler.class.php @@ -63,11 +63,15 @@ class CommentDataHandler extends SingletonFactory { */ public function getComment($commentID) { if (!empty($this->commentIDs)) { - $commentList = new CommentList(); - $commentList->setObjectIDs($this->commentIDs); - $commentList->readObjects(); - $this->comments = $commentList->getObjects(); - $this->commentIDs = array(); + $this->commentIDs = array_diff($this->commentIDs, array_keys($this->comments)); + + if (!empty($this->commentIDs)) { + $commentList = new CommentList(); + $commentList->setObjectIDs($this->commentIDs); + $commentList->readObjects(); + $this->comments = $commentList->getObjects(); + $this->commentIDs = array(); + } } if (isset($this->comments[$commentID])) { diff --git a/wcfsetup/install/files/lib/system/cronjob/DailyMailNotificationCronjob.class.php b/wcfsetup/install/files/lib/system/cronjob/DailyMailNotificationCronjob.class.php index 1c1ba5f847..e7dca1ef3a 100644 --- a/wcfsetup/install/files/lib/system/cronjob/DailyMailNotificationCronjob.class.php +++ b/wcfsetup/install/files/lib/system/cronjob/DailyMailNotificationCronjob.class.php @@ -2,7 +2,8 @@ namespace wcf\system\cronjob; use wcf\data\cronjob\Cronjob; use wcf\data\user\notification\event\UserNotificationEventList; -use wcf\data\user\notification\UserNotificationList; +use wcf\data\user\notification\UserNotification; +use wcf\data\user\User; use wcf\data\user\UserEditor; use wcf\data\user\UserList; use wcf\data\user\UserProfile; @@ -31,14 +32,14 @@ class DailyMailNotificationCronjob extends AbstractCronjob { // get user ids $userIDs = array(); - $sql = "SELECT DISTINCT notification_to_user.userID - FROM wcf".WCF_N."_user_notification_to_user notification_to_user, - wcf".WCF_N."_user_notification notification - WHERE notification.notificationID = notification_to_user.notificationID - AND notification_to_user.mailNotified = 0 - AND notification.time < ".(TIME_NOW - 3600 * 23); - $statement = WCF::getDB()->prepareStatement($sql, 250); - $statement->execute(); + $sql = "SELECT DISTINCT userID + FROM wcf".WCF_N."_user_notification + WHERE mailNotified = 0 + AND time < ?"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array( + TIME_NOW - 3600 * 23 + )); while ($row = $statement->fetchArray()) { $userIDs[] = $row['userID']; } @@ -52,16 +53,11 @@ class DailyMailNotificationCronjob extends AbstractCronjob { // get notifications $conditions = new PreparedStatementConditionBuilder(); - $conditions->add("notification.notificationID = notification_to_user.notificationID"); - $conditions->add("notification_to_user.userID IN (?)", array($userIDs)); - $conditions->add("notification_to_user.mailNotified = ?", array(0)); + $conditions->add("notification.userID IN (?)", array($userIDs)); + $conditions->add("notification.mailNotified = ?", array(0)); - $sql = "SELECT notification_to_user.notificationID, notification_event.eventID, - object_type.objectType, notification.objectID, - notification.additionalData, notification.authorID, - notification.time, notification_to_user.userID - FROM wcf".WCF_N."_user_notification_to_user notification_to_user, - wcf".WCF_N."_user_notification notification + $sql = "SELECT notification.*, notification_event.eventID, object_type.objectType + FROM wcf".WCF_N."_user_notification notification LEFT JOIN wcf".WCF_N."_user_notification_event notification_event ON (notification_event.eventID = notification.eventID) LEFT JOIN wcf".WCF_N."_object_type object_type @@ -75,36 +71,60 @@ class DailyMailNotificationCronjob extends AbstractCronjob { $conditions = new PreparedStatementConditionBuilder(); $conditions->add("userID IN (?)", array($userIDs)); $conditions->add("mailNotified = ?", array(0)); - $sql = "UPDATE wcf".WCF_N."_user_notification_to_user + $sql = "UPDATE wcf".WCF_N."_user_notification SET mailNotified = 1 ".$conditions; $statement2 = WCF::getDB()->prepareStatement($sql); $statement2->execute($conditions->getParameters()); // collect data - $authorIDs = $eventsToUser = $objectTypes = $eventIDs = $notificationIDs = array(); + $eventsToUser = $objectTypes = $eventIDs = $notificationObjects = array(); $availableObjectTypes = UserNotificationHandler::getInstance()->getAvailableObjectTypes(); while ($row = $statement->fetchArray()) { if (!isset($eventsToUser[$row['userID']])) $eventsToUser[$row['userID']] = array(); - $eventsToUser[$row['userID']][] = $row; + $eventsToUser[$row['userID']][] = $row['notificationID']; // cache object types if (!isset($objectTypes[$row['objectType']])) { $objectTypes[$row['objectType']] = array( - 'objectType' => $availableObjectTypes[$row['objectType']], + 'objectType' => $this->availableObjectTypes[$row['objectType']], 'objectIDs' => array(), 'objects' => array() ); } - + $objectTypes[$row['objectType']]['objectIDs'][] = $row['objectID']; $eventIDs[] = $row['eventID']; - $notificationIDs[] = $row['notificationID']; + + $notificationObjects[$row['notificationID']] = new UserNotification(null, $row); + } + + // load authors + $conditions = new PreparedStatementConditionBuilder(); + $conditions->add("notificationID IN (?)", array(array_keys($notificationObjects))); + $sql = "SELECT notificationID, authorID + FROM wcf".WCF_N."_user_notification_author + ".$conditions." + ORDER BY time ASC"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute($conditions->getParameters()); + $authorIDs = $authorToNotification = array(); + while ($row = $statement->fetchArray()) { + if (!$row['authorID']) { + continue; + } + + if (!isset($authorToNotification[$row['notificationID']])) { + $authorToNotification[$row['notificationID']] = array(); + } + $authorIDs[] = $row['authorID']; + $authorToNotification[$row['notificationID']][] = $row['authorID']; } // load authors $authors = UserProfile::getUserProfiles($authorIDs); + $unknownAuthor = new UserProfile(new User(null, array('userID' => null, 'username' => WCF::getLanguage()->get('wcf.user.guest')))); // load objects associated with each object type foreach ($objectTypes as $objectType => $objectData) { @@ -117,12 +137,6 @@ class DailyMailNotificationCronjob extends AbstractCronjob { $eventList->readObjects(); $eventObjects = $eventList->getObjects(); - // load notification objects - $notificationList = new UserNotificationList(); - $notificationList->getConditionBuilder()->add("user_notification.notificationID IN (?)", array($notificationIDs)); - $notificationList->readObjects(); - $notificationObjects = $notificationList->getObjects(); - foreach ($eventsToUser as $userID => $events) { if (!isset($users[$userID])) continue; $user = $users[$userID]; @@ -132,18 +146,32 @@ class DailyMailNotificationCronjob extends AbstractCronjob { 'user' => $user ))."\n\n"; - foreach ($events as $event) { - $className = $eventObjects[$event['eventID']]->className; - $class = new $className($eventObjects[$event['eventID']]); + foreach ($events as $notificationID) { + $notification = $notificationObjects[$notificationID]; + $className = $eventObjects[$notification->eventID]->className; + $class = new $className($eventObjects[$notification->eventID]); $class->setObject( - $notificationObjects[$event['notificationID']], - $objectTypes[$event['objectType']]['objects'][$event['objectID']], - $authors[$event['authorID']], - unserialize($event['additionalData']) + $notification, + $objectTypes[$notification->objectType]['objects'][$notification->objectID], + (isset($authors[$notification->authorID]) ? $authors[$notification->authorID] : $unknownAuthor), + $notification->additionalData, + $notification->timesTriggered ); $class->setLanguage($user->getLanguage()); + if (isset($authorToNotification[$notification->notificationID])) { + $eventAuthors = array(); + foreach ($authorToNotification[$notification->notificationID] as $userID) { + if (isset($authors[$userID])) { + $eventAuthors[$userID] = $authors[$userID]; + } + } + if (!empty($eventAuthors)) { + $class->setAuthors($eventAuthors); + } + } + if ($message != '') $message .= "\n\n"; $message .= $class->getEmailMessage('daily'); } diff --git a/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseOwnerUserNotificationEvent.class.php b/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseOwnerUserNotificationEvent.class.php index eb24bad634..8db5e47fe2 100644 --- a/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseOwnerUserNotificationEvent.class.php +++ b/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseOwnerUserNotificationEvent.class.php @@ -80,7 +80,9 @@ class UserProfileCommentResponseOwnerUserNotificationEvent extends AbstractShare * @see \wcf\system\user\notification\event\IUserNotificationEvent::getEmailMessage() */ public function getEmailMessage($notificationType = 'instant') { + $authors = array_values($this->getAuthors()); $comment = new Comment($this->userNotificationObject->commentID); + $count = count($authors); $owner = new User($comment->objectID); if ($comment->userID) { $commentAuthor = new User($comment->userID); @@ -91,6 +93,19 @@ class UserProfileCommentResponseOwnerUserNotificationEvent extends AbstractShare )); } + if ($count > 1) { + return $this->getLanguage()->getDynamicVariable('wcf.user.notification.commentResponseOwner.mail', array( + 'author' => $this->author, + 'authors' => $authors, + 'commentAuthor' => $commentAuthor, + 'count' => $count, + 'notificationType' => $notificationType, + 'others' => $count - 1, + 'owner' => $owner, + 'response' => $this->userNotificationObject + )); + } + return $this->getLanguage()->getDynamicVariable('wcf.user.notification.commentResponseOwner.mail', array( 'response' => $this->userNotificationObject, 'author' => $this->author, diff --git a/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseUserNotificationEvent.class.php b/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseUserNotificationEvent.class.php index 03c5aad3e4..e25d587a32 100644 --- a/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseUserNotificationEvent.class.php +++ b/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentResponseUserNotificationEvent.class.php @@ -50,14 +50,6 @@ class UserProfileCommentResponseUserNotificationEvent extends AbstractSharedUser public function getMessage() { $comment = CommentDataHandler::getInstance()->getComment($this->userNotificationObject->commentID); $owner = CommentDataHandler::getInstance()->getUser($comment->objectID); - if ($comment->userID) { - $commentAuthor = CommentDataHandler::getInstance()->getUser($comment->userID); - } - else { - $commentAuthor = new User(null, array( - 'username' => $comment->username - )); - } $authors = array_values($this->getAuthors()); $count = count($authors); @@ -80,13 +72,27 @@ class UserProfileCommentResponseUserNotificationEvent extends AbstractSharedUser * @see \wcf\system\user\notification\event\IUserNotificationEvent::getEmailMessage() */ public function getEmailMessage($notificationType = 'instant') { + $authors = array_values($this->getAuthors()); $comment = CommentDataHandler::getInstance()->getComment($this->userNotificationObject->commentID); - $user = new User($comment->objectID); + $count = count($authors); + $owner = CommentDataHandler::getInstance()->getUser($comment->objectID); + + if ($count > 1) { + return $this->getLanguage()->getDynamicVariable('wcf.user.notification.commentResponse.mail.stacked', array( + 'author' => $this->author, + 'authors' => $authors, + 'count' => $count, + 'notificationType' => $notificationType, + 'others' => $count - 1, + 'owner' => $owner, + 'response' => $this->userNotificationObject + )); + } return $this->getLanguage()->getDynamicVariable('wcf.user.notification.commentResponse.mail', array( 'response' => $this->userNotificationObject, 'author' => $this->author, - 'owner' => $user, + 'owner' => $owner, 'notificationType' => $notificationType )); } diff --git a/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentUserNotificationEvent.class.php b/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentUserNotificationEvent.class.php index 5851a937ec..4e29a2f437 100644 --- a/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentUserNotificationEvent.class.php +++ b/wcfsetup/install/files/lib/system/user/notification/event/UserProfileCommentUserNotificationEvent.class.php @@ -61,8 +61,21 @@ class UserProfileCommentUserNotificationEvent extends AbstractUserNotificationEv * @see \wcf\system\user\notification\event\IUserNotificationEvent::getEmailMessage() */ public function getEmailMessage($notificationType = 'instant') { + $authors = array_values($this->getAuthors()); + $count = count($authors); $user = new User($this->userNotificationObject->objectID); + if ($count > 1) { + return $this->getLanguage()->getDynamicVariable('wcf.user.notification.comment.mail.stacked', array( + 'author' => $this->author, + 'authors' => $authors, + 'count' => $count, + 'others' => $count - 1, + 'owner' => $user, + 'notificationType' => $notificationType + )); + } + return $this->getLanguage()->getDynamicVariable('wcf.user.notification.comment.mail', array( 'comment' => $this->userNotificationObject, 'author' => $this->author, diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index b7a76552d3..e878c771d8 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -2907,7 +2907,7 @@ Sollten Sie sich nicht auf der Website: {@PAGE_TITLE|language} angemeldet haben, username}“ folgt Ihnen.]]> - getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$count} weiteren{/if} folgen Ihnen.]]> + getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$others} weiteren{/if} folgen Ihnen.]]> username} folgt Ihnen.]]> @@ -2945,40 +2945,50 @@ Möchten Sie diese E-Mail-Benachrichtigung in Zukunft nicht mehr erhalten, könn - getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$count} weitere{/if} haben Kommentare an Ihrer Pinnwand verfasst.]]> + getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$others} weitere{/if} haben Kommentare an Ihrer Pinnwand verfasst.]]> username}{/if}.]]> - getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$count} weiteren{/if} gefällt Ihr Kommentar an {if $owner === null}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if}.]]> + getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$others} weiteren{/if} gefällt Ihr Kommentar an {if $owner === null}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if}.]]> username} hat einen Kommentar an Ihrer Pinnwand verfasst: {if $notificationType == 'instant'} --------------------------------- {@$comment->message} --------------------------------- {/if}{link controller='User' object=$owner isEmail=true}{/link}#wall]]> + username}{if $count == 2} und {else}, {/if}{@$authors[1]->username}{if $count == 3} und {@$authors[2]->username}{/if}{else}{@$authors[0]->username} und {#$others} weitere{/if} haben Kommentare an Ihrer Pinnwand verfasst: +{link controller='User' object=$owner isEmail=true}{/link}#wall]]> username} verfasst.]]> - getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$count} weitere{/if} haben auf Ihren Kommentar an {if $owner->userID == $__wcf->getUser()->userID}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if} geantwortet.]]> + getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$others} weitere{/if} haben auf Ihren Kommentar an {if $owner->userID == $__wcf->getUser()->userID}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if} geantwortet.]]> username}{/if}.]]> - getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$count} weiteren{/if} gefällt Ihre Antwort auf einen Kommentar an {if $owner === null}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if}.]]> + getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$others} weiteren{/if} gefällt Ihre Antwort auf einen Kommentar an {if $owner === null}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if}.]]> username} hat eine Antwort zu Ihrem Kommentar an der Pinnwand von "{@$owner->username}" verfasst: {if $notificationType == 'instant'} --------------------------------- {@$response->message} --------------------------------- {/if}{link controller='User' object=$owner isEmail=true}{/link}#wall]]> + username}{if $count == 2} und {else}, {/if}{@$authors[1]->username}{if $count == 3} und {@$authors[2]->username}{/if}{else}{@$authors[0]->username} und {#$others} weitere{/if} haben auf Ihren Kommentar an {if $owner->userID == $__wcf->getUser()->userID}Ihrer Pinnwand{else}der Pinnwand von {$owner->username}{/if} geantwortet: +{link controller='User' object=$owner isEmail=true}{/link}#wall]]> username} an Ihrer Pinnwand verfasst.]]> - getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$count} weitere{/if} haben auf den Kommentar von {if $author->userID}{$author->username}{else}{$author->username}{/if} an Ihrer Pinnwand geantwortet.]]> + getAnchorTag()}{if $count == 2} und {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} und {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} und {#$others} weitere{/if} haben auf den Kommentar von {if $author->userID}{$author->username}{else}{$author->username}{/if} an Ihrer Pinnwand geantwortet.]]> username} hat eine Antwort zum Kommentar von "{@$commentAuthor->username}" an Ihrer Pinnwand verfasst: {if $notificationType == 'instant'} --------------------------------- {@$response->message} --------------------------------- +{/if}{link controller='User' object=$owner isEmail=true}{/link}#wall]]> + username}{if $count == 2} und {else}, {/if}{@$authors[1]->username}{if $count == 3} und {@$authors[2]->username}{/if}{else}{@$authors[0]->username} und {#$others} weitere{/if} haben auf den Kommentar von {$author->username} an Ihrer Pinnwand geantwortet: +{if $notificationType == 'instant'} +--------------------------------- +{@$response->message} +--------------------------------- {/if}{link controller='User' object=$owner isEmail=true}{/link}#wall]]> diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index 0d127944ed..01c8cbcbb6 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -2767,7 +2767,7 @@ You can safely ignore this email if you did not register with the website: {@PAG username}” follows you.]]> - getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$count} others{/if} follow you.]]> + getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$others} others{/if} follow you.]]> username} follows you.]]> @@ -2805,41 +2805,47 @@ If you do not want to receive further email notifications for this event, you ca - getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$count} others{/if} wrote comments on your wall.]]> + getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$others} others{/if} wrote comments on your wall.]]> username}’s wall{/if}.]]> - getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$count} others{/if} like your comment on {if $owner === null}your wall{else}{$owner->username}’s wall{/if}.]]> + getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$others} others{/if} like your comment on {if $owner === null}your wall{else}{$owner->username}’s wall{/if}.]]> username} wrote a comment on your wall: {if $notificationType == 'instant'} --------------------------------- {@$comment->message} --------------------------------- {/if}{link controller='User' object=$owner isEmail=true}#wall{/link}]]> + username}{if $count == 2} and {else}, {/if}{@$authors[1]->username}{if $count == 3} and {@$authors[2]->username}{/if}{else}{@$authors[0]->username} and {#$others} others{/if} wrote comments on your wall: +{link controller='User' object=$owner isEmail=true}#wall{/link}]]> username}’s wall.]]> - getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$count} others{/if} replied to your comment on {if $owner->userID == $__wcf->getUser()->userID}your{else}{$owner->username}’s{/if} wall.]]> + getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$others} others{/if} replied to your comment on {if $owner->userID == $__wcf->getUser()->userID}your{else}{$owner->username}’s{/if} wall.]]> username}’s wall{/if}.]]> - getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$count} others{/if} like your reply to a comment on {if $owner === null}your wall{else}{$owner->username}’s wall{/if}.]]> + getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$others} others{/if} like your reply to a comment on {if $owner === null}your wall{else}{$owner->username}’s wall{/if}.]]> username} wrote a reply to your comment on {@$owner->username}’s wall: {if $notificationType == 'instant'} --------------------------------- {@$response->message} --------------------------------- {/if}{link controller='User' object=$owner isEmail=true}{/link}#wall]]> + username}{if $count == 2} and {else}, {/if}{@$authors[1]->username}{if $count == 3} and {@$authors[2]->username}{/if}{else}{@$authors[0]->username} and {#$others} others{/if} replied to your comment on {if $owner->userID == $__wcf->getUser()->userID}your{else}{$owner->username}'s{/if} wall: +{link controller='User' object=$owner isEmail=true}{/link}#wall]]> username}’s comment on your wall.]]> - getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$count} others{/if} replied to the comment by {if $author->userID}{$author->username}{else}{$author->username}{/if} on your wall.]]> + getAnchorTag()}{if $count == 2} and {else}, {/if}{@$authors[1]->getAnchorTag()}{if $count == 3} and {@$authors[2]->getAnchorTag()}{/if}{else}{@$authors[0]->getAnchorTag()} and {#$others} others{/if} replied to the comment by {if $author->userID}{$author->username}{else}{$author->username}{/if} on your wall.]]> username} wrote a reply to {@$commentAuthor->username}’s comment on your wall: {if $notificationType == 'instant'} --------------------------------- {@$response->message} --------------------------------- {/if}{link controller='User' object=$owner isEmail=true}{/link}#wall]]> + username}{if $count == 2} and {else}, {/if}{@$authors[1]->username}{if $count == 3} and {@$authors[2]->username}{/if}{else}{@$authors[0]->username} and {#$others} others{/if} replied to the comment by {$author->username} on your wall: +{link controller='User' object=$owner isEmail=true}{/link}#wall]]> -- 2.20.1