tagcloudutil.inc.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 247 行
SVN-BASE
247 行
<?php/* * $Id: $ * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * Contributor( s): ______________________________________ * *//*** Builds the weightings for tags based on their frequency** @param array $aTags* @return array*/function get_tag_weightings($aTags){ if (empty($aTags)){ return array(); }else{ $min_freq = min(array_values($aTags)); $max_freq = max(array_values($aTags)); } $min_size = 10; $max_size = 20; $distrib = $max_freq - $min_freq; if ($distrib == 0){ $distrib=1; } $step = ($max_size - $min_size)/($distrib); foreach($aTags as $tag => $freq) { $size = ceil($min_size + (($freq - $min_freq) * $step)); $aTags[$tag] = $size; } return $aTags;}/*** Returns the relevant tags for the current user** @return array*/function get_relevant_tags($oUser, $sTag){ $aTagList = isset($_SESSION['tagList']) ? $_SESSION['tagList'] : array(); $tagTree = array(); $documentList = ''; // Get the previous tag info: // the list of documents that contain the tag to search within // the tags that have already been filtered so they aren't displayed again if(!empty($aTagList)){ $aPrevTag = end($aTagList); $sPrevTag = $aPrevTag['tag']; $documentList = $aPrevTag['docs']; $tagTree = $aPrevTag['tagTree']; } if(empty($sTag)){ // If there is no tag specified then get all tags. $aUserPermissions = KTSearchUtil::permissionToSQL($oUser, 'ktcore.permissions.read'); if(PEAR::isError($aUserPermissions)) { return array(); } // ensure the user has read permission on the documents list($sWhere, $aParams, $sJoins) = $aUserPermissions; $sql = "SELECT TW.tag, count(*) as freq FROM document_tags DT INNER JOIN tag_words TW ON DT.tag_id=TW.id WHERE DT.document_id in (SELECT D.id FROM documents D $sJoins WHERE $sWhere AND D.status_id = '1') GROUP BY TW.tag"; $tags = DBUtil::getResultArray(array($sql, $aParams)); }else{ // Create a new tag query to get the document id's associated with the tag $oQuery = new TagQuery($oUser, $sTag); $aOptions = array(); $aOptions['select'] = 'DISTINCT DTS.document_id'; $aQuery = $oQuery->getQuery($aOptions); $sInnerQuery = $aQuery[0]; $aParams = $aQuery[1]; $aDocIds = DBUtil::getResultArrayKey($aQuery, 'document_id'); $sDocs = implode(',', $aDocIds); // Don't display tags that have already been selected. $tagTree[] = $sTag; $cnt = count($tagTree); $sIgnoreTags = '?'; for($i = 1; $i < $cnt; $i++){ $sIgnoreTags .= ',?'; } // Get the tags within the documents that haven't been selected before $sQuery = "SELECT TW.tag, count(*) as freq FROM document_tags DT INNER JOIN tag_words TW ON DT.tag_id=TW.id WHERE DT.document_id in ($sDocs) AND TW.tag NOT IN ($sIgnoreTags) GROUP BY TW.tag"; $tags = DBUtil::getResultArray(array($sQuery, $tagTree), null); // Add new tag to the session if($sPrevTag != $sTag){ $aTagList[] = array('tag' => $sTag, 'docs' => $sDocs, 'tagTree' => $tagTree); $_SESSION['tagList'] = $aTagList; } } // Create tag / frequency array $aTags = array(); foreach($tags as $tag) { $word=$tag['tag']; $freq=$tag['freq']; $aTags[$word] = $freq; } return $aTags;}class TagQuery extends PartialQuery{ var $oUser; var $sTag; function TagQuery($oUser, $sTag = '') { $this->sTag = $sTag; $this->oUser = $oUser; } function getDocumentCount() { $aOptions = array( 'select' => 'count(DISTINCT DTS.document_id) AS cnt', ); $aQuery = $this->getQuery($aOptions); if (PEAR::isError($aQuery)) { return 0; } $iRet = DBUtil::getOneResultKey($aQuery, 'cnt'); return $iRet; } function getBaseQuery($aOptions) { $aCriteriaSet = array( 'join'=>'AND', 'subgroup'=>array( 0=>array( 'join'=>'AND', 'values'=>array( 1=>array( 'data'=>array( 'ktcore.criteria.tagcloud' => $this->sTag, 'ktcore.criteria.tagcloud_not'=>0 ), 'type'=>'ktcore.criteria.tagcloud' ) ), ) ) ); $aQuery = KTSearchUtil::criteriaToQuery($aCriteriaSet, $this->oUser, 'ktcore.permissions.read', $aOptions); return $aQuery; } function getQuery($aOptions = null) { $aTagList = isset($_SESSION['tagList']) ? $_SESSION['tagList'] : array(); if(!empty($aTagList)){ $aPrevTag = end($aTagList); $documentList = $aPrevTag['docs']; } // If the document list is empty then create internal query with read permissions for the user and the first tag $aQuery = $this->getBaseQuery($aOptions); if(empty($documentList)){ return $aQuery; } $sQuery = $aQuery[0]; $sQuery .= " AND DTS.document_id IN ($documentList) "; $aQuery[0] = $sQuery; return $aQuery; } function getDocuments($iBatchSize, $iBatchStart, $sSortColumn, $sSortOrder, $sJoinClause = null, $aJoinParams = null) { $aOptions = array( 'select' => 'DISTINCT DTS.document_id AS id' ); $res = $this->getQuery($aOptions); if (PEAR::isError($res)) { return array(); } list($sQuery, $aParams) = $res; $sQuery .= ' ORDER BY ' . $sSortColumn . ' ' . $sSortOrder . ' '; $sQuery .= " LIMIT $iBatchStart, $iBatchSize"; $q = array($sQuery, $aParams); $res = DBUtil::getResultArray($q); return $res; }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?