Changeset 998

Show
Ignore:
Timestamp:
08/29/10 11:03:53 (18 months ago)
Author:
ort
Message:

update ORM by ajaxy

Location:
trunk/engine/classes
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/engine/classes/EntityORM.class.php

    r983 r998  
    2525        const RELATION_TYPE_HAS_MANY='has_many'; 
    2626        const RELATION_TYPE_HAS_ONE='has_one'; 
     27        const RELATION_TYPE_MANY_TO_MANY='many_to_many'; 
    2728         
    2829        protected $aRelations=array(); 
     
    3738        } 
    3839         
    39         public function _GetPrimatyKey() { 
     40        public function _GetPrimaryKey() { 
     41                if(!$this->_getDataOne($this->sPrimaryKey)) { 
     42                        $sModulePrefix=null; 
     43                        if (preg_match('/Entity([^_]+)/',get_class($this),$sModulePrefix)) {                                             
     44                                $sModulePrefix=func_underscore($sModulePrefix[1]).'_'; 
     45                                if($this->_getDataOne($sModulePrefix.$this->sPrimaryKey)) { 
     46                                        $this->sPrimaryKey=$sModulePrefix.$this->sPrimaryKey; 
     47                                } 
     48                        } 
     49                } 
    4050                return $this->sPrimaryKey; 
    4151        } 
     
    6272         
    6373        public function Delete() { 
     74                return $this->_Method(__FUNCTION__); 
     75        }        
     76         
     77        public function Reload() { 
    6478                return $this->_Method(__FUNCTION__); 
    6579        } 
     
    90104         
    91105        public function __call($sName,$aArgs) { 
    92                 $sType=strtolower(substr($sName,0,3)); 
    93                 if (!strpos($sName,'_') and in_array($sType,array('get','set'))) {                       
    94                         $sKey=func_underscore(substr($sName,3)); 
     106                $sType=substr($sName,0,strpos(func_underscore($sName),'_'));     
     107                if (!strpos($sName,'_') and in_array($sType,array('get','set','reload'))) {      
     108                        $sKey=func_underscore(str_replace($sType,'',$sName)); 
    95109                        if ($sType=='get') { 
    96110                                if (isset($this->_aData[$sKey])) { 
     
    111125                                        $sRelationType=$this->aRelations[$sKey][0]; 
    112126                                        $sRelationKey=$this->aRelations[$sKey][2]; 
     127                                        $sRelationJoinTable=null; 
     128                                        if($sRelationType == self::RELATION_TYPE_MANY_TO_MANY && array_key_exists(3, $this->aRelations[$sKey])) { 
     129                                                $sRelationJoinTable=$this->aRelations[$sKey][3]; 
     130                                        } 
    113131                                         
    114132                                        /** 
     
    119137                                        } 
    120138                                         
    121                                         $sModuleName=Engine::GetModuleName($sEntityRel); 
    122                                         $sEntityName=Engine::GetEntityName($sEntityRel); 
    123                                         $sPluginPrefix=Engine::GetPluginPrefix($sEntityRel); 
    124                                          
    125                                         $iPrimaryKeyValue=$this->_getDataOne($this->_GetPrimatyKey()); 
     139                                         
     140                                        $sRelModuleName=Engine::GetModuleName($sEntityRel); 
     141                                        $sRelEntityName=Engine::GetEntityName($sEntityRel); 
     142                                        $sRelPluginPrefix=Engine::GetPluginPrefix($sEntityRel); 
     143                                        $sRelPrimaryKey='id'; 
     144                                        if($oRelEntity=Engine::GetEntity($sEntityRel)) { 
     145                                                $sRelPrimaryKey=$oRelEntity->_GetPrimaryKey(); 
     146                                        } 
     147                                         
     148                                        $iPrimaryKeyValue=$this->_getDataOne($this->_GetPrimaryKey()); 
    126149                                         
    127150                                        $sCmd=''; 
    128151                                        $aCmdArgs=array(); 
    129152                                        switch ($sRelationType) { 
     153                                                case self::RELATION_TYPE_BELONGS_TO : 
     154                                                        $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}By".func_camelize($sRelPrimaryKey); 
     155                                                        $aCmdArgs[0]=$this->_getDataOne($sRelationKey); 
     156                                                        break; 
     157                                                case self::RELATION_TYPE_HAS_ONE : 
     158                                                        $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}By".func_camelize($sRelationKey); 
     159                                                        $aCmdArgs[0]=$iPrimaryKeyValue; 
     160                                                        break; 
    130161                                                case self::RELATION_TYPE_HAS_MANY : 
    131                                                         $sCmd="{$sPluginPrefix}{$sModuleName}_get{$sEntityName}ItemsBy".func_camelize($sRelationKey); 
     162                                                        $sCmd="{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsBy".func_camelize($sRelationKey); 
    132163                                                        $aCmdArgs[0]=$iPrimaryKeyValue; 
    133164                                                        break; 
    134                                                 case self::RELATION_TYPE_BELONGS_TO : 
    135                                                         $sCmd="{$sPluginPrefix}{$sModuleName}_get{$sEntityName}By".func_camelize($this->_GetPrimatyKey()); 
    136                                                         $aCmdArgs[0]=$this->_getDataOne($sRelationKey);                                                  
    137                                                 case self::RELATION_TYPE_HAS_ONE : 
     165                                                case self::RELATION_TYPE_MANY_TO_MANY : 
     166                                                  $sCmd="{$sRelPluginPrefix}Module{$sRelModuleName}_get{$sRelEntityName}ItemsByJoinTable"; 
     167                                                        $sByKey = strpos($this->_GetPrimaryKey(), $sModulePrefix) === 0 ? $this->_GetPrimaryKey() : $sModulePrefix.$this->_GetPrimaryKey(); 
     168                                                        $aCmdArgs[0] = array( 
     169                                                                'join_table'                    => $sRelationJoinTable, 
     170                                                                'relation_key'          => $sRelationKey, 
     171                                                                'by_key'                                        => $sByKey, 
     172                                                                'by_value'                              => $iPrimaryKeyValue, 
     173                                                        ); 
     174                                                        break; 
    138175                                                default: 
    139176                                                        break; 
    140                                         }                                        
     177                                        } 
    141178                                        $res=Engine::GetInstance()->_CallModule($sCmd,$aCmdArgs); 
    142                                          
     179 
    143180                                        $this->aRelationsData[$sKey]=$res; 
    144181                                        return $res; 
     
    152189                                        $this->_aData[$sKey]=$aArgs[0]; 
    153190                                } 
     191                        } elseif ($sType=='reload') { 
     192                                if (array_key_exists($sKey,$this->aRelationsData)) { 
     193                                        unset($this->aRelationsData[$sKey]); 
     194                                        return $this->__call('get'.func_camelize($sKey),$aArgs); 
     195                                } 
    154196                        } 
    155197                } else { 
  • trunk/engine/classes/MapperORM.class.php

    r983 r998  
    2929        } 
    3030         
    31         public function UpdateEntity($oEntity) {                 
     31        public function UpdateEntity($oEntity) { 
    3232                $sTableName = self::GetTableName($oEntity); 
    33                 $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimatyKey()); 
     33                $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimaryKey()); 
    3434                                 
    35                 $sql = "UPDATE ".$sTableName." SET ?a WHERE ".$oEntity->_GetPrimatyKey()." = ? ";  
     35                $sql = "UPDATE ".$sTableName." SET ?a WHERE ".$oEntity->_GetPrimaryKey()." = ? ";  
    3636                 
    3737                return $this->oDb->query($sql,$oEntity->_getData(),$iPrimaryKeyValue); 
     
    4040        public function DeleteEntity($oEntity) {                 
    4141                $sTableName = self::GetTableName($oEntity); 
    42                 $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimatyKey()); 
     42                $iPrimaryKeyValue=$oEntity->_getDataOne($oEntity->_GetPrimaryKey()); 
    4343                 
    44                 $sql = "DELETE FROM ".$sTableName." WHERE ".$oEntity->_GetPrimatyKey()." = ? ";  
     44                $sql = "DELETE FROM ".$sTableName." WHERE ".$oEntity->_GetPrimaryKey()." = ? ";  
    4545                return $this->oDb->query($sql,$iPrimaryKeyValue); 
    4646        } 
     
    130130        } 
    131131         
     132        public function GetItemsByJoinTable($aData,$sEntityFull) { 
     133                if(empty($aData)) { 
     134                        return null; 
     135                } 
     136                $sTableName = self::GetTableName($sEntityFull); 
     137                $sql = "SELECT a.*, b.* FROM ?# a LEFT JOIN ".$sTableName." b USING(?#) WHERE a.?#=?"; 
     138                $aItems = array(); 
     139                if($aRows=$this->oDb->select($sql, $aData['join_table'], $aData['relation_key'],  $aData['by_key'], $aData['by_value'])) { 
     140                        foreach($aRows as $aRow) { 
     141                                $oEntity=Engine::GetEntity($sEntityFull,$aRow); 
     142                                $oEntity->_SetIsNew(false); 
     143                                $aItems[] = $oEntity; 
     144                        }                        
     145                } 
     146                return $aItems; 
     147        } 
     148         
    132149        public static function GetTableName($oEntity) { 
    133150                /** 
     
    136153                 *      prefix_user_invite -> если модуль не сопадает с сущностью 
    137154                 */ 
    138                 $sModuleName = strtolower(Engine::GetModuleName($oEntity)); 
    139                 $sEntityName = strtolower(Engine::GetEntityName($oEntity)); 
    140                 if ($sModuleName==$sEntityName) { 
    141                         $sTable=$sModuleName; 
     155                $sModuleName = func_underscore(Engine::GetModuleName($oEntity)); 
     156                $sEntityName = func_underscore(Engine::GetEntityName($oEntity)); 
     157                if (strpos($sEntityName,$sModuleName)===0) { 
     158                        $sTable=func_underscore($sEntityName); 
    142159                } else { 
    143                         $sTable=$sModuleName.'_'.$sEntityName; 
     160                        $sTable=func_underscore($sModuleName).'_'.func_underscore($sEntityName); 
    144161                } 
    145162                if(Config::Get('db.table.'.$sTable)) { 
  • trunk/engine/classes/ModuleORM.class.php

    r983 r998  
    4141                } elseif ($res) { 
    4242                        // есть автоинкремент, устанавливаем его 
    43                         $oEntity->_setData(array($oEntity->_GetPrimatyKey() => $res)); 
     43                        $oEntity->_setData(array($oEntity->_GetPrimaryKey() => $res)); 
    4444                        return $oEntity; 
    4545                } 
     
    7474                        return $this->_UpdateEntity($oEntity); 
    7575                } 
     76        }        
     77         
     78         
     79        protected function _ReloadEntity($oEntity) { 
     80                if($sPrimaryKey=$oEntity->_getPrimaryKey()) { 
     81                        if($sPrimaryKeyValue=$oEntity->_getDataOne($sPrimaryKey)) { 
     82                                if($oEntityNew=$this->GetByFilter(array($sPrimaryKey=>$sPrimaryKeyValue),Engine::GetEntityName($oEntity))) { 
     83                                        $oEntity->_setData($oEntityNew->_getData()); 
     84                                        return $oEntity; 
     85                                } 
     86                        } 
     87                } 
     88                return false; 
    7689        } 
    7790         
     
    130143                                $sRelEntityName=Engine::GetEntityName($oRelEntityEmpty); 
    131144                                $sRelPluginPrefix=Engine::GetPluginPrefix($oRelEntityEmpty); 
    132                                 // ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrimatyKey() 
     145                                // ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrimaryKey() 
    133146                                $aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArrayId",array($aEntityKeys[$sRelKey])); 
    134147                                /** 
     
    158171                foreach ($aData as $oEntity) { 
    159172                        // здесь под вопросом какое поле использовать в качестве ключа, всегда примари или тот, который передан? 
    160                         $aEntities[$oEntity->_getDataOne($oEntity->_GetPrimatyKey())]=$oEntity; 
     173                        $aEntities[$oEntity->_getDataOne($oEntity->_GetPrimaryKey())]=$oEntity; 
    161174                } 
    162175                return $aEntities; 
    163176        } 
    164177         
    165         public function __call($sName,$aArgs) {          
     178        public function GetItemsByJoinTable($aJoinData=array(),$sEntityFull=null) { 
     179                if (is_null($sEntityFull)) { 
     180                        $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this)); 
     181                } elseif (!substr_count($sEntityFull,'_')) { 
     182                        $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.$sEntityFull; 
     183                } 
     184                return $this->oMapperORM->GetItemsByJoinTable($aJoinData,$sEntityFull); 
     185        } 
     186         
     187        public function __call($sName,$aArgs) { 
    166188                if (preg_match("@^add([\w]+)$@i",$sName,$aMatch)) { 
    167189                        return $this->_AddEntity($aArgs[0]); 
     
    178200                if (preg_match("@^delete([\w]+)$@i",$sName,$aMatch)) { 
    179201                        return $this->_DeleteEntity($aArgs[0]); 
     202                }        
     203                 
     204                if (preg_match("@^reload([\w]+)$@i",$sName,$aMatch)) { 
     205                        return $this->_ReloadEntity($aArgs[0]); 
    180206                } 
    181207                 
    182208                $sNameUnderscore=func_underscore($sName); 
    183                  
     209                $iEntityPosEnd=strlen($sNameUnderscore)-1;  
     210                if(substr_count($sNameUnderscore,'_items')) { 
     211                        $iEntityPosEnd=strpos($sNameUnderscore,'_items'); 
     212                } else if(substr_count($sNameUnderscore,'_by')) { 
     213                        $iEntityPosEnd=strpos($sNameUnderscore,'_by'); 
     214                } else if(substr_count($sNameUnderscore,'_all')) { 
     215                        $iEntityPosEnd=strpos($sNameUnderscore,'_all'); 
     216                } 
     217                $sEntityName=substr($sNameUnderscore,4,$iEntityPosEnd-4); 
     218                /** 
     219                 * getUserRoleJoinByUserIdAndRoleId() get_user-role-join_by_user_id_and_role_id 
     220                 */ 
     221                $sNameUnderscore=substr_replace($sNameUnderscore,str_replace('_','',$sEntityName),4,$iEntityPosEnd-4); 
     222                $sEntityName=func_camelize($sEntityName); 
    184223                /** 
    185224                 * getUserItemsByArrayId() get_user_items_by_array_id 
    186225                 */ 
    187226                if (preg_match("@^get_([a-z]+)_items_by_array_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) { 
    188                         return $this->GetItemsByArray(array($aMatch[2]=>$aArgs[0]),$aMatch[1]); 
     227                        return $this->GetItemsByArray(array($aMatch[2]=>$aArgs[0]),$sEntityName); 
     228                } 
     229                /** 
     230                 * getUserItemsByJoinTable() get_user_items_by_join_table 
     231                 */ 
     232                if (preg_match("@^get_([a-z]+)_items_by_join_table$@i",$sNameUnderscore,$aMatch)) { 
     233                        return $this->GetItemsByJoinTable($aArgs[0],func_camelize($sEntityName)); 
    189234                } 
    190235                /** 
     
    198243                        $aFilter=array_combine(explode('_and_',$aMatch[5]),$aArgs); 
    199244                        if ($aMatch[2]=='_items') { 
    200                                 return $this->GetItemsByFilter($aFilter,$aMatch[1]); 
     245                                return $this->GetItemsByFilter($aFilter,$sEntityName); 
    201246                        } else {                                 
    202                                 return $this->GetByFilter($aFilter,$aMatch[1]); 
     247                                return $this->GetByFilter($aFilter,$sEntityName); 
    203248                        } 
    204249                } 
     
    211256                                $aFilter=$aArgs[0]; 
    212257                        } 
    213                         return $this->GetItemsByFilter($aFilter,$aMatch[1]); 
     258                        return $this->GetItemsByFilter($aFilter,$sEntityName); 
    214259                } 
    215260