searchutil.inc.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 394 行 · 第 1/2 页

SVN-BASE
394
字号
     */    function permissionToSQL($oUser, $sPermissionName, $sItemTableName = "D") {        if (is_null($oUser)) {            return array("", array(), "");        }        if (is_null($sPermissionName)) {            $sPermissionName = 'ktcore.permissions.read';        }        $oPermission =& KTPermission::getByName($sPermissionName);        $sPermissionLookupsTable = KTUtil::getTableName('permission_lookups');        $sPermissionLookupAssignmentsTable = KTUtil::getTableName('permission_lookup_assignments');        $sPermissionDescriptorsTable = KTUtil::getTableName('permission_descriptors');        $sJoinSQL = "            INNER JOIN $sPermissionLookupsTable AS PL ON $sItemTableName.permission_lookup_id = PL.id            INNER JOIN $sPermissionLookupAssignmentsTable AS PLA ON PL.id = PLA.permission_lookup_id AND PLA.permission_id = ?            ";        $aPermissionDescriptors = KTPermissionUtil::getPermissionDescriptorsForUser($oUser);        if (count($aPermissionDescriptors) === 0) {            return PEAR::raiseError(_kt('You have no permissions'));        }        $sPermissionDescriptors = DBUtil::paramArray($aPermissionDescriptors);        $sSQLString = "PLA.permission_descriptor_id IN ($sPermissionDescriptors)";        $aParams = array($oPermission->getId());        $aParams = kt_array_merge($aParams, $aPermissionDescriptors);        return array($sSQLString, $aParams, $sJoinSQL);    }    // }}}    // {{{ criteriaToLegacyQuery    /**     * Converts a criteria set into a SQL query that returns all the     * information that the legacy search results page     * (PatternBrowsableSearchResults) requires for documents that     * fulfil the criteria.     *     * Like criteriaToQuery, a list with the following elements is     * returned:     *      - String containing the parameterised SQL query     *      - Array containing the parameters for the SQL query     */    function criteriaToLegacyQuery($aCriteriaSet, $oUser, $sPermissionName) {        global $default;        $aOptions = array(            'select' => "F.name AS folder_name, F.id AS folder_id, D.id AS document_id, D.name AS document_name, D.filename AS file_name, 'View' AS view",            'join' => "INNER JOIN $default->folders_table AS F ON D.folder_id = F.id",        );        return KTSearchUtil::criteriaToQuery($aCriteriaSet, $oUser, $sPermissionName, $aOptions);    }    // }}}    // {{{ criteriaToQuery    /**     * Converts a criteria set into a SQL query that (by default)     * returns the ids of documents that fulfil the criteria.     *     * $aOptions is a dictionary that can contain:     *      - select - a string that contains the list of columns     *        selected in the query     *      - join - a string that contains join conditions to satisfy     *        the select string passed or limit the documents included     *     * A list with the following elements is returned:     *      - String containing the parameterised SQL query     *      - Array containing the parameters for the SQL query     */    function criteriaToQuery($aCriteriaSet, $oUser, $sPermissionName, $aOptions = null) {        global $default;        $sSelect = KTUtil::arrayGet($aOptions, 'select', 'D.id AS document_id');        $sInitialJoin = KTUtil::arrayGet($aOptions, 'join', '');        if (is_array($sInitialJoin)) {            $aInitialJoinParams = $sInitialJoin[1];            $sInitialJoin = $sInitialJoin[0];        }	$res = KTSearchUtil::criteriaSetToSQL($aCriteriaSet);	if(PEAR::isError($res)) return $res;        list($sSQLSearchString, $aCritParams, $sCritJoinSQL) = $res;              $sToSearch = KTUtil::arrayGet($aOrigReq, 'fToSearch', 'Live'); // actually never present in this version.        $res = KTSearchUtil::permissionToSQL($oUser, $sPermissionName); 		        if (PEAR::isError($res)) {        // only occurs if the group has no permissions.            return $res;        } else {            list ($sPermissionString, $aPermissionParams, $sPermissionJoin) = $res;        }                /*         * This is to overcome the problem where $sPermissionString (or         * even $sSQLSearchString) is empty, leading to leading or         * trailing ANDs.         */        $aPotentialWhere = array($sPermissionString, 'SL.name = ?', "($sSQLSearchString)");                $aWhere = array();        foreach ($aPotentialWhere as $sWhere) {            if (empty($sWhere)) {                continue;            }            if ($sWhere == "()") {                continue;            }            $aWhere[] = $sWhere;                    }        $sWhere = "";        if ($aWhere) {            $sWhere = "\tWHERE " . join(" AND ", $aWhere);        }               //$sQuery = DBUtil::compactQuery("        $sQuery = sprintf("    SELECT        %s    FROM        %s AS D        LEFT JOIN %s AS DM ON D.metadata_version_id = DM.id        LEFT JOIN %s AS DC ON DM.content_version_id = DC.id        INNER JOIN $default->status_table AS SL on D.status_id=SL.id        %s        %s        %s        %s", $sSelect, KTUtil::getTableName('documents'),        KTUtil::getTableName('document_metadata_version'),        KTUtil::getTableName('document_content_version'),        $sInitialJoin,        $sCritJoinSQL,        $sPermissionJoin,        $sWhere        );    // GROUP BY D.id        $aParams = array();        $aParams = kt_array_merge($aParams, $aInitialJoinParams);        $aParams = kt_array_merge($aParams, $aPermissionParams);        $aParams[] = $sToSearch;        $aParams = kt_array_merge($aParams, $aCritParams);        return array($sQuery, $aParams);    }    // }}}    // {{{ testConditionOnDocument    /**     * Checks whether a condition (saved search) is fulfilled by the     * given document.     *     * For example, a condition may require a specific value in a     * metadata field.     *     * Returns either true or false (or a PEAR Error object)     */    function testConditionOnDocument($oSearch, $oDocument) {        $oSearch =& KTUtil::getObject('KTSavedSearch', $oSearch);        $iDocumentId = KTUtil::getId($oDocument);        /*         * Make a new criteria set, an AND of the existing criteria set         * and the sql statement requiring that D.id be the document id         * given to us.         */        $aCriteriaSet = array(            "join" => "AND",            "subgroup" => array(                $oSearch->getSearch(),                array(                    "join" => "AND",                    "values" => array(                        array(                            "sql" => array("D.id = ?", array($iDocumentId)),                        ),                    ),                ),            ),        );        $aOptions = array('select' => 'COUNT(DISTINCT(D.id)) AS cnt');        $aQuery = KTSearchUtil::criteriaToQuery($aCriteriaSet, null, null, $aOptions);        if (PEAR::isError($aQuery)) {          // caused by no permissions being set.            return false;         }        $cnt = DBUtil::getOneResultKey($aQuery, 'cnt');        if (PEAR::isError($cnt)) {            return $cnt;        }        if (is_null($cnt)) {            return false;        }        if (!is_numeric($cnt)) {            return PEAR::raiseError(_kt("Non-integer returned when looking for count"));        }        return $cnt > 0;    }    // }}}}

⌨️ 快捷键说明

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