fetchValue(" select count(*) as total from `{$tableName}` "); } static function getAllSelected($typeName) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); return DB::getPDO()->fetchValuesList(" select primaryKey from `{$tableName}` "); } static function getAllSelectedAsSqlSubQuery($typeName) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); return " select primaryKey from `{$tableName}` "; } static function getSelectState($typeName, array $listPrimaryKeys) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); if (empty($listPrimaryKeys)) return []; $dbQuote = [ DB::getPDO(), 'quote' ]; $sqlPks = implode(", ", array_map(function ($pk) use ($dbQuote) { return $dbQuote($pk); }, $listPrimaryKeys)); $selected = DB::getPDO()->fetchValuesListByKey(" select primaryKey from `{$tableName}` where primaryKey in ( {$sqlPks} ) ", $key = 'primaryKey'); return array_combine($listPrimaryKeys, array_map(function ($pk) use ($selected) { return in_array($pk, $selected); }, $listPrimaryKeys)); } static function selectAllByFilter($typeName, array $filterQuery) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); $acl = ACL::getAclByTypeName($typeName); $args = []; parse_str($filterQuery[0], $args); DBG::log(['$filterQuery' => $filterQuery, '$args' => $args], 'array', "DBG: selectAllByFilter"); $params = []; $params['limit'] = 0; $params['cols'] = [ $acl->getPrimaryKeyField() ]; foreach ($args as $k => $v) { if (strlen($k) > 3 && substr($k, 0, 2) == 'f_' && strlen($v) > 0) {// filter prefix $params[$k] = $v; } else if (strlen($k) > 4 && substr($k, 0, 3) == 'sf_' && strlen($v) > 0) {// special filter prefix $params[$k] = $v; } } $queryFeatures = $acl->buildQuery($params); DBG::log($queryFeatures, 'array', '$queryFeatures'); try { $sql = $queryFeatures->getRawQueryPrimaryKeys(); DBG::log($sql, 'string', 'sql getRawQueryPrimaryKeys'); Lib::loadClass('FeatureAttrSelected'); $userSelectedTableName = FeatureAttrSelected::getAttributeTableName($typeName = $acl->getNamespace(), $idUser = User::getID()); DB::getPDO()->execSql(" insert ignore into `{$userSelectedTableName}` (`primaryKey`) select `selectedTable`.`@primaryKey` from ( {$sql} ) as `selectedTable` "); } catch (Exception $e) { DBG::log($e); DBG::log('legacyMode - execute query for all primary keys'); $listItems = $queryFeatures->getItems(); $listPrimaryKeys = array_map(function ($item) { return $item['ID']; }, $listItems); foreach ($listPrimaryKeys as $pk) { DB::getPDO()->execSql(" insert ignore `{$tableName}` (`primaryKey`) values ( :pk ) ", [ ':pk' => $pk ]); } } } static function select($typeName, array $listPrimaryKeys) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); foreach ($listPrimaryKeys as $pk) { DB::getPDO()->execSql(" insert ignore `{$tableName}` (`primaryKey`) values ( :pk ) ", [ ':pk' => $pk ]); } } static function unselect($typeName, array $listPrimaryKeys) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); foreach ($listPrimaryKeys as $pk) { DB::getPDO()->execSql(" delete from `{$tableName}` where `primaryKey` = :pk ", [ ':pk' => $pk ]); } } static function unselectAll($typeName) { $idUser = User::getID(); self::prepareUserTable($typeName, $idUser); $tableName = self::getAttributeTableName($typeName, $idUser); DB::getPDO()->execSql(" truncate table `{$tableName}` "); } static function prepareUserTable($typeName, $idUser) { static $_created = []; $key = "{$typeName}-{$idUser}"; if (!array_key_exists($key, $_created)) { self::_prepareUserTable($typeName, $idUser); $_created[$key] = true; } } static function _prepareUserTable($typeName, $idUser) { $tableName = self::getAttributeTableName($typeName, $idUser); // TODO: primaryKey type from $acl // TODO: table name limit to 64 chars DB::getPDO()->execSql(" CREATE TABLE IF NOT EXISTS `{$tableName}` ( `primaryKey` int(11) NOT NULL, UNIQUE KEY `primaryKey` (`primaryKey`) ) ENGINE=MyISAM DEFAULT CHARSET=latin2; "); } // @example FeatureAttrSelected::getAttributeTableName($typeName, $idUser); static function getAttributeTableName($typeName, $idUser) { static $_created = []; $key = "{$typeName}-{$idUser}"; if (!array_key_exists($key, $_created)) { $_created[$key] = self::_getAttributeTableName($typeName, $idUser); } return $_created[$key]; } static function _getAttributeTableName($typeName, $idUser) { $acl = ACL::getAclByTypeName($typeName); $rootTableName = $acl->getRootTableName(); return "{$rootTableName}__@selected_{$idUser}"; } }