diff --git a/engine/classes/MapperORM.class.php b/engine/classes/MapperORM.class.php index 7c5d019c..bfe0a942 100644 --- a/engine/classes/MapperORM.class.php +++ b/engine/classes/MapperORM.class.php @@ -75,7 +75,50 @@ class MapperORM extends Mapper { public function GetItemsByFilter($aFilter,$sEntityFull) { $sTableName = self::GetTableName($sEntityFull); - + + // Сортировка + $sOrder=''; + if (isset($aFilter['#order'])) { + foreach ($aFilter['#order'] as $key=>$value) { + if (is_numeric($key)) { + $key=$value; + $value='asc'; + } elseif (!in_array($value,array('asc','desc'))) { + $value='asc'; + } + $sOrder.=" {$key} {$value},"; + } + $sOrder=trim($sOrder,','); + if ($sOrder!='') { + $sOrder="ORDER BY {$sOrder}"; + } + } + + // Постраничность + if (isset($aFilter['#page']) and is_array($aFilter['#page']) and count($aFilter['#page'])==2) { // array(2,15) - 2 - page, 15 - count + $aFilter['#limit']=array(($aFilter['#page'][0]-1)*$aFilter['#page'][1],$aFilter['#page'][1]); + } + + // Лимит + $sLimit=''; + if (isset($aFilter['#limit'])) { // допустимы варианты: limit=10 , limit=array(10) , limit=array(10,15) + $aLimit=$aFilter['#limit']; + if (is_numeric($aLimit)) { + $iBegin=0; + $iEnd=$aLimit; + } elseif (is_array($aLimit)) { + if (count($aLimit)>1) { + $iBegin=$aLimit[0]; + $iEnd=$aLimit[1]; + } else { + $iBegin=0; + $iEnd=$aLimit[0]; + } + } + $sLimit="LIMIT {$iBegin}, {$iEnd}"; + } + + $aFilterFields=array(); foreach ($aFilter as $k=>$v) { if (substr($k,0,1)=='#') { @@ -86,25 +129,49 @@ class MapperORM extends Mapper { } - $sFilterFields=''; + $sFilterFields=''; if (count($aFilterFields)) { $sFilterFields=' and '.implode(' = ? and ',array_keys($aFilterFields)).' = ? '; } - - $sql = "SELECT * FROM ".$sTableName." WHERE 1=1 {$sFilterFields} "; + $sql = "SELECT * FROM ".$sTableName." WHERE 1=1 {$sFilterFields} {$sOrder} {$sLimit} "; $aQueryParams=array_merge(array($sql),array_values($aFilterFields)); - $aItems=array(); if($aRows=call_user_func_array(array($this->oDb,'select'),$aQueryParams)) { foreach($aRows as $aRow) { $oEntity=Engine::GetEntity($sEntityFull,$aRow); $oEntity->_SetIsNew(false); $aItems[] = $oEntity; - } + } } return $aItems; } + + public function GetCountItemsByFilter($aFilter,$sEntityFull) { + $sTableName = self::GetTableName($sEntityFull); + + $aFilterFields=array(); + foreach ($aFilter as $k=>$v) { + if (substr($k,0,1)=='#') { + + } else { + $aFilterFields[$k]=$v; + } + } + + $sFilterFields=''; + if (count($aFilterFields)) { + $sFilterFields=' and '.implode(' = ? and ',array_keys($aFilterFields)).' = ? '; + } + $sql = "SELECT count(*) as c FROM ".$sTableName." WHERE 1=1 {$sFilterFields} "; + $aQueryParams=array_merge(array($sql),array_values($aFilterFields)); + if($aRow=call_user_func_array(array($this->oDb,'selectRow'),$aQueryParams)) { + return $aRow['c']; + } + return 0; + } + + public function GetItemsByArray($aFilter,$sEntityFull) { $sTableName = self::GetTableName($sEntityFull); diff --git a/engine/classes/ModuleORM.class.php b/engine/classes/ModuleORM.class.php index daaa0f84..e29e10ba 100644 --- a/engine/classes/ModuleORM.class.php +++ b/engine/classes/ModuleORM.class.php @@ -142,8 +142,11 @@ abstract class ModuleORM extends Module { $sRelModuleName=Engine::GetModuleName($oRelEntityEmpty); $sRelEntityName=Engine::GetEntityName($oRelEntityEmpty); $sRelPluginPrefix=Engine::GetPluginPrefix($oRelEntityEmpty); - // ItemsByArrayId - id пока идет костылем, т.к. у стандартных сущностей нет метода _GetPrimaryKey() - $aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArrayId",array($aEntityKeys[$sRelKey])); + $sPrimaryKey="Id"; + if ($sPrimaryKey=$oRelEntityEmpty->_GetPrimaryKey()) { + $sPrimaryKey=ucfirst($sPrimaryKey); + } + $aRelData=Engine::GetInstance()->_CallModule("{$sRelPluginPrefix}{$sRelModuleName}_get{$sRelEntityName}ItemsByArray{$sPrimaryKey}",array($aEntityKeys[$sRelKey])); /** * Собираем набор */ @@ -156,9 +159,27 @@ abstract class ModuleORM extends Module { } + /** + * Если запрашиваем постраничный список, то возвращаем сам список и общее количество записей + */ + if (isset($aFilter['#page'])) { + return array('collection'=>$aEntities,'count'=>$this->GetCountItemsByFilter($aFilter,$sEntityFull)); + } return $aEntities; } + public function GetCountItemsByFilter($aFilter=array(),$sEntityFull=null) { + if (is_null($sEntityFull)) { + $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this)); + } elseif (!substr_count($sEntityFull,'_')) { + $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.$sEntityFull; + } + + $iCount=$this->oMapperORM->GetCountItemsByFilter($aFilter,$sEntityFull); + + return $iCount; + } + public function GetItemsByArray($aFilter,$sEntityFull=null) { if (is_null($sEntityFull)) { $sEntityFull=Engine::GetPluginPrefix($this).'Module'.Engine::GetModuleName($this).'_Entity'.Engine::GetModuleName(get_class($this)); @@ -240,7 +261,12 @@ abstract class ModuleORM extends Module { * */ if (preg_match("@^get_([a-z]+)((_items)|())_by_([_a-z]+)$@i",$sNameUnderscore,$aMatch)) { - $aFilter=array_combine(explode('_and_',$aMatch[5]),$aArgs); + $aSearchParams=explode('_and_',$aMatch[5]); + $aSplit=array_chunk($aArgs,count($aSearchParams)); + $aFilter=array_combine($aSearchParams,$aSplit[0]); + if (isset($aSplit[1][0])) { + $aFilter=array_merge($aFilter,$aSplit[1][0]); + } if ($aMatch[2]=='_items') { return $this->GetItemsByFilter($aFilter,$sEntityName); } else {