예제 #1
0
 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);
             }
         }
     }
 }