Attached Files |
CategoryPostNotifications.png [^] (188,929 bytes) 2012-04-05 18:17
topic_subscription_core.patch [^] (5,774 bytes) 2012-04-11 03:46
[Show Content]
Index: kernel/application.php
===================================================================
--- kernel/application.php (revision 15252)
+++ kernel/application.php (working copy)
@@ -743,6 +743,7 @@
$this->registerClass('kHookManager', KERNEL_PATH . '/managers/hook_manager.php');
$this->registerClass('kScheduledTaskManager', KERNEL_PATH . '/managers/scheduled_task_manager.php');
$this->registerClass('kRequestManager', KERNEL_PATH . '/managers/request_manager.php');
+ $this->registerClass('kSubscriptionManager', KERNEL_PATH . '/managers/subscription_manager.php');
$this->registerClass('kUrlManager', KERNEL_PATH . '/managers/url_manager.php');
$this->registerClass('kUrlProcessor', KERNEL_PATH . '/managers/url_processor.php');
Index: kernel/managers/subscription_manager.php
===================================================================
--- kernel/managers/subscription_manager.php (revision 0)
+++ kernel/managers/subscription_manager.php (revision 0)
@@ -0,0 +1,204 @@
+<?php
+/**
+ * @version $Id$
+ * @package In-Portal
+ * @copyright Copyright (C) 1997 - 2012 Intechnic. All rights reserved.
+ * @license GNU/GPL
+ * In-Portal is Open Source software.
+ * This means that this software may have been modified pursuant
+ * the GNU General Public License, and as distributed it includes
+ * or is derivative of works licensed under the GNU General Public License
+ * or other free or open source software licenses.
+ * See http://www.in-portal.org/license for copyright notices and details.
+ */
+
+defined('FULL_PATH') or die('restricted access!');
+
+class kSubscriptionManager extends kBase {
+
+ /**
+ * List of subscriptions (instances of kSubcriptionItem objects)
+ *
+ * @var Array
+ * @access protected
+ */
+ protected $subscriptions = Array ();
+
+ /**
+ * Adds set of fields, that uniquely identifies subscription
+ *
+ * @param Array $fields
+ * @return void
+ */
+ public function add($fields)
+ {
+ $this->subscriptions[] = new kSubscriptionItem($fields);
+ }
+
+ /**
+ * Detects if current user is subscribed to new posts in given topic
+ *
+ * @return bool
+ * @access public
+ */
+ public function subscribed()
+ {
+ foreach ($this->subscriptions as $subscription) {
+ if ( !$subscription->getSubscription()->isLoaded() ) {
+ /* @var $subscription kSubscriptionItem */
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Subscribes current user to new posts in a given topic
+ *
+ * @return bool
+ * @access public
+ */
+ public function subscribe()
+ {
+ foreach ($this->subscriptions as $subscription) {
+ if ( !$subscription->subscribe() ) {
+ /* @var $subscription kSubscriptionItem */
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Unsubscribes current user from reciving e-mails about new posts in a gvein topic
+ *
+ * @return bool
+ * @access public
+ */
+ public function unsubscribe()
+ {
+ foreach ($this->subscriptions as $subscription) {
+ if ( !$subscription->unsubscribe() ) {
+ /* @var $subscription kSubscriptionItem */
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns e-mail event id or throws an exception, when such event not found
+ *
+ * @param string $email_event_name
+ * @param int $type
+ * @return string
+ * @throws Exception
+ * @access public
+ */
+ public function getEmailEventId($email_event_name, $type = EmailEvent::EVENT_TYPE_FRONTEND)
+ {
+ $sql = 'SELECT EventId
+ FROM ' . TABLE_PREFIX . 'EmailEvents
+ WHERE Event = ' . $this->Conn->qstr($email_event_name) . ' AND Type = ' . $type;
+ $id = $this->Conn->GetOne($sql);
+
+ if ( !$id ) {
+ throw new Exception('E-mail event "' . $email_event_name . '" not found');
+ }
+
+ return $id;
+ }
+}
+
+
+class kSubscriptionItem extends kBase {
+
+ /**
+ * Fields set, that uniquely identifies subscription
+ *
+ * @var Array
+ * @access protected
+ */
+ protected $fields = Array ();
+
+ /**
+ * Creates new subscription item
+ *
+ * @param Array $fields
+ * @access public
+ */
+ public function __construct($fields)
+ {
+ parent::__construct();
+
+ $this->fields = $fields;
+ }
+
+ /**
+ * Returns user subscription
+ *
+ * @param bool $reload
+ * @return kBase|kDBItem
+ * @access public
+ */
+ public function getSubscription($reload = false)
+ {
+ $special = kUtil::crc32(serialize($this->fields));
+
+ $subscription = $this->Application->recallObject('system-event-subscription.' . $special, null, Array ('skip_autoload' => true));
+ /* @var $subscription kDBItem */
+
+ if ( !$subscription->isLoaded() || $reload ) {
+ $subscription->Load($this->fields);
+ }
+
+ return $subscription;
+ }
+
+ /**
+ * Subscribes user
+ *
+ * @return bool
+ * @access public
+ */
+ public function subscribe()
+ {
+ $subscription = $this->getSubscription();
+
+ if ( $subscription->isLoaded() ) {
+ return true;
+ }
+
+ $subscription->SetDBFieldsFromHash($this->fields);
+
+ return $subscription->Create();
+ }
+
+ /**
+ * Unsubscribes user
+ *
+ * @return bool
+ * @access public
+ */
+ public function unsubscribe()
+ {
+ $subscription = $this->getSubscription();
+
+ if ( !$subscription->isLoaded() ) {
+ return true;
+ }
+
+ $temp_handler = $this->Application->recallObject($subscription->getPrefixSpecial() . '_TempHandler', 'kTempTablesHandler');
+ /* @var $temp_handler kTempTablesHandler */
+
+ $temp_handler->DeleteItems($subscription->Prefix, $subscription->Special, Array ($subscription->GetID()));
+
+ return true;
+ }
+}
\ No newline at end of file
Property changes on: kernel\managers\subscription_manager.php
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ LF
topic_subscription_modules.patch [^] (9,909 bytes) 2012-04-11 03:46
[Show Content]
Index: install/english.lang
===================================================================
--- install/english.lang (revision 15218)
+++ install/english.lang (working copy)
@@ -136,6 +136,10 @@
<SUBJECT>TmV3IFRvcGljIFJlcGx5IGhhcyBiZWVuIEFkZGVk</SUBJECT>
<HTMLBODY>TmV3IHJlcGx5IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBUb3BpYzogIDxhIGhyZWY9IjxpbnAyOmJiX1RvcGljTGluayB0ZW1wbGF0ZT0iX19kZWZhdWx0X18iLz4iPjxpbnAyOmJiX0ZpZWxkIG5hbWU9IlRvcGljVGV4dCIvPjwvYT4=</HTMLBODY>
</EVENT>
+ <EVENT Event="POST.ADD.SUB" Type="0">
+ <SUBJECT>TmV3IFJlcGx5IGhhcyBiZWVuIGFkZGVkIHRvIFRvcGljICI8aW5wMjpiYl9GaWVsZCBuYW1lPSdUb3BpY1RleHQnLz4i</SUBJECT>
+ <HTMLBODY>TmV3IHJlcGx5IGhhcyBiZWVuIGFkZGVkIHRvIDxhIGhyZWY9IjxpbnAyOmJiX1RvcGljTGluayB0ZW1wbGF0ZT0nX19kZWZhdWx0X18nLz4iPjxpbnAyOmJiX0ZpZWxkIG5hbWU9IlRvcGljVGV4dCIvPjwvYT4gdG9waWMuPGJyLz4NCjxici8+DQo8YnIvPg0KU3ViamVjdDogPGlucDI6RmllbGQgbmFtZT0iU3ViamVjdCIvPjxici8+DQpNZXNzYWdlOjxici8+DQo8aW5wMjpGaWVsZCBuYW1lPSJQb3N0aW5nVGV4dCIgbmwyYnI9IjEiLz4=</HTMLBODY>
+ </EVENT>
<EVENT Event="POST.MODIFY" Type="1">
<SUBJECT>UG9zdCBoYXMgYmVlbiBNb2RpZmllZA==</SUBJECT>
<HTMLBODY>QSBwb3N0IGhhcyBiZWVuIG1vZGlmaWVkLg==</HTMLBODY>
@@ -156,6 +160,10 @@
<SUBJECT>TmV3IFRvcGljICI8aW5wMjpiYl9GaWVsZCBuYW1lPSJUb3BpY1RleHQiLz4iIGlzIHBlbmRpbmc=</SUBJECT>
<HTMLBODY>TmV3IHRvcGljIGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgcGVuZGluZyBmb3IgeW91ciBhcHByb3ZhbC48YnI+PGJyPg0KDQpUb3BpYzogPGlucDI6YmJfRmllbGQgbmFtZT0iVG9waWNUZXh0Ii8+</HTMLBODY>
</EVENT>
+ <EVENT Event="TOPIC.ADD.SUB" Type="0">
+ <SUBJECT>TmV3IFRvcGljICI8aW5wMjpiYl9GaWVsZCBuYW1lPSdUb3BpY1RleHQnLz4iIGhhcyBiZWVuIHN1Ym1pdHRlZA==</SUBJECT>
+ <HTMLBODY>TmV3IFRvcGljIDxhIGhyZWY9IjxpbnAyOmJiX1RvcGljTGluayB0ZW1wbGF0ZT0nX19kZWZhdWx0X18nLz4iPjxpbnAyOmJiX0ZpZWxkIG5hbWU9IlRvcGljVGV4dCIvPjwvYT4gaGFzIGJlZW4gc3VibWl0dGVkIG9uIDxpbnAyOm1fQmFzZVVybC8+PGJyLz4NCjxici8+DQo8YnIvPg0KPGlucDI6YmJfRmllbGQgbmFtZT0iUG9zdGluZ1RleHQiIG5sMmJyPSIxIi8+</HTMLBODY>
+ </EVENT>
<EVENT Event="TOPIC.APPROVE" Type="0">
<SUBJECT>VG9waWMgIjxpbnAyOmJiX0ZpZWxkIG5hbWU9IlRvcGljVGV4dCIvPiIgaXMgYXBwcm92ZWQ=</SUBJECT>
<HTMLBODY>WW91ciB0b3BpYyBoYXMgYmVlbiBhcHByb3ZlZCBvbiA8aW5wMjptX0Jhc2VVcmwvPjxicj48YnI+DQoNClRvcGljOiA8aW5wMjpiYl9GaWVsZCBuYW1lPSJUb3BpY1RleHQiLz4=</HTMLBODY>
Index: install/install_data.sql
===================================================================
--- install/install_data.sql (revision 15165)
+++ install/install_data.sql (working copy)
@@ -76,6 +76,8 @@
INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'POST.MODIFY', NULL, 1, 1, 'In-Bulletin', 'Post Modified', 1, 1, 1);
INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'POST.ADD', NULL, 1, 0, 'In-Bulletin', 'Post Added', 0, 1, 1);
INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient) VALUES(DEFAULT, 'PM.ADD', NULL, 1, 0, 'In-Bulletin', 'New Private Message', 0, 1, 1);
+INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient, BindToSystemEvent) VALUES(DEFAULT, 'POST.ADD.SUB', NULL, 1, 0, 'In-Bulletin', 'Post Added (for subscribers)', 0, 1, 0, 'bb-post:OnCreate');
+INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient, BindToSystemEvent) VALUES(DEFAULT, 'TOPIC.ADD.SUB', NULL, 1, 0, 'In-Bulletin', 'Topic Added (for subscribers)', 0, 1, 0, 'bb:OnCreate');
INSERT INTO ItemTypes VALUES (3, 'In-Bulletin', 'bb', 'Topic', 'TopicText', 'OwnerId', 'Views', 'CachedRating', 'la_ItemTab_Topics', 1, '', 'clsTopic', 'Topic');
INSERT INTO ItemTypes VALUES (30, 'In-Bulletin', 'posting', 'Posting', 'Subject', 'CreatedById', NULL, NULL, 'la_ItemTab_Posts', 0, '', '', 'Post');
Index: install/upgrades.sql
===================================================================
--- install/upgrades.sql (revision 15218)
+++ install/upgrades.sql (working copy)
@@ -257,3 +257,5 @@
SET main_table.CachedReviewsQty = (SELECT COUNT(*) FROM <%TABLE_PREFIX%>CatalogReviews review_table WHERE review_table.ItemId = main_table.ResourceId);
# ===== v 5.2.0-B3 =====
+INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient, BindToSystemEvent) VALUES(DEFAULT, 'POST.ADD.SUB', NULL, 1, 0, 'In-Bulletin', 'Post Added (for subscribers)', 0, 1, 0, 'bb-post:OnCreate');
+INSERT INTO EmailEvents (EventId, Event, ReplacementTags, Enabled, FrontEndOnly, Module, Description, Type, AllowChangingSender, AllowChangingRecipient, BindToSystemEvent) VALUES(DEFAULT, 'TOPIC.ADD.SUB', NULL, 1, 0, 'In-Bulletin', 'Topic Added (for subscribers)', 0, 1, 0, 'bb:OnCreate');
Index: units/helpers/post_helper.php
===================================================================
--- units/helpers/post_helper.php (revision 15249)
+++ units/helpers/post_helper.php (working copy)
@@ -415,4 +415,49 @@
return $input_string;
}
+ /**
+ * Returns subscription manager by name
+ *
+ * @param string $name
+ * @param array $arguments
+ * @return kSubscriptionManager
+ * @throws InvalidArgumentException
+ */
+ public function getSubscriptionManager($name, $arguments = Array ())
+ {
+ if ( $name != 'CategoryTopics' && $name != 'TopicPosts' ) {
+ throw new InvalidArgumentException('Unknown subscription manager "' . $name . '"');
+ }
+
+ $manager = $this->Application->makeClass('kSubscriptionManager');
+ /* @var $manager kSubscriptionManager */
+
+ $fields_hash = Array ();
+
+ $user_id = isset($arguments[1]) ? $arguments[1] : $this->Application->RecallVar('user_id');
+
+ switch ( $name ) {
+ case 'CategoryTopics':
+ $category_id = isset($arguments[0]) ? $arguments[0] : $this->Application->GetVar('m_cat_id');
+
+ $fields_hash = Array (
+ 'EmailEventId' => $manager->getEmailEventId('TOPIC.ADD.SUB'),
+ 'UserId' => $user_id,
+ 'CategoryId' => $category_id,
+ );
+ break;
+
+ case 'TopicPosts':
+ $fields_hash = Array (
+ 'EmailEventId' => $manager->getEmailEventId('POST.ADD.SUB'),
+ 'UserId' => $user_id,
+ 'ParentItemId' => $arguments[0],
+ );
+ break;
+ }
+
+ $manager->add($fields_hash);
+
+ return $manager;
+ }
}
\ No newline at end of file
Index: units/topics/topics_event_handler.php
===================================================================
--- units/topics/topics_event_handler.php (revision 15165)
+++ units/topics/topics_event_handler.php (working copy)
@@ -44,6 +44,10 @@
return $perm_status;
}
+ if ( $event->Name == 'OnToogleCategoryTopicsSubscribe' || $event->Name == 'OnToogleTopicPostsSubscribe' ) {
+ return $this->Application->LoggedIn();
+ }
+
return parent::CheckPermission($event);
}
@@ -249,4 +253,51 @@
$this->Application->setUnitOption($event->MasterEvent->Prefix, 'Clones', $clones);
}
}
+
+ /**
+ * Subscribes/unsubscribes to new topics in given current category
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnToogleCategoryTopicsSubscribe(kEvent $event)
+ {
+ $post_helper = $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $manager = $post_helper->getSubscriptionManager('CategoryTopics');
+
+ if ( $manager->subscribed() ) {
+ $manager->unsubscribe();
+ }
+ else {
+ $manager->subscribe();
+ }
+ }
+
+ /**
+ * Subscribes/unsubscribes to new posts in current topic
+ *
+ * @param kEvent $event
+ * @return void
+ * @access protected
+ */
+ protected function OnToogleTopicPostsSubscribe(kEvent $event)
+ {
+ $object = $event->getObject();
+ /* @var $object kDBItem */
+
+ $post_helper = $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $manager = $post_helper->getSubscriptionManager('TopicPosts', Array ($object->GetID()));
+
+ if ( $manager->subscribed() ) {
+ $manager->unsubscribe();
+ }
+ else {
+ $manager->subscribe();
+ }
+ }
}
\ No newline at end of file
Index: units/topics/topics_tag_processor.php
===================================================================
--- units/topics/topics_tag_processor.php (revision 15165)
+++ units/topics/topics_tag_processor.php (working copy)
@@ -76,4 +76,47 @@
return $this->Application->ProcessParsedTag('m', 'Link', $params);
}
+
+ /**
+ * Detects if current user is subscribed to new topics in this category
+ *
+ * @param Array $params
+ * @return bool
+ */
+ function SubscribedToCategoryTopics($params)
+ {
+ static $subscribed = null;
+
+ if ( !isset($subscribed) ) {
+ $post_helper = $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $subscribed = $post_helper->getSubscriptionManager('CategoryTopics')->subscribed();
+ }
+
+ return $subscribed;
+ }
+
+ /**
+ * Detects if current user is subscribed to this topic posts
+ *
+ * @param Array $params
+ * @return bool
+ */
+ function SubscribedToTopicPosts($params)
+ {
+ static $subscribed = null;
+
+ if ( !isset($subscribed) ) {
+ $object = $this->getObject($params);
+ /* @var $object kDBItem */
+
+ $post_helper = $this->Application->recallObject('PostHelper');
+ /* @var $post_helper PostHelper */
+
+ $subscribed = $post_helper->getSubscriptionManager('TopicPosts', Array ($object->GetID()))->subscribed();
+ }
+
+ return $subscribed;
+ }
}
\ No newline at end of file
topic_subscription_themes.patch [^] (3,428 bytes) 2012-04-11 03:47
[Show Content]
Index: in-bulletin/_install/english.lang
===================================================================
--- in-bulletin/_install/english.lang (revision 15246)
+++ in-bulletin/_install/english.lang (working copy)
@@ -2,10 +2,14 @@
<LANGUAGE PackName="English" Encoding="base64"><DATEFORMAT>m/d/Y</DATEFORMAT><TIMEFORMAT>g:i A</TIMEFORMAT><INPUTDATEFORMAT>m/d/Y</INPUTDATEFORMAT><INPUTTIMEFORMAT>g:i:s A</INPUTTIMEFORMAT><DECIMAL>.</DECIMAL><THOUSANDS>,</THOUSANDS><CHARSET>utf-8</CHARSET><DOCS_URL>http://docs.in-portal.org/eng/index.php</DOCS_URL><UNITSYSTEM>2</UNITSYSTEM>
<PHRASES>
<PHRASE Label="lu_btn_DeletePost" Module="In-Bulletin" Type="0">RGVsZXRlIFBvc3Q=</PHRASE>
+ <PHRASE Label="lu_btn_DontNotifyAboutNewPostsInTopic" Module="In-Bulletin" Type="0">RG9uJ3Qgbm90aWZ5IG9uIE5ldyBQb3N0IGluIFRvcGlj</PHRASE>
+ <PHRASE Label="lu_btn_DontNotifyAboutNewTopicsInCategory" Module="In-Bulletin" Type="0">RG9uJ3Qgbm90aWZ5IG9uIE5ldyBUb3BpY3MgaW4gQ2F0ZWdvcnk=</PHRASE>
<PHRASE Label="lu_btn_LockTopic" Module="In-Bulletin" Type="0">TG9jayBUb3BpYw==</PHRASE>
<PHRASE Label="lu_btn_ModifyPost" Module="In-Bulletin" Type="0">TW9kaWZ5IFBvc3Q=</PHRASE>
<PHRASE Label="lu_btn_NewPrivateMessage" Module="In-Bulletin" Type="0">TmV3IFByaXZhdGUgTWVzc2FnZQ==</PHRASE>
<PHRASE Label="lu_btn_newtopic" Module="In-Bulletin" Type="0">TmV3IHRvcGlj</PHRASE>
+ <PHRASE Label="lu_btn_NotifyAboutNewPostsInTopic" Module="In-Bulletin" Type="0">Tm90aWZ5IG9uIE5ldyBQb3N0IGluIFRvcGlj</PHRASE>
+ <PHRASE Label="lu_btn_NotifyAboutNewTopicsInCategory" Module="In-Bulletin" Type="0">Tm90aWZ5IG9uIE5ldyBUb3BpY3MgaW4gQ2F0ZWdvcnk=</PHRASE>
<PHRASE Label="lu_btn_RateThisTopic" Module="In-Bulletin" Type="0">UmF0ZSBUb3BpYw==</PHRASE>
<PHRASE Label="lu_btn_Reply" Module="In-Bulletin" Type="0">UmVwbHk=</PHRASE>
<PHRASE Label="lu_btn_ReplyQuoted" Module="In-Bulletin" Type="0">UmVwbHkgUXVvdGVk</PHRASE>
Index: in-bulletin/elements/side_boxes/action_box.elm.tpl
===================================================================
--- in-bulletin/elements/side_boxes/action_box.elm.tpl (revision 15246)
+++ in-bulletin/elements/side_boxes/action_box.elm.tpl (working copy)
@@ -21,15 +21,32 @@
</inp2:m_if>
</td>
</tr>
+ </inp2:m_if>
- <!--##
+ <inp2:m_if check="m_LoggedIn">
<tr>
- <td>-</td>
<td>
- <a href="<inp2:bb_TopicLink template="in-bulletin/topics/rate"/>" class="static"><inp2:m_phrase name="lu_btn_RateThisTopic"/></a>
+ <img src="<inp2:m_TemplatesBase module='In-Portal'/>img/menu-li-2-level.gif" alt="" width="4" height="4" border="0" /><br />
</td>
+ <td>
+ <inp2:m_if check="m_Param" name="item_actions">
+ <a href="<inp2:bb_TopicLink events[bb]='OnToogleTopicPostsSubscribe'/>">
+ <inp2:m_if check="bb_SubscribedToTopicPosts">
+ <inp2:m_Phrase name="lu_btn_DontNotifyAboutNewPostsInTopic"/>
+ <inp2:m_else/>
+ <inp2:m_Phrase name="lu_btn_NotifyAboutNewPostsInTopic"/>
+ </inp2:m_if>
+ </a>
+ <inp2:m_else/>
+ <a href="<inp2:m_Link events[bb]='OnToogleCategoryTopicsSubscribe'/>">
+ <inp2:m_if check="bb_SubscribedToCategoryTopics">
+ <inp2:m_Phrase name="lu_btn_DontNotifyAboutNewTopicsInCategory"/>
+ <inp2:m_else/>
+ <inp2:m_Phrase name="lu_btn_NotifyAboutNewTopicsInCategory"/>
+ </inp2:m_if>
+ </a>
+ </inp2:m_if>
+ </td>
</tr>
- ##-->
-
</inp2:m_if>
</table>
|