From efc4e02620587e1f310823e2026b0267009ba49f Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Wed, 19 Oct 2011 16:23:32 +0200 Subject: [PATCH] Added handler for collapsible content Supports logged-in users through database storage and guests using session variables. --- .../UserCollapsibleContentHandler.class.php | 182 ++++++++++++++++++ wcfsetup/setup/db/install.sql | 11 ++ 2 files changed, 193 insertions(+) create mode 100644 wcfsetup/install/files/lib/system/user/UserCollapsibleContentHandler.class.php diff --git a/wcfsetup/install/files/lib/system/user/UserCollapsibleContentHandler.class.php b/wcfsetup/install/files/lib/system/user/UserCollapsibleContentHandler.class.php new file mode 100644 index 0000000000..abc0a8fed3 --- /dev/null +++ b/wcfsetup/install/files/lib/system/user/UserCollapsibleContentHandler.class.php @@ -0,0 +1,182 @@ + + * @package com.woltlab.wcf + * @subpackage system.user + * @category Community Framework + */ +class UserCollapsibleContentHandler extends SingletonFactory { + /** + * object type cache + * @var array + */ + protected $cache = null; + + /** + * list of collapsed object ids per object type id + * @var array + */ + protected $collapsedContent = array(); + + /** + * @see wcf\system\SingletonFactory::init() + */ + protected function init() { + $this->cache = array( + 'objectTypes' => array(), + 'objectTypeIDs' => array() + ); + + $objectTypes = ObjectTypeCache::getInstance()->getObjectTypes('com.woltlab.wcf.collapsibleContent'); + foreach ($objectTypes as $objectType) { + $this->cache['objectTypes'][$objectType->objectTypeID] = $objectType; + $this->cache['objectTypeIDs'][$objectType->objectType] = $objectType->objectTypeID; + } + } + + /** + * Returns the object type id based upon specified object type name. Returns + * null, if object type is unknown. + * + * @param string $objectType + * @return integer + */ + public function getObjectTypeID($objectType) { + if (isset($this->cache['objectTypeIDs'][$objectType])) { + return $this->cache['objectTypeIDs'][$objectType]; + } + + return null; + } + + /** + * Returns a list of object ids being collapsed by current user. + * + * @param integer $objectTypeID + * @return array + */ + public function getCollapsedContent($objectTypeID) { + if (!isset($this->collapsedContent[$objectTypeID])) { + $this->collapsedContent[$objectTypeID] = array(); + + if (WCF::getUser()->userID) { + $sql = "SELECT objectID + FROM wcf".WCF_N."_collapsible_content + WHERE objectTypeID = ? + AND userID = ?"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array( + $objectTypeID, + WCF::getUser()->userID + )); + while ($row = $statement->fetchArray()) { + $this->collapsedContent[$objectTypeID][] = $row['objectID']; + } + } + else { + $collapsedContent = WCF::getSession()->getVar('collapsedContent'); + if ($collapsedContent !== null && is_array($collapsedContent)) { + if (isset($collapsedContent[$objectTypeID])) { + $this->collapsedContent[$objectTypeID] = $collapsedContent[$objectTypeID]; + } + } + } + } + + return $this->collapsedContent[$objectTypeID]; + } + + /** + * Marks content as collapsed. + * + * @param integer $objectTypeID + * @param integer $objectID + */ + public function markAsCollapsed($objectTypeID, $objectID) { + if (WCF::getUser()->userID) { + $sql = "SELECT * + FROM wcf".WCF_N."_collapsible_content + WHERE objectTypeID = ? + AND objectID = ? + AND userID = ?"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array( + $objectTypeID, + $objectID, + WCF::getUser()->userID + )); + $row = $statement->fetchArray(); + + if (!$row) { + $sql = "INSERT INTO wcf".WCF_N."_collapsible_content + (objectTypeID, objectID, userID) + VALUES (?, ?, ?)"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array( + $objectTypeID, + $objectID, + WCF::getUser()->userID + )); + } + } + else { + $collapsedContent = WCF::getSession()->getVar('collapsedContent'); + if ($collapsedContent === null || !is_array($collapsedContent)) { + $collapsedContent = array(); + } + + if (!in_array($objectID, $collapsedContent)) { + $collapsedContent[$objectTypeID] = array(); + } + + $collapsedContent[$objectTypeID][] = $objectID; + WCF::getSession()->register('collapsedContent', $collapsedContent); + } + } + + /** + * Marks content as opened, thus removing the collapsed marking. + * + * @param integer $objectTypeID + * @param integer $objectID + */ + public function markAsOpened($objectTypeID, $objectID) { + if (WCF::getUser()->userID) { + $sql = "DELETE FROM wcf".WCF_N."_collapsible_content + WHERE objectTypeID = ? + AND objectID = ? + AND userID = ?"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute(array( + $objectTypeID, + $objectID, + WCF::getUser()->userID + )); + } + else { + $collapsedContent = WCF::getSession()->getVar('collapsedContent'); + if ($collapsedContent === null || !is_array($collapsedContent)) { + $collapsedContent = array(); + } + + if (isset($collapsedContent[$objectTypeID])) { + foreach ($collapsedContent[$objectTypeID] as $index => $collapsedObjectID) { + if ($collapsedObjectID == $objectID) { + unset($collapsedContent[$objectTypeID][$index]); + } + } + } + + WCF::getSession()->register('collapsedContent', $collapsedContent); + } + } +} diff --git a/wcfsetup/setup/db/install.sql b/wcfsetup/setup/db/install.sql index a0ad1d5058..f91162fb3f 100644 --- a/wcfsetup/setup/db/install.sql +++ b/wcfsetup/setup/db/install.sql @@ -133,6 +133,14 @@ CREATE TABLE wcf1_clipboard_page ( actionID INT(10) NOT NULL DEFAULT 0 ); +DROP TABLE IF EXISTS wcf1_collapsible_content; +CREATE TABLE wcf1_collapsible_content ( + objectTypeID INT(10) NOT NULL, + objectID INT(10) NOT NULL, + userID INT(10) NOT NULL, + UNIQUE KEY (objectTypeID, objectID, userID) +); + DROP TABLE IF EXISTS wcf1_core_object; CREATE TABLE wcf1_core_object ( objectID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY, @@ -750,6 +758,9 @@ ALTER TABLE wcf1_clipboard_item_type ADD FOREIGN KEY (packageID) REFERENCES wcf1 ALTER TABLE wcf1_clipboard_page ADD FOREIGN KEY (actionID) REFERENCES wcf1_clipboard_action (actionID) ON DELETE CASCADE; ALTER TABLE wcf1_clipboard_page ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE; +ALTER TABLE wcf1_collapsible_content ADD FOREIGN KEY (objectTypeID) REFERENCES wcf1_object_type (objectTypeID) ON DELETE CASCADE; +ALTER TABLE wcf1_collapsible_content ADD FOREIGN KEY (userID) REFERENCES wcf1_user (userID) ON DELETE CASCADE; + ALTER TABLE wcf1_core_object ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE; ALTER TABLE wcf1_cronjob ADD FOREIGN KEY (packageID) REFERENCES wcf1_package (packageID) ON DELETE CASCADE; -- 2.20.1