|
@@ -1,8 +1,11 @@
|
|
|
<?php
|
|
<?php
|
|
|
|
|
|
|
|
|
|
+Lib::loadClass('Core_AclHelper');
|
|
|
|
|
|
|
|
class ACL {
|
|
class ACL {
|
|
|
|
|
|
|
|
|
|
+ public static $REF_TABLE_VERSION = 1;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Ids List of Proces Init for given tabel (skip filters)
|
|
* Ids List of Proces Init for given tabel (skip filters)
|
|
|
*/
|
|
*/
|
|
@@ -35,19 +38,19 @@ SQL;
|
|
|
SQL;
|
|
SQL;
|
|
|
/*
|
|
/*
|
|
|
SELECT p.`ID` , p.`DESC`
|
|
SELECT p.`ID` , p.`DESC`
|
|
|
- FROM `CRM_PROCES` p
|
|
|
|
|
|
|
+ FROM `CRM_PROCES` p
|
|
|
WHERE p.`ID`
|
|
WHERE p.`ID`
|
|
|
IN (
|
|
IN (
|
|
|
SELECT i.`idx_PROCES_INIT_ID`
|
|
SELECT i.`idx_PROCES_INIT_ID`
|
|
|
- FROM `CRM_PROCES_idx` i
|
|
|
|
|
|
|
+ FROM `CRM_PROCES_idx` i
|
|
|
WHERE i.`ID_PROCES`
|
|
WHERE i.`ID_PROCES`
|
|
|
IN (
|
|
IN (
|
|
|
SELECT tpv.`ID_PROCES`
|
|
SELECT tpv.`ID_PROCES`
|
|
|
- FROM `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
|
|
|
|
|
- WHERE tpv.`ID_TABLE` = '13051'
|
|
|
|
|
|
|
+ FROM `CRM_PROCES_idx_TABLE_TO_PROCES_VIEW` tpv
|
|
|
|
|
+ WHERE tpv.`ID_TABLE` = '13051'
|
|
|
)
|
|
)
|
|
|
)
|
|
)
|
|
|
- AND p.`TYPE` = 'PROCES_INIT'
|
|
|
|
|
|
|
+ AND p.`TYPE` = 'PROCES_INIT'
|
|
|
order by p.`SORT_PRIO`
|
|
order by p.`SORT_PRIO`
|
|
|
*/
|
|
*/
|
|
|
$fetchTableProcesInitListSql = <<<SQL
|
|
$fetchTableProcesInitListSql = <<<SQL
|
|
@@ -167,4 +170,87 @@ SQL;
|
|
|
}
|
|
}
|
|
|
return $isAllowed;
|
|
return $isAllowed;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ public static function getAclByNamespace($namespace, $forceTblAclInit = false) {
|
|
|
|
|
+ return Core_AclHelper::getAclByNamespace($namespace, $forceTblAclInit);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static function parseNamespaceUrl($namespace) {// returns assoc array: [ 'name', 'url', 'prefix', 'sourceName' ]
|
|
|
|
|
+ return Core_AclHelper::parseNamespaceUrl($namespace);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static function getRefTable($rootObjectNamespace, $childName) {
|
|
|
|
|
+ static $cacheRefTables = array();
|
|
|
|
|
+ $cacheKey = "{$rootObjectNamespace}/{$childName}";
|
|
|
|
|
+ if (array_key_exists($cacheKey, $cacheRefTables)) return $cacheRefTables[$cacheKey];
|
|
|
|
|
+
|
|
|
|
|
+ $rootAcl = self::getAclByNamespace($rootObjectNamespace);
|
|
|
|
|
+ $childXsdType = $rootAcl->getXsdFieldType($childName);
|
|
|
|
|
+ if ('ref_uri:' !== substr($childXsdType, 0, 8)) throw new Exception("Expected ref type for field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
|
|
|
+ $childNamespace = substr($childXsdType, 8);
|
|
|
|
|
+ $childAcl = self::getAclByNamespace($childNamespace);
|
|
|
|
|
+
|
|
|
|
|
+ $refInfo = [];// define $refInfo = [ ID, A_STATUS, VERSION ]
|
|
|
|
|
+ try {// check that ref config table exists
|
|
|
|
|
+ $sqlRootTableNs = DB::getPDO()->quote($rootObjectNamespace, PDO::PARAM_STR);
|
|
|
|
|
+ $sqlChildName = DB::getPDO()->quote($childName, PDO::PARAM_STR);
|
|
|
|
|
+ $sqlChildNamespace = DB::getPDO()->quote($childNamespace, PDO::PARAM_STR);
|
|
|
|
|
+ $refInfo = DB::getPDO()->fetchFirst("
|
|
|
|
|
+ select c.ID, c.A_STATUS, c.VERSION
|
|
|
|
|
+ from `CRM_REF_CONFIG` c
|
|
|
|
|
+ where c.ROOT_OBJECT_NS = {$sqlRootTableNs}
|
|
|
|
|
+ and c.CHILD_NAME = {$sqlChildName}
|
|
|
|
|
+ and c.CHILD_NS = {$sqlChildNamespace}
|
|
|
|
|
+ ");
|
|
|
|
|
+ } catch (Exception $e) {
|
|
|
|
|
+ DB::getPDO()->exec("
|
|
|
|
|
+ CREATE TABLE `CRM_REF_CONFIG` (
|
|
|
|
|
+ `ID` INT NOT NULL AUTO_INCREMENT
|
|
|
|
|
+ , `ROOT_OBJECT_NS` VARCHAR(255) NOT NULL
|
|
|
|
|
+ , `CHILD_NAME` VARCHAR(255) NOT NULL
|
|
|
|
|
+ , `CHILD_NS` VARCHAR(255) NOT NULL
|
|
|
|
|
+ , `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING'
|
|
|
|
|
+ , `VERSION` int(11) NOT NULL DEFAULT 0
|
|
|
|
|
+ , PRIMARY KEY (`ID`)
|
|
|
|
|
+ ) ENGINE = MyISAM DEFAULT CHARSET=latin2;
|
|
|
|
|
+ ");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (empty($refInfo)) {
|
|
|
|
|
+ $refInfo = [ 'ID' => 0, 'A_STATUS' => 'WAITING', 'VERSION' => 0 ];
|
|
|
|
|
+ $refInfo['ID'] = DB::getPDO()->insert("CRM_REF_CONFIG", [
|
|
|
|
|
+ 'ROOT_OBJECT_NS' => $rootObjectNamespace,
|
|
|
|
|
+ 'CHILD_NAME' => $childName,
|
|
|
|
|
+ 'CHILD_NS' => $childNamespace
|
|
|
|
|
+ ]);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!$refInfo['ID']) throw new Exception("Ref table not found in ref config table for field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
|
|
|
+
|
|
|
|
|
+ $refTableName = "CRM__#REF_TABLE__{$refInfo['ID']}";
|
|
|
|
|
+ if ('WAITING' == $refInfo['A_STATUS']) {
|
|
|
|
|
+ DB::getPDO()->exec("
|
|
|
|
|
+ CREATE TABLE IF NOT EXISTS `{$refTableName}` (
|
|
|
|
|
+ `PRIMARY_KEY` int(11) NOT NULL
|
|
|
|
|
+ , `REMOTE_PRIMARY_KEY` int(11) NOT NULL
|
|
|
|
|
+ , `REMOTE_TYPENAME` varchar(255) NOT NULL DEFAULT ''
|
|
|
|
|
+ , `A_STATUS` enum('WAITING', 'NORMAL', 'DELETED') NOT NULL DEFAULT 'WAITING'
|
|
|
|
|
+ , `A_RECORD_UPDATE_DATE` timestamp ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
+ , `TRANACTION_ID` int(11) NOT NULL
|
|
|
|
|
+ , KEY `PRIMARY_KEY` (`PRIMARY_KEY`)
|
|
|
|
|
+ , KEY `REMOTE_PRIMARY_KEY` (`REMOTE_PRIMARY_KEY`)
|
|
|
|
|
+ ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
|
|
|
|
|
+ ");
|
|
|
|
|
+ $refInfo['A_STATUS'] = "NORMAL";
|
|
|
|
|
+ $refInfo['VERSION'] = self::$REF_TABLE_VERSION;
|
|
|
|
|
+ $affected = DB::getPDO()->update("CRM_REF_CONFIG", 'ID', $refInfo['ID'], [
|
|
|
|
|
+ 'A_STATUS' => $refInfo['A_STATUS'],
|
|
|
|
|
+ 'VERSION' => $refInfo['VERSION']
|
|
|
|
|
+ ]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ($refInfo['VERSION'] < self::$REF_TABLE_VERSION) throw new Exception("TODO: ref table {$refInfo['ID']} require upgrade - field '{$childName}' in object '{$rootObjectNamespace}'");
|
|
|
|
|
+
|
|
|
|
|
+ $cacheRefTables[$cacheKey] = $refTableName;
|
|
|
|
|
+ return $refTableName;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|