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