⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subscriptions.inc.php

📁 PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。
💻 PHP
📖 第 1 页 / 共 2 页
字号:
        $parentId = $oParentFolder->getId();
        $this->sendNotification($aUsers, 'RestoreArchivedDocument', $oModifiedDocument->getName(), $oModifiedDocument->getId(), $parentId);
    }

    function DownloadDocument($oDocument, $oParentFolder)  {
        $content = new SubscriptionContent(); // needed for i18n
	    // OK:  two actions:  document registrants, folder registrants.
        $aDocUsers = $this->_getSubscribers($oDocument->getId(), $this->subscriptionTypes["Document"]);
        $aFolderUsers = $this->_getSubscribers($oParentFolder->getId(), $this->subscriptionTypes["Folder"]);
        $aUsers = array_merge($aDocUsers, $aFolderUsers);

        $parentId = $oParentFolder->getId();
        $this->sendNotification($aUsers, 'DownloadDocument', $oDocument->getName(), $oDocument->getId(), $parentId);
    }

    function sendNotification($aUsers, $eventType, $targetName, $objectId, $parentId) {
        $content = new SubscriptionContent(); // needed for i18n

	    //$aUsers = $this->_getSubscribers($oDocument->getId(), $this->subscriptionTypes["Document"]);

	    $locationName = Folder::generateFullFolderPath($parentId);
	    $userId = $_SESSION['userID'];
		foreach ($aUsers as $oSubscriber) {

		    $emailAddress = $oSubscriber->getEmail();
		    if ($oSubscriber->getEmailNotification() && !empty($emailAddress)) {

    		    // notification object first.
    			$aNotificationOptions = array();
    			$aNotificationOptions['target_user'] = $oSubscriber->getID();
    		    $aNotificationOptions['actor_id'] = $userId;
    		    $aNotificationOptions['target_name'] = $targetName;
    		    $aNotificationOptions['location_name'] = $locationName;
    		    $aNotificationOptions['object_id'] = $objectId;
    		    $aNotificationOptions['event_type'] = $eventType;
    			$oNotification =& KTSubscriptionNotification::generateSubscriptionNotification($aNotificationOptions);

    			// now the email content.
			    $emailContent = $content->getEmailAlertContent($oNotification);
				$emailSubject = $content->getEmailAlertSubject($oNotification);
				$oEmail = new EmailAlert($emailAddress, $emailSubject, $emailContent);
				$oEmail->send();
			}
		}
    }

    // small helper function to assist in identifying the numeric id.
    function _getKeyForType($sEventType) {
        foreach ($this->eventTypes as $key => $val) {
            if ($val == $sSubType) { return $key; }
        }
        return -1;
    }

    // helper function to get & adjust the $alertedUsers
    // note that this has side-effects:  $this->alertedUsers is a merged version
    // after this has been called.
    function _pruneAlertedUsers($aUserIds) {
        $returnArray = array_diff($aUserIds, $this->alertedUsers);
        $this->alertedUsers = kt_array_merge($returnArray, $this->alertedUsers); // now contains all users who will have been alerted.
        return $returnArray;
    }

    // gets subscribers to object, with appropriate type (e.g. folder or document).
    // need the second part because docs and folders have separate ids.
	// based on the old SubscriptionEngine::retrieveSubscribers.
    function _getSubscribers($iObjectId, $iSubType) {
	    global $default;        // for the logging.
		if (KTLOG_CACHE) $default->log->debug("_getSubscribers(id=$iObjectId, type=$iSubType); table=" .Subscription::getTableName($iSubType). "; id=" .Subscription::getIdFieldName($iSubType));

		$aUsers = array();
		$aNewUsers = array();
		$aSubUsers = array();
        $table = Subscription::getTableName($iSubType);
        $field = Subscription::getIdFieldName($iSubType);

		// If we're dealing with a folder then get those user who are subscribed to one of the parent folders and want notifications on sub folders
		if($iSubType == $this->subscriptionTypes["Folder"] && $iObjectId != 1){
		    // Get parent folder ids
		    $query= "SELECT parent_folder_ids FROM folders WHERE id = {$iObjectId}";
		    $aParentIds = DBUtil::getResultArrayKey($query, 'parent_folder_ids');
		    $parentIds = $aParentIds[0];

		    // Get those users who have checked the subfolders option on the above folders
		    $query = "SELECT user_id FROM {$table} WHERE {$field} IN ({$parentIds}) AND with_subfolders = 1";
		    $aSubUsers = DBUtil::getResultArrayKey($query, 'user_id');
		}

        $sQuery = "SELECT user_id FROM {$table} WHERE {$field} = ?";
        $aParams = array($iObjectId);

		$aNewUsers = DBUtil::getResultArrayKey(array($sQuery, $aParams), 'user_id');

		// Add any users from parent folders
		$aNewUsers = array_merge($aNewUsers, $aSubUsers);
		$aNewUsers = array_unique($aNewUsers);

		// Remove alerted users
		$aNewUsers = $this->_pruneAlertedUsers($aNewUsers);


		$iCurrentUserId = $_SESSION['userID'];
		// notionally less efficient than the old code.  if its a big issue, can easily
		// be refactored.
		foreach ($aNewUsers as $iUserId) {
		    // the user doesn't need to be notified for his/her own modifications
		    if($iUserId == $iCurrentUserId){
		        continue;
		    }

			$oUser = & User::get($iUserId);

			// do a quick prune here, for performance/maintenance reasons.
			if (PEAR::isError($oUser) || ($oUser == false)) {
			    $sQuery = "DELETE FROM " . Subscription::getTableName($iSubType) . " WHERE user_id = ?";
				$aParams = array($iUserId);
			    DBUtil::runQuery(array($sQuery, $sParams));
				$default->log->error("SubscriptionEvent::fireSubscription error removing subscription for user id=$iUserId");
			} else {
			    $aUsers[] = $oUser;
			}
		}

		if (KTLOG_CACHE) $default->log->debug('retrieveSubscribers found count=' . count($aUsers));
        return $aUsers;
    }
}

// interesting:  how do we want to generate email & notification content?
// first suggestion:
//    - generate this content here.
//    - alternatively, generate the content inside the notification environment (for part 2).

/* very simple class to handle and hold the various and sundry event types content for emails. */
class SubscriptionContent {
    // have to be instantiated, or the i18n can't work.
	function SubscriptionContent() {
	    $this->_eventTypeNames = array(
            "AddFolder" => _kt('Folder added'),
            "RemoveSubscribedFolder" => _kt('Folder removed'), // nothing. your subscription is now gone.
            "RemoveChildFolder" => _kt('Folder removed'),
            "AddDocument" => _kt('Document added'),
            "RemoveSubscribedDocument" => _kt('Document removed'), // nothing. your subscription is now gone.
            "RemoveChildDocument" => _kt('Document removed'),
            "ModifyDocument" => _kt('Document modified'),
            "CheckInDocument" => _kt('Document checked in'),
            "CheckOutDocument" => _kt('Document checked out'),
            "MovedDocument" => _kt('Document moved'),
            "CopiedDocument" => _kt('Document copied'),
            "ArchivedDocument" => _kt('Document archived'), // can go through and request un-archival (?)
            "DownloadDocument" => _kt('Document downloaded'),
            "RestoredArchivedDocument" => _kt('Document restored'),
            "DiscussDocument" => _kt('Document Discussions updated'),
        );
	}

	function getEmailAlertContent($oKTNotification) {
	    // we can re-use the normal template.
		// however, we need to wrap it - no need for a second template here.
		$str = '<html><body>' . $this->getNotificationAlertContent($oKTNotification) . '</body></html>';
		return $str;
	}

	function getEmailAlertSubject($oKTNotification) {
	    $info = $this->_getSubscriptionData($oKTNotification);
	    return $info["title"];
	}

	function getNotificationAlertContent($oKTNotification) {
	    $info = $this->_getSubscriptionData($oKTNotification);
	    $oTemplating =& KTTemplating::getSingleton();

	    $oTemplate = $oTemplating->loadTemplate("kt3/notifications/subscriptions." . $info['event_type']);
	    // if, for some reason, this doesn't actually work, use the "generic" title.
	    if (PEAR::isError($oTemplate)) {
		$oTemplate = $oTemplating->loadTemplate("kt3/notifications/subscriptions.generic");
	    }
	    // FIXME we need to specify the i18n by user.

	    $isBroken = false;
	    if (PEAR::isError($info['object']) || ($info['object'] === false) || is_null($info['object'])) {
		$isBroken = true;
	    }

	    $aTemplateData = array("context" => $oKTNotification,
				   "info" => $info,
				   "is_broken" => $isBroken,
				   );
	    return $oTemplate->render($aTemplateData);
	}
	// no separate subject function, its rolled into get...Content()

	var $_eventObjectMap = array(
		"AddFolder" => 'folder',
        "RemoveSubscribedFolder" => '', // nothing. your subscription is now gone.
        "RemoveChildFolder" => 'folder',
        "AddDocument" => 'document',
        "RemoveSubscribedDocument" => '', // nothing. your subscription is now gone.
        "RemoveChildDocument" => 'folder',
        "ModifyDocument" => 'document',
        "CheckInDocument" => 'document',
        "CheckOutDocument" => 'document',
        "MovedDocument" => 'document',
        "CopiedDocument" => 'document',
        "ArchivedDocument" => 'document', // can go through and request un-archival (?)
        "DownloadDocument" => 'document',
        "RestoredArchivedDocument" => 'document',
        "DiscussDocument" => 'document');



	function _getSubscriptionData($oKTNotification) {
		$info = array(
			'object_name' => $oKTNotification->getLabel(),
			'event_type' => $oKTNotification->getStrData1(),
			'location_name' => $oKTNotification->getStrData2(),
			'object_id' => $oKTNotification->getIntData1(),
			'actor_id' => $oKTNotification->getIntData2(),
			'has_actor' => false,
			'notify_id' => $oKTNotification->getId(),
		);

		$info['title'] = KTUtil::arrayGet($this->_eventTypeNames, $info['event_type'], 'Subscription alert:') .': ' . $info['object_name'];

		if ($info['actor_id'] !== null) {
			$oTempUser = User::get($info['actor_id']);
			if (PEAR::isError($oTempUser) || ($oTempUser == false)) {
			    // no-act
			    $info['actor'] = null;
			} else {
			    $info['actor'] = $oTempUser;
			    $info['has_actor'] = true;

			    $sName = $oTempUser->getName();
			    $iUnitId = $oTempUser->getUnitId();

			    if($iUnitId !== false) {
				$oUnit = Unit::get($iUnitId);
				if(!PEAR::isError($oUnit)) {
				    $sName .= sprintf(" (%s)", $oUnit->getName());
				}
			    }

			    $info['actor_name'] = $sName;
			}
		}

		if ($info['object_id'] !== null) {
		    $info['object'] = $this->_getEventObject($info['event_type'], $info['object_id']);
		}

		return $info;
	}

	// resolve the object type based on the alert type.
	function _getEventObject($sAlertType, $id) {
        $t = KTUtil::arrayGet($this->_eventObjectMap, $sAlertType ,'');
		if ($t == 'document') {
		    $o = Document::get($id);
			if (PEAR::isError($o) || ($o == false)) { return null;
			} else { return $o; }
		} else if ($t == 'folder') {
		    $o = Folder::get($id);
			if (PEAR::isError($o) || ($o == false)) { return null;
			} else { return $o; }
		} else {
			return null;
		}
	}

	function _getEventObjectType($sAlertType) {
		return KTUtil::arrayGet($this->_eventObjectMap, $sAlertType ,'');
	}
}

?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -