From b703fad0fa5c1e8201b644ca5b26bc2133ed8efb Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Sat, 13 Nov 2010 05:43:25 +0000 Subject: [PATCH] ORM/ActiveRecoed usability upgrade. Now we can use: Sample_GetItemsByParam1AndParam2('foo','bar') instead of Sample_GetSampleItemsBySampleParam1AndSampleParam2('foo','bar') $oSample->setTitle()/getTitle() instead of $oSample->setSampleTitle()/getSampleTitle() Primary key definition improved. --- engine/classes/EntityORM.class.php | 64 ++++++++++++++++++++++-------- engine/classes/MapperORM.class.php | 39 +++++++++++++++--- engine/classes/ModuleORM.class.php | 58 +++++++++++++++++---------- 3 files changed, 117 insertions(+), 44 deletions(-) diff --git a/engine/classes/EntityORM.class.php b/engine/classes/EntityORM.class.php index 14bc6b27..507a4bfa 100644 --- a/engine/classes/EntityORM.class.php +++ b/engine/classes/EntityORM.class.php @@ -27,6 +27,8 @@ abstract class EntityORM extends Entity { const RELATION_TYPE_MANY_TO_MANY='many_to_many'; const RELATION_TYPE_TREE='tree'; + protected $aFields=array(); + protected $aRelations=array(); protected $aRelationsData=array(); @@ -34,17 +36,17 @@ abstract class EntityORM extends Entity { protected $bIsNew=true; - public function __construct($aParam = false) { + public function __construct($aParam=false) { parent::__construct($aParam); } public function _GetPrimaryKey() { if(!$this->_getDataOne($this->sPrimaryKey)) { - $sModulePrefix=null; - if (preg_match('/Entity([^_]+)/',get_class($this),$sModulePrefix)) { - $sModulePrefix=func_underscore($sModulePrefix[1]).'_'; - if($this->_getDataOne($sModulePrefix.$this->sPrimaryKey)) { - $this->sPrimaryKey=$sModulePrefix.$this->sPrimaryKey; + if($this->_getFields()) { + if(array_key_exists('#primary_key',$this->aFields)) { + $this->sPrimaryKey = $this->aFields['#primary_key']; + } else { + $this->sPrimaryKey = $this->_getField($this->sPrimaryKey); } } } @@ -77,6 +79,10 @@ abstract class EntityORM extends Entity { public function Reload() { return $this->_Method(__FUNCTION__); + } + + public function ShowColumns() { + return $this->_Method(__FUNCTION__ .'From'); } public function getChildren() { @@ -164,6 +170,35 @@ abstract class EntityORM extends Entity { } } + public function _getFields() { + if(empty($this->aFields)) { + $this->aFields=$this->ShowColumns(); + } + return $this->aFields; + } + + public function _getField($sField) { + if($aFields=$this->_getFields()) { + if(in_array($sField,$aFields)) { + return $sField; + } + $sFieldU = func_camelize($sField); + $sEntityField = func_underscore(Engine::GetEntityName($this).$sFieldU); + if(in_array($sEntityField,$aFields)) { + return $sEntityField; + } + $sModuleEntityField = func_underscore(Engine::GetModuleName($this).Engine::GetEntityName($this).$sFieldU); + if(in_array($sModuleEntityField,$aFields)) { + return $sModuleEntityField; + } + $sModuleField = func_underscore(Engine::GetModuleName($this).$sFieldU); + if(in_array($sModuleField,$aFields)) { + return $sModuleField; + } + } + return $sField; + } + public function _getRelations() { return $this->aRelations; } @@ -184,11 +219,9 @@ abstract class EntityORM extends Entity { if (isset($this->_aData[$sKey])) { return $this->_aData[$sKey]; } else { - if (preg_match('/Entity([^_]+)/',get_class($this),$sModulePrefix)) { - $sModulePrefix=func_underscore($sModulePrefix[1]).'_'; - if (isset($this->_aData[$sModulePrefix.$sKey])) { - return $this->_aData[$sModulePrefix.$sKey]; - } + $sField=$this->_getField($sKey); + if($sField!=$sKey && isset($this->_aData[$sField])) { + return $this->_aData[$sField]; } } /** @@ -238,12 +271,11 @@ abstract class EntityORM extends Entity { break; case self::RELATION_TYPE_MANY_TO_MANY : $sCmd="{$sRelPluginPrefix}Module{$sRelModuleName}_get{$sRelEntityName}ItemsByJoinTable"; - $sByKey = strpos($this->_GetPrimaryKey(), $sModulePrefix) === 0 ? $this->_GetPrimaryKey() : $sModulePrefix.$this->_GetPrimaryKey(); $aCmdArgs[0] = array( - 'join_table' => $sRelationJoinTable, + 'join_table' => $sRelationJoinTable, 'relation_key' => $sRelationKey, - 'by_key' => $sByKey, - 'by_value' => $iPrimaryKeyValue, + 'by_key' => $this->_GetPrimaryKey(), + 'by_value' => $iPrimaryKeyValue, ); break; default: @@ -260,7 +292,7 @@ abstract class EntityORM extends Entity { if (array_key_exists($sKey,$this->aRelations)) { $this->aRelationsData[$sKey]=$aArgs[0]; } else { - $this->_aData[$sKey]=$aArgs[0]; + $this->_aData[$this->_getField($sKey)]=$aArgs[0]; } } elseif ($sType=='reload') { if (array_key_exists($sKey,$this->aRelationsData)) { diff --git a/engine/classes/MapperORM.class.php b/engine/classes/MapperORM.class.php index 2cd64cf5..251dbfd2 100644 --- a/engine/classes/MapperORM.class.php +++ b/engine/classes/MapperORM.class.php @@ -46,6 +46,7 @@ class MapperORM extends Mapper { } public function GetByFilter($aFilter,$sEntityFull) { + $oEntitySample=Engine::GetEntity($sEntityFull); $sTableName = self::GetTableName($sEntityFull); $aFilterFields=array(); @@ -53,7 +54,7 @@ class MapperORM extends Mapper { if (substr($k,0,1)=='#') { } else { - $aFilterFields[$k]=$v; + $aFilterFields[$oEntitySample->_getField($k)]=$v; } } @@ -74,6 +75,7 @@ class MapperORM extends Mapper { } public function GetItemsByFilter($aFilter,$sEntityFull) { + $oEntitySample=Engine::GetEntity($sEntityFull); $sTableName = self::GetTableName($sEntityFull); // Сортировка @@ -124,7 +126,7 @@ class MapperORM extends Mapper { if (substr($k,0,1)=='#') { } else { - $aFilterFields[$k]=$v; + $aFilterFields[$oEntitySample->_getField($k)]=$v; } } @@ -148,6 +150,7 @@ class MapperORM extends Mapper { public function GetCountItemsByFilter($aFilter,$sEntityFull) { + $oEntitySample=Engine::GetEntity($sEntityFull); $sTableName = self::GetTableName($sEntityFull); $aFilterFields=array(); @@ -155,7 +158,7 @@ class MapperORM extends Mapper { if (substr($k,0,1)=='#') { } else { - $aFilterFields[$k]=$v; + $aFilterFields[$oEntitySample->_getField($k)]=$v; } } @@ -173,9 +176,13 @@ class MapperORM extends Mapper { public function GetItemsByArray($aFilter,$sEntityFull) { + $oEntitySample=Engine::GetEntity($sEntityFull); $sTableName = self::GetTableName($sEntityFull); - $aFilterFields=$aFilter; + $aFilterFields=array(); + foreach($aFilter as $k=>$v) { + $aFilterFields[$oEntitySample->_getField($k)]=$v; + } $sFilterFields=''; if (count($aFilterFields)) { @@ -197,9 +204,13 @@ class MapperORM extends Mapper { } public function GetCountItemsByArray($aFilter,$sEntityFull) { + $oEntitySample=Engine::GetEntity($sEntityFull); $sTableName = self::GetTableName($sEntityFull); - $aFilterFields=$aFilter; + $aFilterFields=array(); + foreach($aFilter as $k=>$v) { + $aFilterFields[$oEntitySample->_getField($k)]=$v; + } $sFilterFields=''; if (count($aFilterFields)) { @@ -216,6 +227,7 @@ class MapperORM extends Mapper { return 0; } + public function GetItemsByJoinTable($aData,$sEntityFull) { if(empty($aData)) { return null; @@ -223,7 +235,7 @@ class MapperORM extends Mapper { $sTableName = self::GetTableName($sEntityFull); $sql = "SELECT a.*, b.* FROM ?# a LEFT JOIN ".$sTableName." b USING(?#) WHERE a.?#=?"; $aItems = array(); - if($aRows=$this->oDb->select($sql, $aData['join_table'], $aData['relation_key'], $aData['by_key'], $aData['by_value'])) { + if($aRows=$this->oDb->select($sql, $aData['join_table'],$aData['relation_key'],$aData['by_key'],$aData['by_value'])) { foreach($aRows as $aRow) { $oEntity=Engine::GetEntity($sEntityFull,$aRow); $oEntity->_SetIsNew(false); @@ -233,6 +245,21 @@ class MapperORM extends Mapper { return $aItems; } + public function ShowColumnsFrom($oEntity) { + $sTableName = self::GetTableName($oEntity); + $sql = "SHOW COLUMNS FROM ".$sTableName; + $aItems = array(); + if($aRows=$this->oDb->select($sql)) { + foreach($aRows as $aRow) { + $aItems[] = $aRow['Field']; + if($aRow['Key']=='PRI') { + $aItems['#primary_key'] = $aRow['Field']; + } + } + } + return $aItems; + } + public static function GetTableName($oEntity) { /** * Варианты таблиц: diff --git a/engine/classes/ModuleORM.class.php b/engine/classes/ModuleORM.class.php index 91ccb991..c73a79a6 100644 --- a/engine/classes/ModuleORM.class.php +++ b/engine/classes/ModuleORM.class.php @@ -32,7 +32,6 @@ abstract class ModuleORM extends Module { } - protected function _AddEntity($oEntity) { $res=$this->oMapperORM->AddEntity($oEntity); if ($res===0) { @@ -57,16 +56,7 @@ abstract class ModuleORM extends Module { } return false; } - - protected function _DeleteEntity($oEntity) { - $res=$this->oMapperORM->DeleteEntity($oEntity); - if ($res) { - return $oEntity; - } - return false; - } - - + protected function _SaveEntity($oEntity) { if ($oEntity->_isNew()) { return $this->_AddEntity($oEntity); @@ -75,6 +65,13 @@ abstract class ModuleORM extends Module { } } + protected function _DeleteEntity($oEntity) { + $res=$this->oMapperORM->DeleteEntity($oEntity); + if ($res) { + return $oEntity; + } + return false; + } protected function _ReloadEntity($oEntity) { if($sPrimaryKey=$oEntity->_getPrimaryKey()) { @@ -88,7 +85,13 @@ abstract class ModuleORM extends Module { } return false; } - + + + protected function _ShowColumnsFrom($oEntity) { + $res=$this->oMapperORM->ShowColumnsFrom($oEntity); + return $res; + } + protected function _GetChildrenOfEntity($oEntity) { if(in_array(EntityORM::RELATION_TYPE_TREE,$oEntity->_getRelations())) { @@ -357,27 +360,31 @@ abstract class ModuleORM extends Module { if (preg_match("@^delete([\w]+)$@i",$sName,$aMatch)) { return $this->_DeleteEntity($aArgs[0]); - } + } if (preg_match("@^reload([\w]+)$@i",$sName,$aMatch)) { return $this->_ReloadEntity($aArgs[0]); } + if (preg_match("@^showcolumnsfrom([\w]+)$@i",$sName,$aMatch)) { + return $this->_ShowColumnsFrom($aArgs[0]); + } + if (preg_match("@^getchildrenof([\w]+)$@i",$sName,$aMatch)) { return $this->_GetChildrenOfEntity($aArgs[0]); - } + } if (preg_match("@^getparentof([\w]+)$@i",$sName,$aMatch)) { return $this->_GetParentOfEntity($aArgs[0]); - } + } if (preg_match("@^getdescendantsof([\w]+)$@i",$sName,$aMatch)) { return $this->_GetDescendantsOfEntity($aArgs[0]); - } + } if (preg_match("@^getancestorsof([\w]+)$@i",$sName,$aMatch)) { return $this->_GetAncestorsOfEntity($aArgs[0]); - } + } if (preg_match("@^loadtreeof([\w]+)$@i",$sName,$aMatch)) { $sEntityFull = array_key_exists(1,$aMatch) ? $aMatch[1] : null; @@ -385,19 +392,26 @@ abstract class ModuleORM extends Module { } $sNameUnderscore=func_underscore($sName); - $iEntityPosEnd=strlen($sNameUnderscore)-1; - if(substr_count($sNameUnderscore,'_items')) { + $iEntityPosEnd=0; + if(strpos($sNameUnderscore,'_items')>4) { $iEntityPosEnd=strpos($sNameUnderscore,'_items'); - } else if(substr_count($sNameUnderscore,'_by')) { + } else if(strpos($sNameUnderscore,'_by')>4) { $iEntityPosEnd=strpos($sNameUnderscore,'_by'); - } else if(substr_count($sNameUnderscore,'_all')) { + } else if(strpos($sNameUnderscore,'_all')>4) { $iEntityPosEnd=strpos($sNameUnderscore,'_all'); } - $sEntityName=substr($sNameUnderscore,4,$iEntityPosEnd-4); + if($iEntityPosEnd) { + $sEntityName=substr($sNameUnderscore,4,$iEntityPosEnd-4); + } else { + $sEntityName=func_underscore(Engine::GetModuleName($this)).'_'; + $sNameUnderscore=substr_replace($sNameUnderscore,$sEntityName,4,0); + $iEntityPosEnd=strlen($sEntityName)-1+4; + } /** * getUserRoleJoinByUserIdAndRoleId() get_user-role-join_by_user_id_and_role_id */ $sNameUnderscore=substr_replace($sNameUnderscore,str_replace('_','',$sEntityName),4,$iEntityPosEnd-4); + $sEntityName=func_camelize($sEntityName); /** * getUserItemsByArrayId() get_user_items_by_array_id