AntAclBase.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. Lib::loadClass('ACL');
  3. /**
  4. * SE/schema/ant-object/default_db.{rootTableName}/{name}/build.xml
  5. */
  6. class AntAclBase extends Core_AclBase {
  7. public function __construct($zasobID = 0) {
  8. $this->_zasobID = $zasobID;
  9. $this->_name = '';
  10. $this->_namespace = '';
  11. $this->_rootTableName = '';
  12. $this->_primaryKey = '';
  13. $this->_fields = [];
  14. }
  15. public function getName() { return $this->_name; }
  16. public function getNamespace() { return $this->_namespace; }
  17. public function getSourceName() { return 'default_db'; } // TODO: ?
  18. public function getRootTableName() { $this->_rootTableName; }
  19. public function getPrimaryKeyField() { $this->_primaryKey; }
  20. public function getFieldListByIdZasob() { return $this->getRealFieldListByIdZasob(); }
  21. public function getVirtualFieldListByIdZasob() { return []; }
  22. public function getVisibleFieldListByIdZasob() { return $this->getRealFieldListByIdZasob(); } // TODO: get visible fields
  23. public function getRealFieldListByIdZasob() {
  24. $cols = array();
  25. $fakeZasobId = 1000000;
  26. foreach ($this->getFields() as $field) {
  27. $idZasobField = ($field['idZasob']) ? $field['idZasob'] : $fakeZasobId++;
  28. $cols[$idZasobField] = $field['fieldNamespace'];
  29. }
  30. return $cols;
  31. }
  32. public function getFieldType($fieldName) { return null; }
  33. // try {
  34. // throw new Exception("TODO: AntAclBase::getFieldType({$fieldName})");
  35. // } catch (Exception $e) {
  36. // DBG::log($e);
  37. // }
  38. // $field = $this->_getField($fieldName);
  39. // return $field['xsdType'];
  40. // }
  41. public function getXsdFieldType($fieldName) {
  42. $field = $this->_getField($fieldName);
  43. return $field['xsdType'];
  44. }
  45. public function getXsdMaxOccurs($fieldName) {
  46. $field = $this->_getField($fieldName);
  47. return $field['maxOccurs'];
  48. }
  49. public function getXsdMinOccurs($fieldName) {
  50. $field = $this->_getField($fieldName);
  51. return $field['minOccurs'];
  52. }
  53. public function getAttributesFromZasoby() {
  54. return [];// TODO: ...
  55. }
  56. public function isGeomField($fieldName) {
  57. return ('the_geom' === $fieldName); // TODO: ...
  58. }
  59. public function isEnumerationField($fieldName) {
  60. return false; // TODO: ...
  61. }
  62. public function canWriteField($fieldName) {
  63. return false; // TODO: return $this->getPerms($fieldName)->canWrite()
  64. }
  65. public function canCreateField($fieldName) {
  66. return false; // TODO: return $this->getPerms($fieldName)->canCreate()
  67. }
  68. public function canReadField($fieldName) {
  69. return true; // TODO: return $this->getPerms($fieldName)->canRead()
  70. }
  71. public function canReadObjectField($fieldName, $object) {
  72. return true; // TODO: return $this->getPerms($fieldName, $object)->canRead()
  73. }
  74. public function getFields() {
  75. if (empty($this->_fields)) {
  76. // TODO: fetch fields from DB
  77. // Lib::loadClass('SchemaFactory');
  78. // $objectStorage = SchemaFactory::loadDefaultObject('SystemObject');
  79. // $item = $objectStorage->getItem($namespace, [
  80. // 'propertyName' => '*,field'
  81. // ]);
  82. }
  83. return $this->_fields;
  84. }
  85. public function _getField($fieldName) {
  86. foreach ($this->getFields() as $field) {
  87. if ($fieldName === $field['fieldNamespace']) return $field;
  88. }
  89. throw new Exception("Field not found '{$this->_namespace}/{$fieldName}'");
  90. }
  91. public function getSqlPrimaryKeyField() { return 'ID'; } // TODO: read from root object schema (_rootTableName)
  92. public function getTotal($params = []) {
  93. DBG::log($params, 'array', "AntAclBase::getTotal params");
  94. $idInstance = ACL::getInstanceId($this->_namespace);
  95. $instanceTable = ACL::getInstanceTable($this->_namespace);
  96. $sqlPrimaryKey = $this->getSqlPrimaryKeyField();
  97. return DB::getPDO()->fetchValue(" -- getTotal({$this->_namespace})
  98. select count(1)
  99. from `{$this->_rootTableName}` t
  100. join `{$instanceTable}` i on(i.pk = t.{$sqlPrimaryKey} and i.idInstance = {$idInstance})
  101. ");
  102. }
  103. public function getItems($params = []) {
  104. DBG::log($params, 'array', "AntAclBase::getItems params");
  105. $idInstance = ACL::getInstanceId($this->_namespace);
  106. $instanceTable = ACL::getInstanceTable($this->_namespace);
  107. $sqlPrimaryKey = $this->getSqlPrimaryKeyField();
  108. return DB::getPDO()->fetchAll(" -- getItems({$this->_namespace})
  109. select t.*
  110. from `{$this->_rootTableName}` t
  111. join `{$instanceTable}` i on(i.pk = t.{$sqlPrimaryKey} and i.idInstance = {$idInstance})
  112. ");
  113. }
  114. public static function buildInstance($idZasob, $conf = []) {
  115. static $_cache;
  116. if (!$_cache) $_cache = array();
  117. if (array_key_exists($idZasob, $_cache)) {
  118. return $_cache[$idZasob];
  119. }
  120. if (empty($conf)) {
  121. throw new Exception("Brak danych konfiguracyjnych do obiektu ant nr {$idZasob}");
  122. // TODO: fetch conf by $idZasob (or find $namespace first)
  123. // Lib::loadClass('SchemaFactory');
  124. // $objectStorage = SchemaFactory::loadDefaultObject('SystemObject');
  125. // $item = $objectStorage->getItem($namespace, [
  126. // 'propertyName' => '*,field'
  127. // ]);
  128. }
  129. DBG::log($conf, 'array', 'AntAclBase::buildInstance $conf');
  130. $acl = new AntAclBase($idZasob);
  131. $acl->_name = $conf['name'];
  132. $acl->_rootTableName = $conf['_rootTableName'];
  133. $acl->_namespace = $conf['namespace'];
  134. $acl->_fields = $conf['field']; // TODO: lazyLoading - use getFields() in all functions
  135. $acl->_primaryKey = $conf['primaryKey'];
  136. // 'idZasob' => '25872',
  137. // 'idDatabase' => '36',
  138. // 'namespace' => 'default_db/CRM_PROCES/CRM_PROCES',
  139. // '_rootTableName' => 'CRM_PROCES',
  140. // '_type' => 'AntAcl',
  141. // 'isActive' => '1',
  142. // 'isStructInstalled' => '1',
  143. // 'description' => '',
  144. // 'name' => 'CRM_PROCES',
  145. // 'nsPrefix' => 'default_db__x3A__CRM_PROCES',
  146. // 'typeName' => 'default_db__x3A__CRM_PROCES:CRM_PROCES',
  147. // 'reinstallLink' => 'https://biuro.biall-net.pl/dev-pl/se-master/index.php?_route=Storage&_task=objectReinstall&namespace=default_db/CRM_PROCES/CRM_PROCES',
  148. // 'field' => [
  149. // 0 => [
  150. // 'namespace' => 'default_db/CRM_PROCES/CRM_PROCES/ID',
  151. // 'fieldNamespace' => 'ID',
  152. // 'idZasob' => NULL,
  153. // 'idDatabase' => '36',
  154. // '_rootTableName' => 'CRM_PROCES',
  155. // 'objectNamespace' => 'default_db/CRM_PROCES/CRM_PROCES',
  156. // 'xsdType' => 'xsd:int',
  157. // 'xsdRestrictions' => '[]',
  158. // 'appInfo' => '[]',
  159. // 'minOccurs' => '0',
  160. // 'maxOccurs' => '1',
  161. // 'isActive' => '1',
  162. // 'description' => '',
  163. // ),
  164. $_cache[$idZasob] = $acl;
  165. return $_cache[$idZasob];
  166. }
  167. }