2017-06-24 00:58:56 +03:00
< ? php
/**
* AVE . cms
*
* @ package AVE . cms
* @ version 3. x
* @ filesource
* @ copyright © 2007 - 2014 AVE . cms , http :// www . ave - cms . ru
*
* @ license GPL v . 2
*/
/**
* Обработка условий запроса .
* Возвращает строку условий в SQL - формате
*
* @ param int $id идентификатор запроса
* @ return string
*/
function request_get_condition_sql_string ( $id , $update_db = false )
{
global $AVE_DB , $AVE_Core ;
$id = ( int ) $id ;
$from = array ();
$where = array ();
$sql_ak = $AVE_DB -> Query ( "
SELECT *
FROM
" . PREFIX . " _request_conditions
WHERE
request_id = '" . $id . "'
AND
condition_status = '1'
ORDER BY
condition_position ASC
" );
// Обрабатываем выпадающие списки
if ( ! defined ( 'ACP' ))
{
$doc = 'doc_' . $AVE_Core -> curentdoc -> Id ;
if ( isset ( $_POST [ 'req_' . $id ]))
$_SESSION [ $doc ][ 'req_' . $id ] = $_POST [ 'req_' . $id ];
elseif ( isset ( $_SESSION [ $doc ][ 'req_' . $id ]))
$_POST [ 'req_' . $id ] = $_SESSION [ $doc ][ 'req_' . $id ];
}
if ( ! empty ( $_POST [ 'req_' . $id ]) && is_array ( $_POST [ 'req_' . $id ]))
{
$i = 1 ;
foreach ( $_POST [ 'req_' . $id ] as $fid => $val )
{
if ( ! ( $val != '' && isset ( $_SESSION [ 'val_' . $fid ]) && in_array ( $val , $_SESSION [ 'val_' . $fid ])))
continue ;
$from_dd [] = " %%PREFIX%%_document_fields AS t0 $i , " ;
$where_dd [] = " ((t0 $i .document_id = a.Id) AND (t0 $i .rubric_field_id = $fid AND t0 $i .field_value = ' $val ')) " ;
++ $i ;
}
}
$i = 0 ;
while ( $row_ak = $sql_ak -> FetchRow ())
{
// id поля рубрики
$fid = $row_ak -> condition_field_id ;
// значение для условия
$val = trim ( $row_ak -> condition_value );
// если это поле используется для выпадающего списка или пустое значение для условия, пропускаем
if ( isset ( $_POST [ 'req_' . $id ]) && isset ( $_POST [ 'req_' . $id ][ $fid ]) || $val === '' )
continue ;
// И / ИЛИ
if ( ! isset ( $join ) && $row_ak -> condition_join )
$join = $row_ak -> condition_join ;
// тип сравнения
$type = $row_ak -> condition_compare ;
// выясняем, числовое поле или нет
if ( ! isset ( $numeric [ $fid ]))
{
$numeric [ $fid ] = ( bool ) $AVE_DB -> Query ( "
SELECT
rubric_field_numeric
FROM
" . PREFIX . " _rubric_fields
WHERE
Id = '" . $fid . "'
" )->GetCell();
}
$fv = $numeric [ $fid ] ? " t $fid .field_number_value " : " UPPER(t $fid .field_value) " ;
// подставляем название таблицы в свободные условия
$val = addcslashes ( str_ireplace ( array ( '[field]' , '[numeric_field]' ), $fv , $val ), " ' " );
// формируем выбор таблицы
// первый раз евалом проходим значение и запоминаем это в переменной $v[$i]
// как только таблица выбрана, фиксируем это в $t[$fid], чтобы не выбирать по несколько раз одни и те же таблицы
$from [] = " <?php \$ v[ $i ] = trim(eval2var(' ?> $val <? ')); \$ t = array(); if ( \$ v[ $i ]>'' && !isset( \$ t[ $fid ])) { echo \" %%PREFIX%%_document_fields AS t $fid , \" ; \$ t[ $fid ]=1;}?> " ;
// обрабатываем условия
switch ( $type )
{
case 'N<' : case '<' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv < UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case 'N>' : case '>' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv > UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case 'N<=' : case '<=' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv <= UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case 'N>=' : case '>=' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv >= UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case '==' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv = UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case '!=' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv != UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case '%%' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv LIKE UPPER('% \$ v[ $i ]%'))) $join\ " : '' ?> "; break;
case '%' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv LIKE UPPER(' \$ v[ $i ]%'))) $join\ " : '' ?> "; break;
case '--' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv NOT LIKE UPPER('% \$ v[ $i ]%'))) $join\ " : '' ?> "; break;
case '!-' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv NOT LIKE UPPER(' \$ v[ $i ]%'))) $join\ " : '' ?> "; break;
case 'SEGMENT' : $where [] = " <?
\ $v [ $i ][ 'seg' ] =@ explode ( ',' , \ $v [ $i ]);
\ $v [ $i ][ 'seg' ][ 0 ] = ( int ) trim ( \ $v [ $i ][ 'seg' ][ 0 ]);
\ $v [ $i ][ 'seg' ][ 1 ] = ( int ) trim ( \ $v [ $i ][ 'seg' ][ 1 ]);
echo ( \ $v [ $i ] > '' && \ $v [ $i ]{ 0 } != ',' && \ $v [ $i ][ 'seg' ][ 0 ] <= \ $v [ $i ][ 'seg' ][ 1 ]) ? \ " (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv >= ' \" . \$ v[ $i ]['seg'][0] . \" ' AND $fv <= ' \" . \$ v[ $i ]['seg'][1] . \" ')) $join\ " : '' ); ?> "; break;
case 'INTERVAL' : $where [] = " <?
\ $v [ $i ][ 'seg' ] =@ explode ( ',' , \ $v [ $i ]);
\ $v [ $i ][ 'seg' ][ 0 ] = ( int ) trim ( \ $v [ $i ][ 'seg' ][ 0 ]);
\ $v [ $i ][ 'seg' ][ 1 ] = ( int ) trim ( \ $v [ $i ][ 'seg' ][ 1 ]);
echo ( \ $v [ $i ] > '' && \ $v [ $i ]{ 0 } != ',' && \ $v [ $i ][ 'seg' ][ 0 ] < \ $v [ $i ][ 'seg' ][ 1 ]) ? \ " (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv > ' \" . \$ v[ $i ]['seg'][0] . \" ' AND $fv < ' \" . \$ v[ $i ]['seg'][1] . \" ')) $join\ " : '' ); ?> "; break;
case 'IN=' : $where [] = " <?=( \$ v[ $i ]>'' && \$ v[ $i ] { 0}!=',') ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv IN ( \$ v[ $i ]))) $join\ " : '' ?> "; break;
case 'NOTIN=' : $where [] = " <?=( \$ v[ $i ]>'' && \$ v[ $i ] { 0}!=',') ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv NOT IN ( \$ v[ $i ]))) $join\ " : '' ?> "; break;
case 'ANY' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv =ANY( \$ v[ $i ]))) $join\ " : '' ?> "; break;
case 'FRE' : $where [] = " <?= \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND ( \$ v[ $i ]))) $join\ " : '' ?> "; break;
}
$i ++ ;
}
$retval = array ();
if ( ! empty ( $where ) || ! empty ( $where_dd ))
{
if ( ! empty ( $where_dd ))
{
$from = ( isset ( $from_dd ) ? array_merge ( $from , $from_dd ) : $from );
$from = implode ( ' ' , $from );
$where_dd = ( isset ( $where_dd ) ? ' AND ' : '' ) . implode ( ' AND ' , $where_dd );
$where = implode ( ' ' , $where ) . " <?php \$ a = array(); echo (!array_sum( \$ a) || ' $join '=='AND') ? '1=1' : '1=0'?> " ;
$retval = array ( 'from' => $from , 'where' => $where . $where_dd );
}
else
{
$from = implode ( ' ' , $from );
$where = implode ( ' ' , $where ) . " <?php \$ a = array(); echo (!array_sum( \$ a) || ' $join '=='AND') ? '1=1' : '1=0'?> " ;
$retval = array ( 'from' => $from , 'where' => $where );
}
}
// если вызвано из админки или просили обновить, обновляем запрос в бд
if ( defined ( 'ACP' ) || $update_db )
{
$AVE_DB -> Query ( "
UPDATE
" . PREFIX . " _request
SET
request_where_cond = '" . ($retval ? addslashes(serialize($retval)) : ' ') . "'
WHERE
Id = '" . $id . "'
" );
}
return @ $retval ;
}
/*
* Функция принимает строку , и возвращает
* адрес первого изображения , которую найдет
*/
function getImgSrc ( $data )
{
preg_match_all ( " /(<img )(.+?)( \ /)?(>)/u " , $data , $images );
$host = $images [ 2 ][ 0 ];
if ( preg_match ( " /(src=)('| \" )(.+?)('| \" )/u " , $host , $matches ) == 1 )
$host = $matches [ 3 ];
preg_match ( '@/index\.php\?.*thumb=(.*?)\&@i' , $host , $matches );
if ( isset ( $matches [ 1 ]))
{
return $matches [ 1 ];
}
else
{
preg_match ( '/(.+)' . THUMBNAIL_DIR . '\/(.+)-.\d+x\d+(\..+)/u' , $host , $matches );
if ( isset ( $matches [ 1 ]))
{
return $matches [ 1 ] . $matches [ 2 ] . $matches [ 3 ];
}
else
{
return $host ;
}
}
}
/**
* Функция обработки тэгов полей с использованием шаблонов
* в соответствии с типом поля
*
* @ param int $rubric_id идентификатор рубрики
* @ param int $document_id идентификатор документа
* @ param int $maxlength максимальное количество символов обрабатываемого поля
* @ return string
*/
function request_get_document_field ( $field_id , $document_id , $maxlength = '' , $rubric_id = 0 )
{
if ( ! is_numeric ( $document_id ) || $document_id < 1 )
return '' ;
$document_fields = get_document_fields ( $document_id );
if ( ! is_array ( $document_fields [ $field_id ]))
$field_id = intval ( $document_fields [ $field_id ]);
if ( empty ( $document_fields [ $field_id ]))
return '' ;
$field_value = trim ( $document_fields [ $field_id ][ 'field_value' ]);
if ( $field_value == '' && $document_fields [ $field_id ][ 'tpl_req_empty' ])
return '' ;
$func = 'get_field_' . $document_fields [ $field_id ][ 'rubric_field_type' ];
if ( ! is_callable ( $func ))
$func = 'get_field_default' ;
$field_value = $func ( $field_value , 'req' , $field_id , $document_fields [ $field_id ][ 'rubric_field_template_request' ], $document_fields [ $field_id ][ 'tpl_req_empty' ], $maxlength , $document_fields , $rubric_id , $document_fields [ $field_id ][ 'rubric_field_default' ]);
if ( $maxlength != '' )
{
if ( $maxlength == 'more' || $maxlength == 'esc' || $maxlength == 'img' )
{
if ( $maxlength == 'more' )
{
// ToDo - Вывести в настройки или в настройки самого запроса
$teaser = explode ( '<a name="more"></a>' , $field_value );
$field_value = $teaser [ 0 ];
}
elseif ( $maxlength == 'esc' )
{
$field_value = addslashes ( $field_value );
}
elseif ( $maxlength == 'img' )
{
$field_value = getImgSrc ( $field_value );
}
}
elseif ( is_numeric ( $maxlength ))
{
if ( $maxlength < 0 )
{
$field_value = str_replace ( array ( " \r \n " , " \n " , " \r " ), " " , $field_value );
$field_value = strip_tags ( $field_value , " <a> " );
$field_value = preg_replace ( '/ +/' , ' ' , $field_value );
$field_value = trim ( $field_value );
$maxlength = abs ( $maxlength );
}
// ToDo - сделать настройки окончаний
if ( $maxlength != 0 )
{
$field_value = mb_substr ( $field_value , 0 , $maxlength ) . (( strlen ( $field_value ) > $maxlength ) ? '... ' : '' );
}
}
else
return false ;
}
return $field_value ;
}
function showteaser ( $id , $tparams = '' )
{
$item = showrequestelement ( $id , '' , $tparams );
$item = str_replace ( '[tag:path]' , ABS_PATH , $item );
$item = str_replace ( '[tag:mediapath]' , ABS_PATH . 'templates/' . (( defined ( 'THEME_FOLDER' ) === false ) ? DEFAULT_THEME_FOLDER : THEME_FOLDER ) . '/' , $item );
return $item ;
}
// Функция получения уникальных параметров для каждого тизера
function f_params_of_teaser ( $id_param_array , $num )
{
global $params_of_teaser ;
return $params_of_teaser [ $id_param_array ][ $num ];
}
// Функция получения элемента запроса
function showrequestelement ( $mixed , $template = '' , $tparams = '' )
{
global $AVE_DB , $req_item_num , $params_of_teaser , $use_cache ;
if ( is_array ( $mixed ))
$mixed = $mixed [ 1 ];
$row = ( is_object ( $mixed ) ? $mixed : $AVE_DB -> Query ( "
SELECT
a .*
FROM
" . PREFIX . " _documents AS a
WHERE
a . Id = '" . intval($mixed) . "'
GROUP BY
a . Id
LIMIT 1
" )->FetchRow());
if ( ! $row )
return '' ;
$tparams_id = '' ;
if ( $tparams != '' )
{
$tparams_id = $row -> Id . md5 ( $tparams ); // Создаем уникальный id для каждого набора параметров
$params_of_teaser [ $tparams_id ] = array (); // Для отмены лишних ворнингов
$tparams = trim ( $tparams , '[]:' ); // Удаляем: слева ':[', справа ']'
$params_of_teaser [ $tparams_id ] = explode ( '|' , $tparams ); // Заносим параметры в массив уникального id
}
$template = ( $template > '' ? $template : $AVE_DB -> Query (
" SELECT rubric_teaser_template FROM " . PREFIX . " _rubrics WHERE Id=' " . intval ( $row -> rubric_id ) . " ' "
) -> GetCell ());
$cachefile_docid = BASE_DIR . '/cache/sql/request/' . $row -> Id . '/request-' . md5 ( $template ) . '.cache' ;
if ( ! file_exists ( $cachefile_docid ))
{
$template = preg_replace ( " / \ [tag:if_notempty:rfld:([a-zA-Z0-9-_]+)] \ [(more|esc|img|[0-9-]+)]/u " , '<' . '?php if((htmlspecialchars(request_get_document_field(\'$1\', ' . $row -> Id . ', \'$2\', ' . ( int ) $row -> rubric_id . '), ENT_QUOTES)) != \'\') { ' . '?' . '>' , $template );
$template = preg_replace ( " / \ [tag:if_empty:rfld:([a-zA-Z0-9-_]+)] \ [(more|esc|img|[0-9-]+)]/u " , '<' . '?php if((htmlspecialchars(request_get_document_field(\'$1\', ' . $row -> Id . ', \'$2\', ' . ( int ) $row -> rubric_id . '), ENT_QUOTES)) == \'\') { ' . '?' . '>' , $template );
$template = str_replace ( '[tag:if:else]' , '<?php }else{ ?>' , $template );
$template = str_replace ( '[tag:/if]' , '<?php } ?>' , $template );
// Парсим теги визуальных блоков
$item = preg_replace_callback ( '/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/' , 'parse_block' , $template );
// Парсим теги системных блоков
$item = preg_replace_callback ( '/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/' , 'parse_sysblock' , $item );
$item = preg_replace_callback (
'/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/' ,
create_function (
'$m' ,
'return request_get_document_field($m[1], ' . $row -> Id . ', $m[2], ' . ( int ) $row -> rubric_id . ');'
),
$item
);
// Возвращаем поле из БД документа
$item = preg_replace_callback ( '/\[tag:doc:([a-zA-Z0-9-_]+)\]/u' ,
function ( $match )
{
return isset ( $row -> { $match [ 1 ]})
? $row -> { $match [ 1 ]}
: null ;
},
$item
);
// Если пришел вызов на активацию языковых файлов
$item = preg_replace_callback (
'/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u' ,
function ( $match )
{
global $AVE_Template ;
return $AVE_Template -> get_config_vars ( $match [ 1 ]);
},
$item
);
$item = str_replace ( '[tag:path]' , ABS_PATH , $item );
$item = str_replace ( '[tag:mediapath]' , ABS_PATH . 'templates/' . (( defined ( 'THEME_FOLDER' ) === false )
? DEFAULT_THEME_FOLDER
: THEME_FOLDER )
. '/' , $item );
// Watermarks
$item = preg_replace_callback (
'/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/' ,
create_function (
'$m' ,
'watermarks($m[1], $m[2], $m[3]);'
),
$item
);
// Удаляем ошибочные теги полей документа в шаблоне рубрики
$item = preg_replace ( '/\[tag:doc:\d*\]/' , '' , $item );
$item = preg_replace ( '/\[tag:langfile:\d*\]/' , '' , $item );
2017-09-21 09:50:14 +03:00
$item = preg_replace_callback ( '/\[tag:([r|c|f|t|s]\d+x\d+r*):(.+?)]/' , 'callback_make_thumbnail' , $item );
2017-06-24 00:58:56 +03:00
if ( $tparams != '' )
{
// Заменяем tparam в тизере
// $item = preg_replace('/\[tparam:([0-9]+)\]/', '<'.'?php echo $params_of_teaser["'.$tparams_id.'"][$1]'.'?'.'>', $item); // косячная версия, пока оставил
$item = preg_replace_callback (
'/\[tparam:([0-9]+)\]/' ,
create_function (
'$m' ,
'return f_params_of_teaser(' . $tparams_id . ', $m[1]);'
),
$item
);
}
else
{
// Если чистый запрос тизера, просто вытираем tparam
$item = preg_replace ( '/\[tparam:([0-9]+)\]/' , '' , $item );
}
// Блок для проверки передачи параметров тизеру
/*
if ( count ( $params_of_teaser [ $tparams_id ]))
{
Debug :: echo ( $params_of_teaser );
Debug :: echo ( $row_Id_mas );
Debug :: echo ( $item , true );
}
*/
$link = rewrite_link ( 'index.php?id=' . $row -> Id . '&doc=' . ( empty ( $row -> document_alias ) ? prepare_url ( $row -> document_title ) : $row -> document_alias ));
$item = str_replace ( '[tag:link]' , $link , $item );
$item = str_replace ( '[tag:docid]' , $row -> Id , $item );
$item = str_replace ( '[tag:docitemnum]' , $req_item_num , $item );
$item = str_replace ( '[tag:adminlink]' , 'index.php?do=docs&action=edit&rubric_id=' . $row -> rubric_id . '&Id=' . $row -> Id . '&cp=' . session_id () . '' , $item );
$item = str_replace ( '[tag:doctitle]' , stripslashes ( htmlspecialchars_decode ( $row -> document_title )), $item );
$item = str_replace ( '[tag:docparent]' , $row -> document_parent , $item );
$item = str_replace ( '[tag:doclang]' , $row -> document_lang , $item );
$item = str_replace ( '[tag:docdate]' , pretty_date ( strftime ( DATE_FORMAT , $row -> document_published )), $item );
$item = str_replace ( '[tag:doctime]' , pretty_date ( strftime ( TIME_FORMAT , $row -> document_published )), $item );
$item = str_replace ( '[tag:humandate]' , human_date ( $row -> document_published ), $item );
$item = preg_replace_callback (
'/\[tag:date:([a-zA-Z0-9-. \/]+)\]/' ,
create_function ( '$m' , 'return translate_date(date($m[1], ' . $row -> document_published . ' ));
' ),
$item
);
if ( preg_match ( '/\[tag:docauthor]/u' , $item ))
{
$item = str_replace ( '[tag:docauthor]' , get_username_by_id ( $row -> document_author_id ), $item );
}
$item = str_replace ( '[tag:docauthorid]' , $row -> document_author_id , $item );
$item = preg_replace_callback (
'/\[tag:docauthoravatar:(\d+)\]/' ,
create_function (
'$m' ,
'return getAvatar(' . intval ( $row -> document_author_id ) . ', $m[1]);'
),
$item
);
if ( isset ( $use_cache ) && $use_cache == 1 )
{
// Кеширование элементов запроса
if ( ! file_exists ( dirname ( $cachefile_docid )))
@ mkdir ( dirname ( $cachefile_docid ), 0777 , true );
file_put_contents ( $cachefile_docid , $item );
}
}
else
{
$item = file_get_contents ( $cachefile_docid );
}
$item = str_replace ( '[tag:docviews]' , $row -> document_count_view , $item );
$item = str_replace ( '[tag:doccomments]' , isset ( $row -> nums ) ? $row -> nums : '' , $item );
unset ( $row );
return $item ;
}
/**
* Обработка тега запроса .
* Возвращает список документов удовлетворяющих параметрам запроса
* оформленный с использованием шаблона
*
* @ param int $id идентификатор запроса
* @ return string
*/
function request_parse ( $id , $params = array ())
{
global $AVE_Core , $AVE_DB , $request_documents ;
// Если id пришёл из тега, берём нужную часть массива
if ( is_array ( $id ))
$id = $id [ 1 ];
$t = array ();
$a = array ();
$v = array ();
// Получаем информацию о запросе
$request = $AVE_DB -> Query ( "
SELECT
*
FROM
" . PREFIX . " _request
WHERE
" . (is_numeric( $id ) ? 'Id' : 'request_alias') . " = '" . $id . "'
" )->FetchRow();
// Выходим, если нет запроса
if ( ! is_object ( $request ))
return '' ;
// Фиксируем время начала генерации запроса
Debug :: startTime ( 'request_' . $id );
// Массив для полей SELECT
$request_select = array ();
// Массив для присоединения таблиц JOIN
$request_join = array ();
// Массив для добавления условий WHERE
$request_where = array ();
// Массив для сортировки результатов ORDER BY
$request_order = array ();
// Массив для сортировки результатов ORDER BY
$request_order_fields = array ();
$request_order_str = '' ;
$request_select_str = '' ;
// Сортировка по полям из переданных параметров
if ( empty ( $params [ 'SORT' ]) && ! empty ( $_REQUEST [ 'requestsort_' . $id ]) && ! is_array ( $_REQUEST [ 'requestsort_' . $id ]))
{
// Разрешаем перебор полей для сортировки через ";"
$sort = explode ( ';' , $_REQUEST [ 'requestsort_' . $id ]);
foreach ( $sort as $v )
{
$v1 = explode ( '=' , $v );
// Если хотим сортировку DESC то пишем alias = 0
$params [ 'SORT' ][ $v1 [ 0 ]] = ( isset ( $v1 [ 1 ]) && $v1 [ 1 ] == 0
? 'DESC'
: 'ASC' );
}
}
// Сортировка по полям
if ( ! empty ( $params [ 'SORT' ]) && is_array ( $params [ 'SORT' ]))
{
foreach ( $params [ 'SORT' ] as $fid => $sort )
{
$fid = ( int ) get_field_num ( $request -> rubric_id , $fid );
if (( int ) $fid <= 0 )
continue ;
$sort = strtolower ( $sort );
$request_join [ $fid ] = " <? if (preg_match('t[]'))?><?=(! isset( \$ t[ $fid ])) ? \" LEFT JOIN " . PREFIX . " _document_fields AS t $fid ON (t $fid .document_id = a.Id AND t $fid .rubric_field_id=' $fid ') \" : ''?> " ;
$asc_desc = strpos ( strtolower ( $sort ), 'asc' ) !== false ? 'ASC' : 'DESC' ;
$request_order [ 'field-' . $fid ] = " t $fid .field_value " . $asc_desc ;
$request_order_fields [] = $fid ;
}
}
// Сортировка по полю из настроек (только если не передана другая в параметрах)
elseif ( $request -> request_order_by_nat )
{
$fid = ( int ) $request -> request_order_by_nat ;
// Добавляем с учётом переменной $t из условий, чтобы не выбирать те же таблиы заново - это оптимизирует время
$request_join [ $fid ] = " <?=(! isset( \$ t[ $fid ])) ? \" LEFT JOIN " . PREFIX . " _document_fields AS t $fid ON (t $fid .document_id = a.Id AND t $fid .rubric_field_id=' $fid ') \" : ''?> " ;
$request_order [ 'field-' . $fid ] = " t $fid .field_value " . $request -> request_asc_desc ;
$request_order_fields [] = $fid ;
}
// Вторичная сортировка по параметру документа - добавляем в конец сортировок
if ( ! empty ( $params [ 'RANDOM' ]))
{
$request_order [ 'sort' ] = ( $params [ 'RANDOM' ] == 1 )
? 'RAND()'
: '' ;
}
elseif ( $request -> request_order_by )
{
$request_order [ 'sort' ] = ( $request -> request_order_by == 'RAND()' )
? 'RAND()'
: 'a.' . $request -> request_order_by . ' ' . $request -> request_asc_desc ;
}
// Заменяем field_value на field_number_value во всех полях для сортировки, если поле числовое
if ( ! empty ( $request_order_fields ))
{
$sql_numeric = $AVE_DB -> Query ( "
SELECT
Id
FROM
" . PREFIX . " _rubric_fields
WHERE
Id IN ( " . implode(',', $request_order_fields ) . " )
AND
rubric_field_numeric = '1'
" );
if ( $sql_numeric -> _result -> num_rows > 0 )
{
while ( $fid = ( int ) $sql_numeric -> FetchRow () -> Id )
$request_order [ 'field-' . $fid ] = str_replace ( 'field_value' , 'field_number_value' , $request_order [ 'field-' . $fid ]);
}
}
// Статус: если в параметрах, то е г о ставим. иначе выводим только активные доки
$request_where [] = " a.document_status = ' " . (( isset ( $params [ 'STATUS' ]))
? ( int ) $params [ 'STATUS' ]
: '1' ) . " ' " ;
// Н е выводить текущий документ
if ( $request -> request_hide_current )
$request_where [] = " a.Id != ' " . get_current_document_id () . " ' " ;
// Язык
if ( $request -> request_lang )
$request_where [] = " a.document_lang = ' " . $_SESSION [ 'user_language' ] . " ' " ;
// Дата публикации документов
if ( get_settings ( 'use_doctime' ))
$request_where [] = " a.document_published <= UNIX_TIMESTAMP() AND (a.document_expire = 0 OR a.document_expire >= UNIX_TIMESTAMP()) " ;
// Условия запроса
// если используется выпадающий список, получаем строку без сохранения
if ( ! empty ( $_POST [ 'req_' . $id ]) || ! empty ( $_SESSION [ 'doc_' . $AVE_Core -> curentdoc -> Id ][ 'req_' . $id ]))
$where_cond = request_get_condition_sql_string ( $request -> Id , false );
// если условия пустые, получаем строку с сохранением её в бд
elseif ( ! $request -> request_where_cond )
$where_cond = request_get_condition_sql_string ( $request -> Id , true );
// иначе, берём из запроса
else $where_cond = unserialize ( $request -> request_where_cond );
$where_cond [ 'from' ] = ( isset ( $where_cond [ 'from' ]))
? str_replace ( '%%PREFIX%%' , PREFIX , $where_cond [ 'from' ])
: '' ;
if ( isset ( $where_cond [ 'where' ])) $request_where [] = $where_cond [ 'where' ];
// Родительский документ
if ( isset ( $params [ 'PARENT' ]) && ( int ) $params [ 'PARENT' ] > 0 )
$request_where [] = " a.document_parent = ' " . ( int ) $params [ 'PARENT' ] . " ' " ;
// Автор
// Если задано в параметрах
if ( isset ( $params [ 'USER_ID' ]))
$user_id = ( int ) $params [ 'USER_ID' ];
// Если стоит галка, показывать только СВОИ документы в настройках
// Аноним не увидит ничего, так как 0 юзера нет
elseif ( $request -> request_only_owner == '1' )
$user_id = ( int ) $_SESSION [ 'user_id' ];
// Если что-то добавили, пишем
if ( isset ( $user_id ))
$request_where [] = " a.document_author_id = ' " . $user_id . " ' " ;
// Произвольные условия WHERE
if ( isset ( $params [ 'USER_WHERE' ]) && $params [ 'USER_WHERE' ] > '' )
{
if ( is_array ( $params [ 'USER_WHERE' ]))
$request_where = array_merge ( $request_where , $params [ 'USER_WHERE' ]);
else
$request_where [] = $params [ 'USER_WHERE' ];
}
// Готовим строку с условиями
array_unshift ( $request_where , "
a . Id != '1' AND a . Id != '" . PAGE_NOT_FOUND_ID . "' AND
a . rubric_id = '" . $request->rubric_id . "' AND
a . document_deleted != '1' " );
$request_where_str = '(' . implode ( ') AND (' , $request_where ) . ')' ;
// Количество выводимых доков
$params [ 'LIMIT' ] = ( ! empty ( $params [ 'LIMIT' ])
? $params [ 'LIMIT' ]
: ( ! empty ( $_REQUEST [ 'requestlimiter_' . $id ])
? $_REQUEST [ 'requestlimiter_' . $id ]
: ( int ) $request -> request_items_per_page ));
$limit = ( isset ( $params [ 'LIMIT' ]) && is_numeric ( $params [ 'LIMIT' ]) && $params [ 'LIMIT' ] > '' )
? ( int ) $params [ 'LIMIT' ]
: ( int ) $request -> request_items_per_page ;
$start = ( isset ( $params [ 'START' ]))
? ( int ) $params [ 'START' ]
: (( $request -> request_show_pagination == 1 )
? get_current_page ( 'apage' ) * $limit - $limit
: 0 );
$limit_str = ( $limit > 0 )
? " LIMIT " . $start . " , " . $limit
: '' ;
// Готовим строку с сортировкой
if ( $request_order )
$request_order_str = " ORDER BY " . implode ( ', ' , $request_order );
// Готовим строку с полями
if ( $request_select )
$request_select_str = ',' . implode ( " , \r \n " , $request_select );
unset ( $a , $t , $v );
// Составляем запрос к БД
$sql = " ?>
SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS
a . Id ,
a . rubric_id ,
a . document_title ,
a . document_parent ,
a . document_alias ,
a . document_published ,
a . document_expire ,
a . document_changed ,
a . document_author_id ,
a . document_in_search ,
a . document_status ,
a . document_count_print ,
a . document_count_view ,
a . document_linked_navi_id ,
a . document_lang
" . $request_select_str . "
FROM
" . $where_cond['from'] . "
" . (isset( $params['USER_FROM'] ) ? $params['USER_FROM'] : '') . "
" . PREFIX . " _documents AS a
" . implode(' ', $request_join ) . "
" . (isset( $params['USER_JOIN'] ) ? $params['USER_FROM'] : '') . "
WHERE
" . $request_where_str . "
GROUP BY a . Id
" . $request_order_str . "
" . $limit_str . "
< ? " ;
$sql_request = eval2var ( $sql );
unset ( $sql );
// Убираем дубли в выборе полей
foreach ( array_keys ( $request_join ) AS $key )
{
$search = PREFIX . '_document_fields AS t' . $key . ',' ;
if ( preg_match ( '/' . $search . '/' , $sql_request ) > 0 )
{
$sql_request = str_replace ( $search , '' , $sql_request );
}
}
// Если просили просто показать сформированный запрос
if (( isset ( $params [ 'DEBUG' ]) && $params [ 'DEBUG' ] == 1 ) || $request -> request_show_sql == 1 )
{
$return = Debug :: _print ( $sql_request );
return $return ;
}
// Выполняем запрос к бд
$sql = $AVE_DB -> Query ( $sql_request , ( int ) $request -> request_cache_lifetime , 'rub_' . $request -> rubric_id );
// Если просили просто вернуть запрос, возвращаем результат
if ( isset ( $params [ 'RETURN_SQL' ]) && $params [ 'RETURN_SQL' ] == 1 )
return $sql ;
// Если есть вывод пагинации, то выполняем запрос на получение кол-ва элементов
if ( $request -> request_show_pagination == 1 || ( isset ( $params [ 'SHOW' ]) && $params [ 'SHOW' ] == 1 ))
{
$num_items = $AVE_DB -> NumAllRows ( $sql_request , ( int ) $request -> request_cache_lifetime , 'rub_' . $request -> rubric_id );
}
else
{
$num_items = $AVE_DB -> GetFoundRows ();
}
unset ( $sql_request );
// Приступаем к обработке шаблона
$main_template = $request -> request_template_main ;
//-- Если кол-во элементов больше 0
if ( $num_items > 0 )
{
$main_template = preg_replace ( '/\[tag:if_empty](.*?)\[\/tag:if_empty]/si' , '' , $main_template );
$main_template = str_replace ( array ( '[tag:if_notempty]' , '[/tag:if_notempty]' ), '' , $main_template );
}
else
{
$main_template = preg_replace ( '/\[tag:if_notempty](.*?)\[\/tag:if_notempty]/si' , '' , $main_template );
$main_template = str_replace ( array ( '[tag:if_empty]' , '[/tag:if_empty]' ), '' , $main_template );
}
$pagination = '' ;
// Кол-во страниц
$num_pages = ( $limit > 0 )
? ceil ( $num_items / $limit )
: 0 ;
// Собираем пагинацию, еслиесть указание е е выводить
if ( $request -> request_show_pagination == 1 || ( isset ( $params [ 'SHOW' ]) && $params [ 'SHOW' ] == 1 ))
{
// Если в запросе пришел номер страницы и он больше, чем кол-во страниц
// Делаем перенаправление
if ( isset ( $_REQUEST [ 'apage' ]) && is_numeric ( $_REQUEST [ 'apage' ]) && $_REQUEST [ 'apage' ] > $num_pages )
{
$redirect_link = rewrite_link ( 'index.php?id=' . $AVE_Core -> curentdoc -> Id
. '&doc=' . ( empty ( $AVE_Core -> curentdoc -> document_alias )
? prepare_url ( $AVE_Core -> curentdoc -> document_title )
: $AVE_Core -> curentdoc -> document_alias )
. (( isset ( $_REQUEST [ 'artpage' ]) && is_numeric ( $_REQUEST [ 'artpage' ]))
? '&artpage=' . $_REQUEST [ 'artpage' ]
: '' )
. (( isset ( $_REQUEST [ 'page' ]) && is_numeric ( $_REQUEST [ 'page' ]))
? '&page=' . $_REQUEST [ 'page' ]
: '' ));
header ( 'Location:' . $redirect_link );
exit ;
}
// Запоминаем глобально
@ $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'apage' ] = ( @ $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'apage' ] > $num_pages
? @ $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'apage' ]
: $num_pages );
$pagination = '' ;
if ( $num_pages > 1 )
{
$queries = '' ;
// Добавляем GET-запрос в пагинацию если пришло ADD_GET
// или указанов настройках запроса
if ( $request -> request_use_query == 1 || ( isset ( $params [ 'ADD_GET' ]) && $params [ 'ADD_GET' ] == 1 ))
$queries = ( $_SERVER [ 'QUERY_STRING' ])
? '?' . $_SERVER [ 'QUERY_STRING' ]
: '' ;
$pagination = 'index.php?id='
. $AVE_Core -> curentdoc -> Id
. '&doc=' . ( empty ( $AVE_Core -> curentdoc -> document_alias )
? prepare_url ( $AVE_Core -> curentdoc -> document_title )
: $AVE_Core -> curentdoc -> document_alias )
. '&apage={s}'
. (( isset ( $_REQUEST [ 'artpage' ]) && is_numeric ( $_REQUEST [ 'artpage' ]))
? '&artpage=' . $_REQUEST [ 'artpage' ]
: '' )
. (( isset ( $_REQUEST [ 'page' ]) && is_numeric ( $_REQUEST [ 'page' ]))
? '&page=' . $_REQUEST [ 'page' ]
: '' )
// Добавляем GET-запрос в пагинацию
. clean_php ( $queries )
;
// ID пагинации
$pagination_id = ( isset ( $params [ 'PAGINATION' ]) && $params [ 'PAGINATION' ] > 0 )
? $params [ 'PAGINATION' ]
: $request -> request_pagination ;
// Собираем пагинацию
$pagination = AVE_Paginations :: getPagination ( $num_pages , 'apage' , $pagination , $pagination_id );
// Костыли для Главной страницы
$pagination = str_ireplace ( '"//"' , '"/"' , str_ireplace ( '///' , '/' , rewrite_link ( $pagination )));
$pagination = str_ireplace ( '"//' . URL_SUFF . '"' , '"/"' , $pagination );
}
}
// Элементы запроса
$rows = array ();
// id найденных документов
$request_documents = array ();
while ( $row = $sql -> FetchRow ())
{
// Собираем Id документов
array_push ( $request_documents , $row -> Id );
// Собираем оставшуюся информацию
array_push ( $rows , $row );
}
// Обрабатываем шаблоны элементов
$items = '' ;
$x = 0 ;
$items_count = count ( $rows );
global $req_item_num , $use_cache ;
$use_cache = $request -> request_cache_elements ;
$item = '' ;
foreach ( $rows as $row )
{
$x ++ ;
$last_item = ( $x == $items_count ? true : false );
$item_num = $x ;
$req_item_num = $item_num ;
$item = showrequestelement ( $row , $request -> request_template_item );
$item = '<' . '?php $item_num=' . var_export ( $item_num , 1 ) . '; $last_item=' . var_export ( $last_item , 1 ) . '?' . '>' . $item ;
$item = '<?php $req_item_id = ' . $row -> Id . ';?>' . $item ;
$item = str_replace ( '[tag:if_first]' , '<' . '?php if(isset($item_num) && $item_num===1) { ?' . '>' , $item );
$item = str_replace ( '[tag:if_not_first]' , '<' . '?php if(isset($item_num) && $item_num!==1) { ?' . '>' , $item );
$item = str_replace ( '[tag:if_last]' , '<' . '?php if(isset($last_item) && $last_item) { ?' . '>' , $item );
$item = str_replace ( '[tag:if_not_last]' , '<' . '?php if(isset($item_num) && !$last_item) { ?' . '>' , $item );
$item = preg_replace ( '/\[tag:if_every:([0-9-]+)\]/u' , '<' . '?php if(isset($item_num) && !($item_num % $1)){ ' . '?' . '>' , $item );
$item = preg_replace ( '/\[tag:if_not_every:([0-9-]+)\]/u' , '<' . '?php if(isset($item_num) && ($item_num % $1)){ ' . '?' . '>' , $item );
$item = str_replace ( '[tag:/if]' , '<' . '?php } ?>' , $item );
$item = str_replace ( '[tag:if_else]' , '<' . '?php }else{ ?>' , $item );
$items .= $item ;
}
// Обрабатываем теги запроса
// Парсим теги визуальных блоков
$main_template = preg_replace_callback ( '/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/' , 'parse_block' , $main_template );
// Парсим теги системных блоков
$main_template = preg_replace_callback ( '/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/' , 'parse_sysblock' , $main_template );
//-- Заменяем тег пагинации на пагинацию
$main_template = str_replace ( '[tag:pages]' , $pagination , $main_template );
$main_template = preg_replace_callback (
'/\[tag:date:([a-zA-Z0-9-. \/]+)\]/' ,
create_function ( '$m' , 'return translate_date(date($m[1], ' . $AVE_Core -> curentdoc -> document_published . ' ));
' ),
$main_template
);
$main_template = str_replace ( '[tag:humandate]' , human_date ( $AVE_Core -> curentdoc -> document_published ), $main_template );
$main_template = str_replace ( '[tag:docdate]' , pretty_date ( strftime ( DATE_FORMAT , $AVE_Core -> curentdoc -> document_published )), $main_template );
$main_template = str_replace ( '[tag:doctime]' , pretty_date ( strftime ( TIME_FORMAT , $AVE_Core -> curentdoc -> document_published )), $main_template );
if ( preg_match ( '/\[tag:docauthor]/u' , $item ))
{
$main_template = str_replace ( '[tag:docauthor]' , get_username_by_id ( $AVE_Core -> curentdoc -> document_author_id ), $main_template );
}
//-- Общее число элементов запроса
$main_template = str_replace ( '[tag:doctotal]' , $num_items , $main_template );
//-- Показано элементов запроса на странице
$main_template = str_replace ( '[tag:doconpage]' , $x , $main_template );
//-- Номер страницы пагинации
$main_template = str_replace ( '[tag:pages:curent]' , get_current_page ( 'apage' ), $main_template );
//-- Общее кол-во страниц пагинации
$main_template = str_replace ( '[tag:pages:total]' , $num_pages , $main_template );
$main_template = str_replace ( '[tag:pagetitle]' , stripslashes ( htmlspecialchars_decode ( $AVE_Core -> curentdoc -> document_title )), $main_template );
$main_template = str_replace ( '[tag:alias]' , ( isset ( $AVE_Core -> curentdoc -> document_alias ) ? $AVE_Core -> curentdoc -> document_alias : '' ), $main_template );
// Возвращаем параметр документа из БД
$main_template = preg_replace_callback ( '/\[tag:doc:([a-zA-Z0-9-_]+)\]/u' ,
function ( $match )
{
return isset ( $row -> { $match [ 1 ]})
? $row -> { $match [ 1 ]}
: null ;
},
$main_template
);
// Если пришел вызов на активацию языковых файлов
$main_template = preg_replace_callback (
'/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u' ,
function ( $match )
{
global $AVE_Template ;
return $AVE_Template -> get_config_vars ( $match [ 1 ]);
},
$main_template
);
// Вставляем элементы запроса
$return = str_replace ( '[tag:content]' , $items , $main_template );
// Парсим тег [hide]
$return = parse_hide ( $return );
$return = str_replace ( '[tag:path]' , ABS_PATH , $return );
$return = str_replace ( '[tag:mediapath]' , ABS_PATH . 'templates/' . (( defined ( 'THEME_FOLDER' ) === false ) ? DEFAULT_THEME_FOLDER : THEME_FOLDER ) . '/' , $return );
// Парсим модули
$return = $AVE_Core -> coreModuleTagParse ( $return );
// Фиксируем время генерации запроса
$GLOBALS [ 'block_generate' ][] = array ( 'REQUEST_' . $id => Debug :: endTime ( 'request_' . $id ));
// Статистика
if ( $request -> request_show_statistic )
$return .= " <div class= \" request_statistic \" ><br>Найдено: $num_items <br>Показано: $items_count <br>Время генерации: " . Debug :: endTime ( 'request_' . $id ) . " сек<br>Пиковое значение: " . number_format ( memory_get_peak_usage () / 1024 , 0 , ',' , ' ' ) . ' Kb</div>' ;
return $return ;
}
/**
* Функция получения содержимого поля для обработки в шаблоне запроса
* < pre >
* Пример использования в шаблоне :
* < li >
* < ? php
* $r = request_get_document_field_value ( 12 , [ tag : docid ]);
* echo $r . ' (' . strlen ( $r ) . ')' ;
* ?>
* </ li >
* </ pre >
*
* @ param int $rubric_id идентификатор поля , для [ tag : rfld : 12 ][ 150 ] $rubric_id = 12
* @ param int $document_id идентификатор документа к которому принадлежит поле .
* @ param int $maxlength необязательный параметр , количество возвращаемых символов .
* Если данный параметр указать с о знаком минус
* содержимое поля будет очищено от HTML - тегов .
* @ return string
*/
function request_get_document_field_value ( $rubric_id , $document_id , $maxlength = 0 )
{
if ( ! is_numeric ( $rubric_id ) || $rubric_id < 1 || ! is_numeric ( $document_id ) || $document_id < 1 ) return '' ;
$document_fields = get_document_fields ( $document_id );
$field_value = isset ( $document_fields [ $rubric_id ]) ? $document_fields [ $rubric_id ][ 'field_value' ] : '' ;
if ( ! empty ( $field_value ))
{
$field_value = strip_tags ( $field_value , '<br /><strong><em><p><i>' );
$field_value = str_replace ( '[tag:mediapath]' , ABS_PATH . 'templates/' . (( defined ( 'THEME_FOLDER' ) === false ) ? DEFAULT_THEME_FOLDER : THEME_FOLDER ) . '/' , $field_value );
}
if ( is_numeric ( $maxlength ) && $maxlength != 0 )
{
if ( $maxlength < 0 )
{
$field_value = str_replace ( array ( " \r \n " , " \n " , " \r " ), ' ' , $field_value );
$field_value = strip_tags ( $field_value , " <a> " );
$field_value = preg_replace ( '/ +/' , ' ' , $field_value );
$maxlength = abs ( $maxlength );
}
$field_value = mb_substr ( $field_value , 0 , $maxlength ) . ( strlen ( $field_value ) > $maxlength ? '... ' : '' );
}
return $field_value ;
}
?>