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 + -
显示快捷键?