/** * Returns a result list of a search for installable packages. * * @return array */ public function search() { $conditions = new PreparedStatementConditionBuilder(); if (!empty($this->parameters['package'])) { $conditions->add("package_update.package LIKE ?", array('%'.$this->parameters['package'].'%')); } if (!empty($this->parameters['packageDescription'])) { $conditions->add("package_update.packageDescription LIKE ?", array('%'.$this->parameters['packageDescription'].'%')); } if (!empty($this->parameters['packageName'])) { $conditions->add("package_update.packageName LIKE ?", array('%'.$this->parameters['packageName'].'%')); } // find matching packages $sql = "SELECT package_update.packageUpdateID FROM wcf".WCF_N."_package_update package_update ".$conditions." ORDER BY package_update.packageName ASC"; $statement = WCF::getDB()->prepareStatement($sql, 1000); $statement->execute($conditions->getParameters()); $packageUpdateIDs = array(); while ($row = $statement->fetchArray()) { $packageUpdateIDs[] = $row['packageUpdateID']; } // no matches found if (empty($packageUpdateIDs)) { WCF::getTPL()->assign(array( 'packageUpdates' => array() )); return array( 'count' => 0, 'pageCount' => 0, 'searchID' => 0, 'template' => WCF::getTPL()->fetch('packageSearchResultList') ); } // filter by version $conditions = new PreparedStatementConditionBuilder(); $conditions->add("puv.packageUpdateID IN (?)", array($packageUpdateIDs)); $sql = "SELECT pu.package, puv.packageUpdateVersionID, puv.packageUpdateID, puv.packageVersion, puv.isAccessible FROM wcf".WCF_N."_package_update_version puv LEFT JOIN wcf".WCF_N."_package_update pu ON (pu.packageUpdateID = puv.packageUpdateID) ".$conditions; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($conditions->getParameters()); $packageVersions = array(); while ($row = $statement->fetchArray()) { $package = $row['package']; if (!isset($packageVersions[$package])) { $packageVersions[$package] = array(); } $packageUpdateID = $row['packageUpdateID']; if (!isset($packageVersions[$package][$packageUpdateID])) { $packageVersions[$package][$packageUpdateID] = array( 'accessible' => array(), 'existing' => array() ); } if ($row['isAccessible']) { $packageVersions[$package][$packageUpdateID]['accessible'][$row['packageUpdateVersionID']] = $row['packageVersion']; } $packageVersions[$package][$packageUpdateID]['existing'][$row['packageUpdateVersionID']] = $row['packageVersion']; } // determine highest versions $packageUpdates = array(); foreach ($packageVersions as $package => $versionData) { $accessible = $existing = $versions = array(); foreach ($versionData as $packageUpdateID => $versionTypes) { // ignore unaccessible packages if (empty($versionTypes['accessible'])) { continue; } uasort($versionTypes['accessible'], array('wcf\data\package\Package', 'compareVersion')); uasort($versionTypes['existing'], array('wcf\data\package\Package', 'compareVersion')); $accessibleVersion = array_slice($versionTypes['accessible'], -1, 1, true); $existingVersion = array_slice($versionTypes['existing'], -1, 1, true); $ak = key($accessibleVersion); $av = current($accessibleVersion); $ek = key($existingVersion); $ev = current($existingVersion); $accessible[$av] = $ak; $existing[$ev] = $ek; $versions[$ak] = $packageUpdateID; $versions[$ek] = $packageUpdateID; } uksort($accessible, array('wcf\data\package\Package', 'compareVersion')); uksort($existing, array('wcf\data\package\Package', 'compareVersion')); $accessible = array_pop($accessible); $existing = array_pop($existing); $packageUpdates[$versions[$accessible]] = array( 'accessible' => $accessible, 'existing' => $existing ); } $search = SearchEditor::create(array( 'userID' => WCF::getUser()->userID, 'searchData' => serialize($packageUpdates), 'searchTime' => TIME_NOW, 'searchType' => 'acpPackageSearch' )); // forward call to build the actual result list $updateAction = new PackageUpdateAction(array(), 'getResultList', array( 'pageNo' => 1, 'search' => $search )); $returnValues = $updateAction->executeAction(); return $returnValues['returnValues']; }
/** * @see wcf\action\IAction::execute() */ public function execute() { //parent::execute(); //!!! $this->readParameters(); //!!! // set active menu item (for error messages) //PageMenu::getInstance()->setActiveMenuItem('wbb.header.menu.board'); // build conditions $sql = ''; $conditionBuilder = new PreparedStatementConditionBuilder(); switch ($this->mode) { case 'unreadPosts': $conditionBuilder->add('thread.boardID IN (?)', array($this->boardIDs)); $conditionBuilder->add('thread.lastPostTime > ?', array(VisitTracker::getInstance()->getVisitTime('com.woltlab.wbb.thread'))); $conditionBuilder->add('thread.isDeleted = 0'); $conditionBuilder->add('thread.isDisabled = 0'); $conditionBuilder->add('thread.movedThreadID IS NULL'); $conditionBuilder->add('(thread.lastPostTime > tracked_thread_visit.visitTime OR tracked_thread_visit.visitTime IS NULL)'); $conditionBuilder->add('(thread.lastPostTime > tracked_board_visit.visitTime OR tracked_board_visit.visitTime IS NULL)'); if (LanguageFactory::getInstance()->multilingualismEnabled() && count(WCF::getUser()->getLanguageIDs())) { $conditionBuilder->add('(thread.languageID IN (?) OR thread.languageID IS NULL)', array(WCF::getUser()->getLanguageIDs())); } $conditionBuilder->add('thread.isAnnouncement = 0'); //!!! $sql = "SELECT\t\tthread.threadID\n\t\t\t\t\tFROM\t\twbb" . WCF_N . "_thread thread\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_tracked_visit tracked_thread_visit\n\t\t\t\t\tON\t\t(tracked_thread_visit.objectTypeID = " . VisitTracker::getInstance()->getObjectTypeID('com.woltlab.wbb.thread') . " AND tracked_thread_visit.objectID = thread.threadID AND tracked_thread_visit.userID = " . WCF::getUser()->userID . ")\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_tracked_visit tracked_board_visit\n\t\t\t\t\tON\t\t(tracked_board_visit.objectTypeID = " . VisitTracker::getInstance()->getObjectTypeID('com.woltlab.wbb.board') . " AND tracked_board_visit.objectID = thread.boardID AND tracked_board_visit.userID = " . WCF::getUser()->userID . ")\n\t\t\t\t\t" . $conditionBuilder . "\n\t\t\t\t\tORDER BY\tthread.lastPostTime DESC"; $exttMbqSqlCount = "SELECT\t\tcount(thread.threadID) as totalNum\n\t\t\t\t\tFROM\t\twbb" . WCF_N . "_thread thread\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_tracked_visit tracked_thread_visit\n\t\t\t\t\tON\t\t(tracked_thread_visit.objectTypeID = " . VisitTracker::getInstance()->getObjectTypeID('com.woltlab.wbb.thread') . " AND tracked_thread_visit.objectID = thread.threadID AND tracked_thread_visit.userID = " . WCF::getUser()->userID . ")\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_tracked_visit tracked_board_visit\n\t\t\t\t\tON\t\t(tracked_board_visit.objectTypeID = " . VisitTracker::getInstance()->getObjectTypeID('com.woltlab.wbb.board') . " AND tracked_board_visit.objectID = thread.boardID AND tracked_board_visit.userID = " . WCF::getUser()->userID . ")\n\t\t\t\t\t" . $conditionBuilder; break; /* case 'undoneThreads': $boardIDs = array(); foreach ($this->boardIDs as $boardID) { if (BoardCache::getInstance()->getBoard($boardID)->enableMarkingAsDone) $boardIDs[] = $boardID; } if (empty($boardIDs)) { throw new NamedUserException(WCF::getLanguage()->getDynamicVariable('wcf.search.error.noMatches', array('query' => ''))); } $conditionBuilder->add('thread.boardID IN (?)', array($boardIDs)); $conditionBuilder->add('thread.isDone = 0'); $conditionBuilder->add('thread.isDeleted = 0'); $conditionBuilder->add('thread.isDisabled = 0'); $conditionBuilder->add('thread.movedThreadID IS NULL'); if (LanguageFactory::getInstance()->multilingualismEnabled() && count(WCF::getUser()->getLanguageIDs())) { $conditionBuilder->add('(thread.languageID IN (?) OR thread.languageID IS NULL)', array(WCF::getUser()->getLanguageIDs())); } $sql = "SELECT thread.threadID FROM wbb".WCF_N."_thread thread ".$conditionBuilder." ORDER BY thread.lastPostTime DESC"; break; */ } // build search hash $searchHash = StringUtil::getHash($sql); // execute query $matches = array(); $statement = WCF::getDB()->prepareStatement($sql, $this->exttMbqNumPerPage, $this->exttMbqStartNum); $statement->execute($conditionBuilder->getParameters()); while ($row = $statement->fetchArray()) { $matches[] = array('objectID' => $row['threadID'], 'objectType' => 'com.woltlab.wbb.post'); } //get total count $exttMbqStatementCount = WCF::getDB()->prepareStatement($exttMbqSqlCount); $exttMbqStatementCount->execute($conditionBuilder->getParameters()); while ($exttMbqRecord = $exttMbqStatementCount->fetchArray()) { $exttMbqTotal = $exttMbqRecord['totalNum']; } // check result /* if (!count($matches)) { throw new NamedUserException(WCF::getLanguage()->getDynamicVariable('wcf.search.error.noMatches', array('query' => ''))); } */ // save result in database $searchData = array('packageID' => PACKAGE_ID, 'query' => '', 'results' => $matches, 'additionalData' => array('com.woltlab.wbb.post' => array('findThreads' => 1)), 'sortOrder' => 'DESC', 'sortField' => 'time', 'objectTypes' => array('com.woltlab.wbb.post')); $searchData = serialize($searchData); $search = SearchEditor::create(array('userID' => WCF::getUser()->userID ?: null, 'searchData' => $searchData, 'searchTime' => TIME_NOW, 'searchType' => 'messages', 'searchHash' => $searchHash)); // forward to result page //HeaderUtil::redirect(LinkHandler::getInstance()->getLink('SearchResult', array('id' => $search->searchID))); //exit; $exttMbqRetIds = array(); foreach ($matches as $exttMbqTopicId) { $exttMbqRetIds[] = $exttMbqTopicId['objectID']; } return array('total' => $exttMbqTotal, 'topicIds' => $exttMbqRetIds); }
/** * Returns a result list of a search for installable packages. * * @return array */ public function search() { PackageUpdateDispatcher::getInstance()->refreshPackageDatabase(); $availableUpdateServers = PackageUpdateServer::getActiveUpdateServers(); // there are no available package update servers if (empty($availableUpdateServers)) { WCF::getTPL()->assign(array('packageUpdates' => array())); return array('count' => 0, 'pageCount' => 0, 'searchID' => 0, 'template' => WCF::getTPL()->fetch('packageSearchResultList')); } $conditions = new PreparedStatementConditionBuilder(); $conditions->add("package_update.packageUpdateServerID IN (?)", array(array_keys($availableUpdateServers))); if (!empty($this->parameters['package'])) { $conditions->add("package_update.package LIKE ?", array('%' . $this->parameters['package'] . '%')); } if (!empty($this->parameters['packageDescription'])) { $conditions->add("package_update.packageDescription LIKE ?", array('%' . $this->parameters['packageDescription'] . '%')); } if (!empty($this->parameters['packageName'])) { $conditions->add("package_update.packageName LIKE ?", array('%' . $this->parameters['packageName'] . '%')); } $conditions->add("package.packageID IS NULL"); // find matching packages $sql = "SELECT\t\tpackage_update.packageUpdateID\n\t\t\tFROM\t\twcf" . WCF_N . "_package_update package_update\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package package\n\t\t\tON\t\t(package.package = package_update.package)\n\t\t\t" . $conditions . "\n\t\t\tORDER BY\tpackage_update.packageName ASC"; $statement = WCF::getDB()->prepareStatement($sql, 1000); $statement->execute($conditions->getParameters()); $packageUpdateIDs = array(); while ($row = $statement->fetchArray()) { $packageUpdateIDs[] = $row['packageUpdateID']; } // no matches found if (empty($packageUpdateIDs)) { WCF::getTPL()->assign(array('packageUpdates' => array())); return array('count' => 0, 'pageCount' => 0, 'searchID' => 0, 'template' => WCF::getTPL()->fetch('packageSearchResultList')); } // get excluded packages $sql = "SELECT\t*\n\t\t\tFROM\twcf" . WCF_N . "_package_update_exclusion"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); $excludedPackages = array(); while ($row = $statement->fetchArray()) { $package = $row['excludedPackage']; $packageVersion = $row['excludedPackageVersion']; $packageUpdateVersionID = $row['packageUpdateVersionID']; if (!isset($excludedPackages[$packageUpdateVersionID][$package])) { $excludedPackages[$packageUpdateVersionID][$package] = $packageVersion; } else { if (Package::compareVersion($excludedPackages[$packageUpdateVersionID][$package], $packageVersion) == 1) { $excludedPackages[$packageUpdateVersionID][$package] = $packageVersion; } } } // get installed packages $sql = "SELECT\tpackage, packageVersion\n\t\t\tFROM\twcf" . WCF_N . "_package"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(); $installedPackages = array(); while ($row = $statement->fetchArray()) { $installedPackages[$row['package']] = $row['packageVersion']; } // filter by version $conditions = new PreparedStatementConditionBuilder(); $conditions->add("puv.packageUpdateID IN (?)", array($packageUpdateIDs)); $sql = "SELECT\t\tpu.package, puv.packageUpdateVersionID, puv.packageUpdateID, puv.packageVersion, puv.isAccessible\n\t\t\tFROM\t\twcf" . WCF_N . "_package_update_version puv\n\t\t\tLEFT JOIN\twcf" . WCF_N . "_package_update pu\n\t\t\tON\t\t(pu.packageUpdateID = puv.packageUpdateID)\n\t\t\t" . $conditions; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute($conditions->getParameters()); $packageVersions = array(); while ($row = $statement->fetchArray()) { $package = $row['package']; $packageVersion = $row['packageVersion']; $packageUpdateVersionID = $row['packageUpdateVersionID']; // check excluded packages if (isset($excludedPackages[$packageUpdateVersionID])) { $isExcluded = false; foreach ($excludedPackages[$packageUpdateVersionID] as $excludedPackage => $excludedPackageVersion) { if (isset($installedPackages[$excludedPackage]) && Package::compareVersion($excludedPackageVersion, $installedPackages[$excludedPackage]) <= 0) { // excluded, ignore $isExcluded = true; break; } } if ($isExcluded) { continue; } } if (!isset($packageVersions[$package])) { $packageVersions[$package] = array(); } $packageUpdateID = $row['packageUpdateID']; if (!isset($packageVersions[$package][$packageUpdateID])) { $packageVersions[$package][$packageUpdateID] = array('accessible' => array(), 'existing' => array()); } if ($row['isAccessible']) { $packageVersions[$package][$packageUpdateID]['accessible'][$row['packageUpdateVersionID']] = $packageVersion; } $packageVersions[$package][$packageUpdateID]['existing'][$row['packageUpdateVersionID']] = $packageVersion; } // all found versions are excluded if (empty($packageVersions)) { WCF::getTPL()->assign(array('packageUpdates' => array())); return array('count' => 0, 'pageCount' => 0, 'searchID' => 0, 'template' => WCF::getTPL()->fetch('packageSearchResultList')); } // determine highest versions $packageUpdates = array(); foreach ($packageVersions as $package => $versionData) { $accessible = $existing = $versions = array(); foreach ($versionData as $packageUpdateID => $versionTypes) { // ignore unaccessible packages if (empty($versionTypes['accessible'])) { continue; } uasort($versionTypes['accessible'], array('wcf\\data\\package\\Package', 'compareVersion')); uasort($versionTypes['existing'], array('wcf\\data\\package\\Package', 'compareVersion')); $accessibleVersion = array_slice($versionTypes['accessible'], -1, 1, true); $existingVersion = array_slice($versionTypes['existing'], -1, 1, true); $ak = key($accessibleVersion); $av = current($accessibleVersion); $ek = key($existingVersion); $ev = current($existingVersion); $accessible[$av] = $ak; $existing[$ev] = $ek; $versions[$ak] = $packageUpdateID; $versions[$ek] = $packageUpdateID; } // ignore packages without accessible versions if (empty($accessible)) { continue; } uksort($accessible, array('wcf\\data\\package\\Package', 'compareVersion')); uksort($existing, array('wcf\\data\\package\\Package', 'compareVersion')); $accessible = array_pop($accessible); $existing = array_pop($existing); $packageUpdates[$versions[$accessible]] = array('accessible' => $accessible, 'existing' => $existing); } // no found packages is accessible if (empty($packageUpdates)) { WCF::getTPL()->assign(array('packageUpdates' => array())); return array('count' => 0, 'pageCount' => 0, 'searchID' => 0, 'template' => WCF::getTPL()->fetch('packageSearchResultList')); } $search = SearchEditor::create(array('userID' => WCF::getUser()->userID, 'searchData' => serialize($packageUpdates), 'searchTime' => TIME_NOW, 'searchType' => 'acpPackageSearch')); // forward call to build the actual result list $updateAction = new PackageUpdateAction(array(), 'getResultList', array('pageNo' => 1, 'search' => $search)); $returnValues = $updateAction->executeAction(); return $returnValues['returnValues']; }
/** * @see wcf\form\IForm::save() */ public function save() { parent::save(); // store search result in database $data = serialize(array('matches' => $this->matches, 'itemsPerPage' => $this->itemsPerPage, 'columns' => $this->columns)); $search = SearchEditor::create(array('userID' => WCF::getUser()->userID, 'searchData' => $data, 'searchTime' => TIME_NOW, 'searchType' => 'users')); // get new search id $this->searchID = $search->searchID; $this->saved(); // forward to result page $url = LinkHandler::getInstance()->getLink('UserList', array('id' => $this->searchID), 'sortField=' . rawurlencode($this->sortField) . '&sortOrder=' . rawurlencode($this->sortOrder)); HeaderUtil::redirect($url); exit; }
/** * @see wcf\form\IForm::save() */ public function save() { parent::save(); // save search $search = SearchEditor::create(array('userID' => WCF::getUser()->userID, 'searchData' => $this->packageUpdateServerIDs, 'searchTime' => TIME_NOW, 'searchType' => 'packages')); $this->saved(); // forward $url = LinkHandler::getInstance()->getLink('PackageUpdateSearchResult', array('id' => $search->searchID)); HeaderUtil::redirect($url); exit; }
/** * @see \wcf\form\IForm::save() */ public function save() { parent::save(); // store search result in database $search = SearchEditor::create(array('userID' => WCF::getUser()->userID ?: null, 'searchData' => serialize(array('matches' => $this->matches)), 'searchTime' => TIME_NOW, 'searchType' => 'users')); // get new search id $this->searchID = $search->searchID; $this->saved(); // forward to result page $url = LinkHandler::getInstance()->getLink('MembersList', array('id' => $this->searchID)); HeaderUtil::redirect($url); exit; }
/** * @see \wcf\action\IAction::execute(); */ public function execute() { ACPMenu::getInstance()->setActiveMenuItem('wcf.acp.menu.link.user.search'); parent::execute(); // add email column for authorized users if (WCF::getSession()->getPermission('admin.user.canEditMailAddress')) { array_unshift($this->columns, 'email'); } switch ($this->mode) { case 'banned': $sql = "SELECT\t\tuser_table.userID\n\t\t\t\t\tFROM\t\twcf" . WCF_N . "_user user_table\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_user_option_value option_value\n\t\t\t\t\tON\t\t(option_value.userID = user_table.userID)\n\t\t\t\t\tWHERE\t\tbanned = ?"; $statement = WCF::getDB()->prepareStatement($sql, $this->maxResults); $statement->execute(array(1)); while ($row = $statement->fetchArray()) { $this->matches[] = $row['userID']; } break; case 'newest': $this->maxResults = 100; $this->sortField = 'registrationDate'; $this->sortOrder = 'DESC'; $sql = "SELECT\t\tuser_table.userID\n\t\t\t\t\tFROM\t\twcf" . WCF_N . "_user user_table\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_user_option_value option_value\n\t\t\t\t\tON\t\t(option_value.userID = user_table.userID)\n\t\t\t\t\tORDER BY\tuser_table.registrationDate DESC"; $statement = WCF::getDB()->prepareStatement($sql, $this->maxResults); $statement->execute(); while ($row = $statement->fetchArray()) { $this->matches[] = $row['userID']; } break; case 'disabled': $this->sortField = 'registrationDate'; $this->sortOrder = 'DESC'; $sql = "SELECT\t\tuser_table.userID\n\t\t\t\t\tFROM\t\twcf" . WCF_N . "_user user_table\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_user_option_value option_value\n\t\t\t\t\tON\t\t(option_value.userID = user_table.userID)\n\t\t\t\t\tWHERE\t\tactivationCode <> ?\n\t\t\t\t\tORDER BY\tuser_table.registrationDate DESC"; $statement = WCF::getDB()->prepareStatement($sql, $this->maxResults); $statement->execute(array(0)); while ($row = $statement->fetchArray()) { $this->matches[] = $row['userID']; } break; case 'disabledAvatars': $sql = "SELECT\t\tuser_table.userID\n\t\t\t\t\tFROM\t\twcf" . WCF_N . "_user user_table\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_user_option_value option_value\n\t\t\t\t\tON\t\t(option_value.userID = user_table.userID)\n\t\t\t\t\tWHERE\t\tdisableAvatar = ?"; $statement = WCF::getDB()->prepareStatement($sql, $this->maxResults); $statement->execute(array(1)); while ($row = $statement->fetchArray()) { $this->matches[] = $row['userID']; } break; case 'disabledSignatures': $sql = "SELECT\t\tuser_table.userID\n\t\t\t\t\tFROM\t\twcf" . WCF_N . "_user user_table\n\t\t\t\t\tLEFT JOIN\twcf" . WCF_N . "_user_option_value option_value\n\t\t\t\t\tON\t\t(option_value.userID = user_table.userID)\n\t\t\t\t\tWHERE\t\tdisableSignature = ?"; $statement = WCF::getDB()->prepareStatement($sql, $this->maxResults); $statement->execute(array(1)); while ($row = $statement->fetchArray()) { $this->matches[] = $row['userID']; } break; } if (empty($this->matches)) { throw new NamedUserException(WCF::getLanguage()->get('wcf.acp.user.search.error.noMatches')); } // store search result in database $data = serialize(array('matches' => $this->matches, 'itemsPerPage' => $this->itemsPerPage, 'columns' => $this->columns)); $search = SearchEditor::create(array('userID' => WCF::getUser()->userID, 'searchData' => $data, 'searchTime' => TIME_NOW, 'searchType' => 'users')); $this->executed(); // forward to result page $url = LinkHandler::getInstance()->getLink('UserList', array('id' => $search->searchID), 'sortField=' . rawurlencode($this->sortField) . '&sortOrder=' . rawurlencode($this->sortOrder)); HeaderUtil::redirect($url); exit; }