<?php
//получаем список ID объектов по url - на выходе плоский массив
function get_obj_list_id($url,$all=FALSE,$sort_by_attr=0) {
global $main_url, $main_langs, $debugger, $main, $main_acts;
$main['profiler']['get_obj_list_id']['count']++;
$main['profiler']['get_obj_list_id']['time']-=microtime(true);
//парсим (или нет) url
if ( !is_array($url) ) $url=get_parsed_url($url);
//а вдруг этот список идентичен тому, что уже получен?
if ($url===$main_url && isset($main['objects']) ) {
$ret = $main['objects'];
//а вдруг в кеше список этих объектов остался?
} else {
$all2=$all;
$memkey=md5(serialize($url)).(int)$all.$sort_by_attr;
$ret=get_var_from_cache($memkey,MEMCACHE_OBJ_LIST_TTL);
if ( !is_array($ret) ) {
if( !defined("DEBIL_MODE") ) { define('DEBIL_MODE',FALSE); }
settype($sort_by_attr,"int");
$objects=array();
$pagelink='';
$a_group='';
$ret=array();
if ( (string)$url['id']!='' ) {
//<если в url есть имя(id) объекта - запихиваем в выходной массив и отваливаемся>
$objects[(int)$url['id']]=(int)$url['id'];
} else {
//тип, баннеры исключаем //&& $url['type']!='banner'
if ( $url['type']!='' ) {
$wt=" AND o.type='".$url['type']."' ";
} else {
$wt=" AND o.type NOT LIKE 'banner'";
}
//год
if ( $url['year']!='' ) {
$wy=" AND YEAR(o.created)=".$url['year']." ";
//дата полностью
} elseif ($url['date']!='') {
$wy=" AND DATE(o.created)='".$url['date']."' ";
} else {
$wy='';
}
//ключи
$countkeys=count($url['keys']);
//урезаем количество ключей
$wk=''; $m_t='';
$i=0;
foreach($url['keys'] as $id_key=>$key) {
$i++;
if ($i>MAX_KEYS_IN_URL) continue;
$m_t.="\n LEFT JOIN `".T_MATRIX."` as m".$i." ON o.id=m".$i.".id_obj ";
$wk.="\n AND ( m".$i.".id_key='".$id_key."'";
if( DEBIL_MODE==FALSE ) {
$in=array_flip(get_in_keys($id_key,4));
} else {
$in=array();
}
if ( count($in)>0 ) $wk.=" OR m".$i.".id_key='".implode("' OR m".$i.".id_key='",$in)."'";
$wk.=")";
}
//поиск по атрибуту здесь не используется
$wa='';
//<берём только активные объекты если переменная $all на входе FALSE>
//администратору раздела и админу показываем всё
if(!isset($_SESSION['show_hidden_obj'])) $_SESSION['show_hidden_obj']=FALSE;
if ( $all==TRUE || $_SESSION['show_hidden_obj']==TRUE ) {
$w_active="o.active>=-1 ";
} else {
$w_active="o.active>0";
}
//для каталога ищем по наименованию (пока это только на child может быть использовано
if ( $url['type']=='catalog' && defined('ATTR_CATALOG_NAME' && !$all) ) {
$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
$wa=" AND a.id_attr='".ATTR_CATALOG_NAME."' AND a.id_lang=".$url['id_lang'];
$a_order=", a.value_".$main['attr_types'][ATTR_CATALOG_NAME]." ASC";
//для словаря ищем по наименованию (пока это только на alba может быть использовано
} elseif ( $sort_by_attr>0 ) {
settype($sort_by_attr,"int");
$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
$wa=" AND a.id_attr='".$sort_by_attr."' AND a.id_lang=".$url['id_lang'];
$a_order=", a.value_".$main['attr_types'][$sort_by_attr]." ASC";
//если включён индекс по атрибуту - сортируем по значению этого атрибута
//пока только по возрастанию реализовано
} elseif ( $url['iattr']>0 ) {
//echo"[ 5 sort_by_attr=".$url['iattr']." ]";
$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
$wa=" AND a.id_attr='".$url['iattr']."' AND a.id_lang=".$url['id_lang'];
$a_order=", a.value_".$main['attr_types'][$url['iattr']]." ASC";
$a_group=" GROUP BY a.value_".$main['attr_types'][$url['iattr']]." ";
} else {
//echo"[ 6 sort_by_attr=$sort_by_attr ]";
$a_t="\n LEFT JOIN `".T_ATTR_DATA."` as a ON o.id=a.id_obj ";
$wa=" AND a.id_lang=".$url['id_lang'];
$a_order="";
}
//условия по дате создания
if ( SITE=='messe' && $url['type']=='catalog' ) {
$ocreated=", o.created ASC";
$wcreated="AND o.created > NOW()";
//события, костыль для спочана
} elseif ( $url['type']=='events' && $url['year']=='' && SITE=='spochan' ) {
$wcreated=' ';
if ( $url['old']==0 ) {
$ocreated=", o.created DESC";
} else {
$ocreated=", o.created DESC";
}
//события, нормальный вариант
} elseif ( $url['type']=='events' && $url['year']=='' ) {
if ( $url['old']==0 ) {
$ocreated=", o.created ASC";
$wcreated=" AND o.created > ( NOW() - INTERVAL 1 DAY ) ";
} else {
$ocreated=", o.created DESC";
$wcreated=" AND o.created < NOW() ";
}
} elseif ( $url['type']=='events' && $url['year']!='' ) {
$ocreated=", o.created DESC";
$wcreated=" ";
} else {
$ocreated=", o.created DESC";
$wcreated=" ";
}
//выборка по автору
$w_author='';
if( $url['iauthor']>0 ) {
$w_author.=" AND o.author = '".$url['iauthor']."'";
}
//собираем запрос, пока без LIMIT постраничного
$query="SELECT o.id FROM `".T_OBJ."` as o".$m_t.$a_t."
WHERE
".$w_active."
".$wt."
".$wy."
".$wk."
".$wa."
".$wcreated."
".$w_author."
AND o.id>0
".$a_group."
ORDER BY o.weight DESC ".$a_order." ".$ocreated."
";
$res=db_query($query);
$count=db_num_rows($res);
if ($count==0) {
//если ничего не нашли - вываливаемся
} else {
while($row=db_fetch_array($res)) {
array_push($objects,$row[0]);
}
$ret=$objects;
}
db_free_result($res);
}
set_var_to_cache($memkey,$ret,MEMCACHE_OBJ_LIST_TTL);
}
}
$main['profiler']['get_obj_list_id']['time']+=microtime(true);
return array_unique($ret);
}