/** * Построение дополнительного фильтра * Здесь учитываются ключи фильтра вида #* * * @param array $aFilter Фильтр * @param EntityORM $oEntitySample Объект сущности * @return array */ public function BuildFilterMore($aFilter, $oEntitySample) { // Сортировка $sOrder = ''; if (isset($aFilter['#order'])) { if (!is_array($aFilter['#order'])) { $aFilter['#order'] = array($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'; } if (substr($key, 0, 1) == '#') { /** * Используем "как есть" */ $key = ltrim($key, '#'); } else { /** * Проверяем на простые выражения: field1 + field2 * field3 */ $aKeyPath = preg_split("#\\s?([\\-\\+\\*\\\\])\\s?#", $key, -1, PREG_SPLIT_DELIM_CAPTURE); if (count($aKeyPath) > 2) { $key = ''; foreach ($aKeyPath as $i => $sKey) { if ($i % 2 == 0) { $key .= 't.' . $this->oDb->escape($oEntitySample->_getField(trim($sKey)), true); } else { $key .= " {$sKey} "; } } } else { /** * Проверяем на FIELD:id -> FIELD(id,?a) */ $aKeys = explode(':', $key); if (count($aKeys) == 2) { if (strtolower($aKeys[0]) == 'field' and is_array($aFilter['#order'][$key]) and count($aFilter['#order'][$key])) { $key = 'FIELD(t.' . $this->oDb->escape($oEntitySample->_getField(trim($aKeys[1])), true) . ',' . join(',', $aFilter['#order'][$key]) . ')'; $value = ''; } else { /** * Неизвестное выражение */ continue; } } else { /** * Пропускаем экранирование функций */ if (!in_array($key, array('rand()'))) { /** * Проверяем наличие префикса таблицы */ if (!strpos($oEntitySample->_getField($key), '.')) { $key = 't.' . $this->oDb->escape($oEntitySample->_getField($key), true); } else { $key = $oEntitySample->_getField($key); } } } } } $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}"; } // Группировка $sGroup = ''; if (isset($aFilter['#group'])) { if (!is_array($aFilter['#group'])) { $aFilter['#group'] = array($aFilter['#group']); } foreach ($aFilter['#group'] as $sField) { if (substr($sField, 0, 1) == '#') { $sGroup .= ltrim($sField, '#') . ','; } else { $sField = $this->oDb->escape($oEntitySample->_getField($sField), true); $sGroup .= " t.{$sField},"; } } $sGroup = trim($sGroup, ','); if ($sGroup != '') { $sGroup = "GROUP BY {$sGroup}"; } } // Определение полей в select $sSelect = ''; if (isset($aFilter['#select'])) { // todo: добавить экранирование полей с учетом префикса таблицы if (!is_array($aFilter['#select'])) { $aFilter['#select'] = array($aFilter['#select']); } $sSelect = join(', ', $aFilter['#select']); } return array($sOrder, $sLimit, $sGroup, $sSelect); }
/** * Построение дополнительного фильтра * Здесь учитываются ключи фильтра вида #* * * @param array $aFilter Фильтр * @param EntityORM $oEntitySample Объект сущности * @return array */ public function BuildFilterMore($aFilter, $oEntitySample) { // Сортировка $sOrder = ''; if (isset($aFilter['#order'])) { if (!is_array($aFilter['#order'])) { $aFilter['#order'] = array($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'; } $key = $this->oDb->escape($oEntitySample->_getField($key), true); $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}"; } // Группировка $sGroup = ''; if (isset($aFilter['#group'])) { if (!is_array($aFilter['#group'])) { $aFilter['#group'] = array($aFilter['#group']); } foreach ($aFilter['#group'] as $sField) { $sField = $this->oDb->escape($oEntitySample->_getField($sField), true); $sGroup .= " {$sField},"; } $sGroup = trim($sGroup, ','); if ($sGroup != '') { $sGroup = "GROUP BY {$sGroup}"; } } return array($sOrder, $sLimit, $sGroup); }