");
foreach ($spam_signs as $sign) if (strpos(strtolower($value),$sign)!==false || strip_tags($value)!=$value) return true;
return false;
}
function getPageTags($pid,$get_links=false,$id_category="",$page_type="category")
{
global $db;
$tags=array();
if (!is_numeric($pid)) return $tags;
if ($get_links && $id_category===""){ //if need to get links to tag pages, we need category ID
$res=$db->select("select id_category from `".db_prefix."pages` where id='".intval($pid)."' limit 1");
$id_category=$res[0]['id_category'];
}
$res=$db->select("select t.* from `".db_prefix."tag` t, `".db_prefix."page_tag` pt where pt.id_tag=t.id and pt.id_page='".intval($pid)."' order by t.`name`");
foreach ($res as $t) {
if (IS_MULTILINGUAL) $t['name']=multilang($t['name']);
$tags[$t['id']]=$t;
if ($get_links) $tags[$t['id']]['link']=getTagPageLink($t['id'],$id_category,$page_type);
}
return $tags;
}
$tag_links_cache=array();
function getTagPageLink($tag_id,$category_id,$page_type="category")
{
if (!is_numeric($tag_id) || !is_numeric($category_id)) return "";
global $db;
$sign=$tag_id."|".$category_id."|".$page_type;
global $tag_links_cache;
if (isset($tag_links_cache[$sign])) return $tag_links_cache[$sign]; //read cache
$query="select p.id,(select count(*) as `cnt` from `".db_prefix."page_tag` pt2 where id_page=p.id) as tag_num from `".db_prefix."page_tag` pt,`".db_prefix."pages` p where p.id=pt.id_page and pt.id_tag='".intval($tag_id)."' and p.`type`='".$db->escape($page_type)."' and p.`id_category`='".intval($category_id)."' order by `tag_num`";
$res=$db->select($query);
$page_id=sizeOf($res)>0 ? $res[0]['id'] : 0;
$link=$page_id==0 ? "" : getPageLink($page_id);
$tag_links_cache[$sign]=$link;
return $link;
}
function getPageAttachments($pid,$raw=false)
{
$attachments=array();
global $db;
$cond="";
if (!$raw) {
$cond.=" and pa.`status`=1";
if (IS_MULTILINGUAL) $cond.=" and (pa.`id_lang`=0 or pa.`id_lang`='".$db->escape(LANG_ID)."')";
}
if ($raw) $query="select pa.*,l.`name` as `language` from `".db_prefix."page_attachments` pa left join `".db_prefix."languages` l on pa.id_lang=l.id where pa.`id_page`='".$db->escape($pid)."' ".$cond." order by pa.`ord`";
else $query="select pa.* from `".db_prefix."page_attachments` pa where `id_page`='".$db->escape($pid)."' ".$cond." order by `ord`";
$attachments=$db->select($query);
if (IS_MULTILINGUAL && !$raw) {
foreach ($attachments as $key=>$a) $attachments[$key]['name']=multilang($a['name']);
}
return $attachments;
}
$global_multilang_cache=array();
$global_multilang_order=array();
function multilang($str,$lang="",$strict=false)
{
if ($lang=="") {
global $language;
if ($language=="" || $language=="LANG") $language=(string)LANG;
} else $language=$lang;
global $global_multilang_cache;
if (isset($global_multilang_cache[$str])) //cache
{
if (isset($global_multilang_cache[$str][$language])) return $global_multilang_cache[$str][$language];
else return $strict ? "" : $global_multilang_cache[$str]['default'];
}
//no cache
preg_match_all("~\{([A-Z]+)\}~",$str,$matches);
//print_r($matches);
global $global_multilang_order;
if (!is_array($global_multilang_order) || sizeOf($global_multilang_order)<=0) {
if (defined("MULTILINGUAL_ORDER") && MULTILINGUAL_ORDER!='') $global_multilang_order=explode(',',MULTILINGUAL_ORDER);
if (!is_array($global_multilang_order) || sizeOf($global_multilang_order)<=0) $global_multilang_order=array('EN');
}
if (sizeOf($matches[1])==0) {
$data=array("default"=>$str);
$value=$str;
}
else {
$data=array();
$values=explode("{}",str_replace($matches[0],"{}",$str));
foreach ($matches[1] as $i=>$lng) $data[$lng]=$values[$i+1];
//$data['default']=isset($data['EN']) ? $data['EN'] : $values[1];
$data['default']='';
foreach ($global_multilang_order as $code) if (isset($data[$code]) && $data[$code]!='') {
$data['default']=$code=='RU' && $language!='RU' ? translit($data[$code]) : $data[$code];
break;
}
if ($data['default']=='') $data['default']=$values[1];
$value=isset($data[$language]) ? $data[$language] : ($strict ? "" : $data['default']);
}
$global_multilang_cache[$str]=$data;
return $value;
}
function get_name_file_multilang($str, $option='', $page_id='', $lang=''){
if($option!=''){
$str = getPageOption($option,$page_id, true);
}
if(trim($str)==''){
return ($option!=''?'':array());
}
preg_match_all("~\{([A-Z]+)\}~",$str,$matches);
if(count($matches[1])==0){
return ($option!=''?'':array());
}
$values=explode("{}",str_replace($matches[0],"{}",$str));
foreach ($matches[1] as $i=>$lng) $data[$lng]=$values[$i+1];
if($option!=''){
if(isset($data[$lang]) && $data[$lang]!=''){
return $data[$lang];
}elseif(isset($data['EN']) && $data['EN']!=''){
return $data['EN'];
}else{
return '';
}
}else{
return $data;
}
}
function set_name_file_multilang($array=array()){
if(count($array)==0){
return '';
}
$str = '';
foreach($array AS $lang=>$value){
$str .= '{'.$lang.'}'.$value;
}
return $str;
}
function getPageMultilangData($pid,$default_data="",$fields="",$language_id="")
{
global $db;
if ($language_id==="") $language_id=LANG_ID;
//get default data
if ($default_data=="") {
$res=$db->select("select * from `".db_prefix."pages` where id='".intval($pid)."' limit 1");
if (sizeOf($res)==0) return "";// no such page
$default_data=$res[0];
}
$res=$db->select("select * from `".db_prefix."pages_translation` where `id_page`='".intval($pid)."' and `id_language`=".intval($language_id)." limit 1");
if (sizeOf($res)==0) { //no translation for language, should take default
$data=array();//$default_data;
}
else $data=$res[0]; //translated data
unset($data['id']);
//now choose the output
$no_auto_content=(defined('NO_MULTILINGUAL_AUTO_CONTENT') && NO_MULTILINGUAL_AUTO_CONTENT===true);
if (!is_array($fields) && $fields!="") //one field
{
$result=$data[$fields];
if ($result=="" && !($no_auto_content && $fields=='content')) $result=$default_data[$fields];
}
else //array of data
{
$all=$fields=="";
$result=array();
foreach ($default_data as $key=>$value) if ($all || in_array($key,$fields))
$result[$key]=$data[$key]=="" && !($no_auto_content && $key=='content') ? $default_data[$key] : $data[$key];
}
return $result;
}
function checkUserExists($field,$value,$exclude_user="")
{
$value=trim($value);
if ($value=="") return false;
$fields=array("login","email");
if (!in_array($field,$fields)) return false;
if ($exclude_user===""){
global $user;
$exclude_id=$user->id;
} else $exclude_id=$exclude_user;
global $db;
$value=trim($value);
$res=$db->select("select id from `".db_prefix."users` where `".$field."`='".$db->escape($value)."' and id<>'".$db->escape($exclude_id)."' limit 1");
return (sizeOf($res)>0);
}
function registerNewUser($login,$password,$email,$name,$custom_options,$force_email=false)
{
$login=trim($login);
$password=trim($password);
$email=trim($email);
if (DEBUG && $login=="") writeLog("no login to register!");
if (DEBUG && $password=="") writeLog("no password to register!");
if (DEBUG && $force_email && $email=="") writeLog("no email to register!");
if ($login=="" || $password=="" || $force_email && $email=="") return false;
if (checkUserExists("login",$login)) {writeLog("check login failed");return false;}
if ($email!="" && checkUserExists("email",$email)) {if (DEBUG) writeLog("check email failed");return false;}
global $db;
$mas['login']=$login;
$mas['password']=md5($password);
$mas['email']=$email;
$mas['name']=$name;
$mas['status']=1;
$mas['id_type']=SITE_USER_TYPE_ID;
$uid=$db->insert(db_prefix."users",$mas);
if($uid===false) return false;
if (is_array($custom_options) && sizeOf($custom_options)>0) foreach ($custom_options as $param=>$value){
setUserOption($uid,$param,$value);
/*$zap_op=$db->select("select id from `".db_prefix."options` where `name`='".$db->escape($param)."' and `type`=1");
if (sizeOf($zap_op)>0)
{
$o['id_option']=$zap_op[0]['id'];
$o['id_user']=$uid;
$o['value']=$value;
$db->insert(db_prefix."user_options",$o);
} */
}
return $uid;
}
$options_type2_cache=null;
function getPages($params) //get pages list with correct language by params
{
$total=0;
$items=array();
global $db;
//optimisation
$optimize=isset($params['optimize']);
//set conditions
$cond=isset($params['condition']) ? $params['condition'] : "";
if (IS_MULTISITE) $cond.=" and p.`id_category` in ".CATEGORIES_COND;
$from="";
$join=array();
$options_aliases=array();
$compare_types=array("=","<>","<",">","<=",">=","in","between","like","not in");
if (isset($params['type'])) $cond.=" and p.`type`='".$db->escape($params['type'])."'";
if (is_numeric($params['id_parent'])) $cond.=" and p.`id_parent`='".$db->escape($params['id_parent'])."'";
if (is_numeric($params['id_category'])) $cond.=" and p.`id_category`='".$db->escape($params['id_category'])."'";
//set tag conditions
$distinct=false;
if (is_array($params['tags']) && sizeOf($params['tags'])>0) {
$tags=array();
foreach ($params['tags'] as $tag) if (is_numeric($tag)) $tags[]=$db->escape($tag);
if (sizeOf($tags)>0) {
$join[]=" left join `".db_prefix."page_tag` pt on p.`id`=pt.`id_page`";
$cond.=" and pt.`id_tag` in ('".implode("','",$tags)."')";
if (sizeOf($tags)>1) $distinct=true;
}
}
//set options conditions
if (is_array($params['options']) && sizeOf($params['options'])>0) {
global $options_type2_cache;
if (!is_array($options_type2_cache)) {
$options=array(); //options IDs cache
$data=$db->select("select * from `".db_prefix."options` where `type`=2");
foreach ($data as $o) $options[$o['name']]=$o['id'];
$options_type2_cache=$options;
}
else $options=$options_type2_cache;
foreach ($params['options'] as $i=>$o) if (isset($options[$o['name']])){
$options_aliases[$o['name']]="po_".$i;
$join[]=" left join `".db_prefix."page_options` po_".$i." on p.`id`=po_".$i.".`id_page` and po_".$i.".`id_option`='".$db->escape($options[$o['name']])."'";
$compare=isset($o['compare']) && in_array($o['compare'],$compare_types) ? $o['compare'] : "=";
if ($compare=="in") {
if (!is_array($o['value'])) $o['value']=array_map("trim",explode(",",$o['value']));
$in="";
foreach ($o['value'] as $val) $in.=",'".$db->escape($val)."'";
$cond.=" and (po_".$i.".`value` in (".($in=="" ? "''" : substr($in,1)).")";
if($o['strict']!==true) $cond.=" or po_".$i.".`value` IS NULL";
$cond.=" )";
}
else if ($compare=="not in") {
if (!is_array($o['value'])) $o['value']=array_map("trim",explode(",",$o['value']));
$notin="";
foreach ($o['value'] as $val) $notin.=",'".$db->escape($val)."'";
$cond.=" and (po_".$i.".`value` not in (".($notin=="" ? "''" : substr($notin,1)).")";
if($o['strict']!==true) $cond.=" or po_".$i.".`value` IS NULL";
$cond.=" )";
}
else if (is_array($o['value'])) {
$subconds="";
foreach ($o['value'] as $val) {
if ($compare=="between") {
if (!is_array($val)) $val=array_map("trim",explode(",",$val));
if (sizeOf($val)<2) $subconds.=" or (po_".$i.".`value`='".$db->escape($val[0])."')";
else {
$b_from=isset($val['from']) ? $val['from'] : $val[0];
$b_to=isset($val['to']) ? $val['to'] : $val[1];
$subconds.=" or (po_".$i.".`value`>='".$db->escape($b_from)."'".($o['compare_type']=="numeric" ? "+0" : "")." and po_".$i.".`value`<='".$db->escape($b_to)."'".($o['compare_type']=="numeric" ? "+0" : "").")";
}
}
else if ($compare=="like") $subconds.=" or (po_".$i.".`value` like '%".$db->escape($val)."%')";
else $subconds.=" or (po_".$i.".`value`".$compare."'".$db->escape($val)."'".($o['compare_type']=="numeric" ? "+0" : "").")";
}
$cond.=" and ((".substr($subconds,4).")";
if($o['strict']!==true) $cond.=" or po_".$i.".`value` IS NULL";
$cond.=" )";
}
else if ($compare=="like") $cond.=" and po_".$i.".`value` like '%".$db->escape($o['value'])."%'";
else{
$cond.=" and (po_".$i.".`value`".$compare."'".$db->escape($o['value'])."'".($o['compare_type']=="numeric" ? "+0" : "");
if($o['strict']!==true /*&& $compare=='<>'*/) $cond.=" or po_".$i.".`value` IS NULL";
$cond.=" )";
}
}
}
//multilingual join if needed
if (IS_MULTILINGUAL && !IS_DEFAULT_LANG && ($params['force_language']===true || $params['search']!=""))
{
$from.="`".db_prefix."pages_translation` ptr, ";
$cond.=" and ptr.`id_page`=p.id and ptr.`id_language`=".LANG_ID;
}
//search
if ($params['search']!="") {
$srch="'%".$db->escape($params['search'])."%'";
if (IS_MULTILINGUAL && !IS_DEFAULT_LANG) $cond.=$params['search_title_only'] ? " and ptr.`name` like ".$srch : " and (ptr.`name` like ".$srch." or ptr.`content` like ".$srch.")";
else $cond.=$params['search_title_only'] ? " and p.`name` like ".$srch : " and (p.`name` like ".$srch." or p.`content` like ".$srch.")";
}
//set order
if ($optimize) {
$order='';
if (!isset($params['optimize']['sort_by'])) $sort="CONCAT((1000000-p.`order`+0),p.`data_create`,LPAD(p.`id`,8,0))";
else $sort=$params['optimize']['sort_by'];
$data_sort_order=(strtolower($params['optimize']['sort_order'])=="asc" ? "ASC" : "DESC");
$select='p.`id`'.($sort=='' ? '' : ','.$sort.' as `srt`');
}
else {
$order="p.`order` asc, p.`data_create` desc, p.`id` desc";
if ($params['sort_by']!=""){
if (is_array($params['sort_by'])){
if (isset($params['sort_by']['option'])) { //sort by given option value
$order=$options_aliases[$params['sort_by']['option']].".`value`";
if ($params['sort_by']['compare_type']=="numeric") $order.="+0"; //compare as numbers
}
}
else $order=$params['sort_by'];
$order.=" ".(strtolower($params['sort_order'])=="asc" ? "ASC" : "DESC");
}
$order=' order by '.$order;
if ($params['sort_by']==='') $order='';
$select='p.*';
if (isset($params['select']) && $params['select']!='') $select=$params['select'];
}
//set limits
if (!$optimize && is_numeric($params['per_page']) && $params['per_page']>0) {
$page=is_numeric($params['page_number']) ? $params['page_number'] : getPage();
$limit=" limit ".($page-1)*$params['per_page'].",".$params['per_page'];
} else $limit="";
$publish_cond=$params['publish']===false ? "p.`publish`>=0" : "p.`publish`=1";
$query="select ".($distinct ? 'distinct ' : '').$select." from ".$from."`".db_prefix."pages` p ".(sizeOf($join)>0 ? implode(" ",$join) : "")." where ".$publish_cond." ".$cond.$order."".$limit;
//var_dump($query);
//echo $query."
\n\n";
if ($optimize) {
$rows=$db->select($query);
$total=sizeOf($rows);
$sort_params['order']=$data_sort_order=='ASC' ? 1 : -1;
$sort_params['compare']=$params['optimize']['compare_type']=='numeric' ? 1 : 0;
usort($rows,function($a,$b) use ($sort_params){
if ($sort_params['compare']==1) {
if ($a['srt']<$b['srt']) $res=-1;
else if ($a['srt']>$b['srt']) $res=1;
else $res=0;
}
else $res=strcmp($a['srt'],$b['srt']);
return $sort_params['order']*$res;
});
//limits
if (is_numeric($params['per_page']) && $params['per_page']>0) {
$page=is_numeric($params['page_number']) ? $params['page_number'] : getPage();
$rows=array_slice($rows,($page-1)*$params['per_page'],$params['per_page']);
}
//get page IDs and perform real query
$ids='';
foreach ($rows as $r) $ids.=','.$r['id'];
$data=$db->select("select p.* from `".db_prefix."pages` p where p.`id` in (".substr($ids,1).") order by FIELD(p.`id`".$ids.")");
}
else {
$data=$db->select($query);
if ($limit=='' || $params['skip_total']===true) $total=sizeOf($data);
else {
$query_count="select count(*) as `cnt` from ".$from."`".db_prefix."pages` p ".(sizeOf($join)>0 ? implode(" ",$join) : "")." where ".$publish_cond." ".$cond;
$cnt=$db->select($query_count);
$total=$cnt[0]['cnt'];
}
}
foreach ($data as $p) {
if (IS_MULTILINGUAL && !IS_DEFAULT_LANG) $p=getPageMultilangData($p['id'],$p);
if ($params['get_options']===true) {
$p['options_raw']=getPageOptions($p['id'],true);
$p['options']=IS_MULTILINGUAL ? array() : $p['options_raw'];
if (IS_MULTILINGUAL) foreach ($p['options_raw'] as $o_name=>$value) $p['options'][$o_name]=multilang($value);
}
$items[]=$p;
}
return array($items,$total);
}
function searchPages($keyphrase,$per_page=10,$exclude_types="") //search pages list by keyphrase
{
global $db;
$params=array(
"search"=>$keyphrase,
"per_page"=>(is_numeric($per_page) ? $per_page : 10),
"page_number"=>getPage(),
);
//exclude types condition
if (!is_array($exclude_types)) { /* build exclude types condition on XML settings */
$exclude_types=array();
$types_string=getSystemOption("xml_sitemap_exclude_types");
$variants=explode(",",$types_string);
foreach ($variants as $key=>$value) {
$value=trim($value);
if ($value!=="") $exclude_types[]=$value;
}
}
foreach ($exclude_types as $key=>$value) $exclude_types[$key]=$db->escape($value);
if (sizeOf($exclude_types)>0) $params['condition']=" and p.`type` not in ('".implode("','",$exclude_types)."')";
//use common getPages function to get results
return getPages($params);
}
function formatDate($date)
{
$hour=(int)(substr($date,11,2));
$minute=(int)(substr($date,14,2));
$month=(int)substr($date,5,2);
$day=(int)substr($date,8,2);
$year=(int)substr($date,0,4);
$date_ts=mktime($hour,$minute,1,$month,$day,$year);
$format=getSystemOption("date_format");
if ($format=="") $format=DEFAULT_DATE_FORMAT;
return date($format,$date_ts);
}
//comments
function getCommentsList($params)
{
$total=0;
$items=array();
global $db;
$opt_data=$db->select("select id from `".db_prefix."options` where `type`=1 and `name`='soc_params'");
$oid=$opt_data[0]['id'];
//conditions
$cond="";
if (IS_MULTILINGUAL) {
if (!isset($params['language']) || !is_numeric($params['language'])) $cond.=" and (c.`id_lang`='0' or c.`id_lang`='".LANG_ID."')";
else if ($params['language']!=0) $cond.=" and c.`id_lang`='".$db->escape($params['language'])."'";
}
if (is_numeric($params['id_page'])) $cond.=" and c.`id_page`='".$db->escape($params['id_page'])."'";
if (isset($params['publish']) && is_numeric($params['publish'])) $cond.=" and c.`publish`='".$db->escape($params['publish'])."'";
else $cond.=" and c.`publish`='1'";
if ($cond!="") $cond=substr($cond,4);
//set order
$order="c.`id` ";
if ($params['sort_by']!=""){
$order=$params['sort_by'];
$order.=" ".($params['sort_order']=="ASC" ? "ASC" : "DESC");
}
//set limits
if (is_numeric($params['per_page']) && $params['per_page']>0) {
$page=is_numeric($params['page_number']) ? $params['page_number'] : getPage();
$limit=" limit ".($page-1)*$params['per_page'].",".$params['per_page'];
} else $limit="";
$query="select c.*,u.`name`,uo.`value` as soc_params from `".db_prefix."comments` c
left join `".db_prefix."user_options` uo on uo.`id_option`='".$oid."' and uo.`id_user`=c.`id_user`
left join `".db_prefix."users` u on c.`id_user`=u.`id`
where
".$cond."
order by ".$order.$limit;
$items=$db->select($query);
foreach ($items as $key=>$comment) {
$items[$key]['soc_params']=$comment['soc_params']=="" ? array() : unserialize($comment['soc_params']);
if ($comment['name']=="") $items[$key]['name']=$comment['soc_name'];
$items[$key]['avatar']=$items[$key]['soc_params']['avatar']!="" ? $items[$key]['soc_params']['avatar'] : "";
$items[$key]['user_link']=$items[$key]['soc_params']['uid']!="" ? $items[$key]['soc_params']['uid'] : "#";
}
//get total
if (sizeOf($items)==0) $total=0;
else {
$data=$db->select("select count(*) as `cnt` from `".db_prefix."comments` c where ".$cond);
$total=$data[0]['cnt'];
}
return array($items,$total);
}
function commentsBlock($id_page,$pagination=0,$form_tpl="",$unlogged_tpl="",$list_tpl="",$item_tpl="")
{
if ($id_page=="" || !is_numeric($id_page)) return "";
if (!is_numeric($pagination)) $pagination=0;
if ($form_tpl=="") $form_tpl="comments_form";
if ($unlogged_tpl=="") $unlogged_tpl="comments_unlogged";
if ($list_tpl=="") $list_tpl="comments_list";
if ($item_tpl=="") $item_tpl="comments_list_item";
$form=LoadTemplate($form_tpl);
$unlogged=LoadTemplate($unlogged_tpl);
$list=LoadTemplate($list_tpl);
$item=LoadTemplate($item_tpl);
global $db;
$html="";
if (logged()) {
global $user;
$f['name']=$user->name;
$html.=arrayToTemplate($f,$form);
}
else $html.=$unlogged;
$opt_data=$db->select("select id from `".db_prefix."options` where `type`=1 and `name`='soc_params'");
$oid=$opt_data[0]['id'];
$res['items']="";
$sort_setting=getSystemOption("comments_sort");
if ($sort_setting=="") $sort_setting=COMMENTS_SORT;
$sort_order=strtolower($sort_setting);
if ($sort_order!="asc") $sort_order="desc";
$params=array("id_page"=>$id_page);
if ($pagination!=0) $params['per_page']=$pagination;
$params['sort_by']="c.`data`";
$params['sort_order']=$sort_order;
list($comments,$total)=getCommentsList($params);
foreach ($comments as $comment) {
if ($comment['avatar']!="") $comment['avatar']='