function select_objects($params) { if ($params['spack']['endleafs']) { $params['spack']['ancestors'][$params['spack']['endleafs']][] = $params['spack']['ancestor']['ancestor']; unset($params['spack']['ancestor']['ancestor']); } if (is_array($params['spack'])) { foreach ($params['spack'] as $stype => $svalues) { switch ($stype) { case 'to': $svalues = XARRAY::clear_empty_items($svalues); while (list($k, $v) = each($svalues)) { $svalues[$k] = XSTRING::date_recognize($v); } if (!empty($svalues)) { $OM = $this->_tree->Search($svalues, false, false, $OM, '<='); if (empty($OM)) { break 2; } } break; case 'from': $svalues = XARRAY::clear_empty_items($svalues); while (list($k, $v) = each($svalues)) { $svalues[$k] = XSTRING::date_recognize($v); } if (!empty($svalues)) { $OM = $this->_tree->Search($svalues, false, false, $OM, '>='); if (empty($OM)) { break 2; } } break; case 'rlike': case 'rwords': case 'lrlike': $svalues = XARRAY::clear_empty_items($svalues); if ($stype == 'rwords') { $or = 1; } else { $or = 0; } if (!empty($svalues)) { $OMR = $this->_tree->Search($svalues, false, false, null, $stype, null, null, $or); if (!$OM) { $OM = $OMR; } else { $OM = array_intersect($OMR, $OM); } if (empty($OM)) { break 2; } } break; case 'equal': $svalues = XARRAY::clear_empty_items($svalues); if (!empty($svalues)) { $OM = $this->_tree->Search($svalues, false, false, $OM, '='); if (empty($OM)) { break 2; } } break; case 'equalor': $svalues = XARRAY::clear_empty_items($svalues); if (!empty($svalues)) { if (XARRAY::array_depth($svalues) > 1) { foreach ($svalues as $v => $qa) { foreach ($qa as $c) { $ZM = $this->_tree->Search(array($v => $c), false, false, $ZM, '=', null, null, true); } } } else { $ZM = $this->_tree->Search($svalues, false, false, $ZM, '=', null, null, true); } if ($ZM && $OM) { $OM = array_intersect($ZM, $OM); } else { $OM = $ZM; } if (empty($OM)) { break 2; } } break; case 'inchildsall': $svalues = XARRAY::clear_empty_items($svalues); if (!empty($svalues)) { foreach ($svalues['id'] as $sv) { if ($childs = $this->_tree->Search(array('id' => $sv), true, false, null, '=')) { $childs = XARRAY::askeyval($childs, 'ancestor'); if (!$LOM) { !($LOM = $childs); } $LOM = array_intersect($LOM, $childs); } else { break 1; } } if ($OM) { $OM = array_intersect($LOM, $OM); } if (empty($OM)) { break 1; } } break; case 'inchilds': $svalues = XARRAY::clear_empty_items($svalues); $stop_level = array_keys($svalues); if (!empty($svalues)) { if ($childs = $this->_tree->Search($svalues, true, false, null, '=')) { $a = XARRAY::askeyval($childs, 'ancestor'); if ($OM) { $OM = array_intersect($a, $OM); } } else { break 3; } if (empty($OM)) { break 2; } } break; case 'ancestors': $svalues = XARRAY::clear_empty_items($svalues); $stop_level = array_keys($svalues); $ancestors = array(); $this->_tree->EXPcache = null; if (is_array(!$svalues[$stop_level[0]])) { $ancarr[] = trim($svalues[$stop_level[0]]); } else { $ancarr = $svalues[$stop_level[0]]; } if (is_array($ancarr)) { foreach ($ancarr as $anc) { if ($anc) { $a = $this->_tree->recursiveChildCollectFast($anc, array('_CATGROUP'), 'ASC', $stop_level[0]); } if (is_array($a)) { $ancestors = array_merge($ancestors, $a); } } } else { $ancestors = $ancarr; } if (is_array($params['spack']['ancestor'])) { $se = array('ancestor' => $ancestors) + $params['spack']['ancestor']; } else { $se = array('ancestor' => $ancestors); } if ($se['ancestor']) { if ($params['spack']['endleafs']) { $SOM = array(); $childs = $this->_tree->get_anc_multiply_childs2($se['ancestor'], $se['obj_type']); if ($childs) { $OM = array_intersect($OM, array_keys($childs)); } else { $OM = null; } } else { $OM = $this->_tree->Search(array('Disable' => ''), false, $se, $OM, '=', false, ' order by s.rate ASC'); } } if (empty($OM)) { break 2; } break; case 'ancestor': $svalues = XARRAY::clear_empty_items($svalues); if (!empty($svalues)) { $OM = $this->_tree->Search(null, false, $svalues, $OM, '=', false, ' order by s.rate ASC'); if (empty($OM)) { break 1; } } break; case 'sortby': $sortby = XARRAY::clear_empty_items($svalues); break; case 'sort': $sort = XARRAY::clear_empty_items($svalues); break; } } $endpage = $params['startpage'] + $params['Onpage']; if (!empty($OM) && is_array($OM)) { //убираем отключенные из результатаы if ($DOM = $this->_tree->Search(array('Disable' => '1'), false, array('id' => $OM))) { $OM = array_diff($OM, $DOM); } if ($sortby) { $OM = $this->sortby($OM, $sortby); } if ($sort) { $OM = $this->sorter($OM, $sort); } $obj_count = count($OM); if ($OM = array_slice($OM, $params['startpage'], $params['Onpage'])) { return array('objects' => $this->_tree->GetNodesByIdArray($OM, 'ASC', true), 'count' => $obj_count); } } } }