2017-06-24 00:58:56 +03:00
< ? php
2018-03-12 23:35:55 +03:00
/**
* AVE . cms
*
* @ package AVE . cms
* @ version 3. x
* @ filesource
* @ copyright © 2007 - 2014 AVE . cms , http :// www . ave - cms . ru
*
* @ license GPL v . 2
*/
2018-09-20 11:04:28 +03:00
/**
* Достаем настройки запроса
*
* @ param $id
*
* @ return string
*/
2018-03-12 23:35:55 +03:00
function request_get_settings ( $id )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
global $AVE_DB ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Получаем информацию о запросе
2018-05-16 23:14:07 +03:00
$sql = "
2018-03-12 23:35:55 +03:00
SELECT
2018-05-16 23:14:07 +03:00
#REQUEST SETTINGS = $id
2018-03-12 23:35:55 +03:00
*
FROM
" . PREFIX . " _request
WHERE
" . (is_numeric( $id ) ? 'Id' : 'request_alias') . " = '" . $id . "'
2018-05-16 23:14:07 +03:00
" ;
$reqest_settings = $AVE_DB -> Query ( $sql , - 1 , 'rqs_' . $id , true , '.settings' ) -> FetchRow ();
2018-03-12 23:35:55 +03:00
// Выходим, если нет запроса
if ( ! is_object ( $reqest_settings ))
return '' ;
else
return $reqest_settings ;
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
/**
* Обработка условий запроса .
* Возвращает строку условий в SQL - формате
*
2018-09-20 11:04:28 +03:00
* @ param int $id идентификатор запроса
* @ param bool $update_db
*
* @ return array
2018-03-12 23:35:55 +03:00
*/
function request_get_condition_sql_string ( $id , $update_db = false )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
global $AVE_DB , $AVE_Core ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$id = ( int ) $id ;
2020-01-20 13:09:57 +03:00
$from = [];
$where = [];
2018-03-12 23:35:55 +03:00
$sql_ak = $AVE_DB -> Query ( "
SELECT *
FROM
" . PREFIX . " _request_conditions
WHERE
request_id = '" . $id . "'
AND
condition_status = '1'
ORDER BY
condition_position ASC
" );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Обрабатываем выпадающие списки
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( ! defined ( 'ACP' ))
{
$doc = 'doc_' . $AVE_Core -> curentdoc -> Id ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
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 ];
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
if ( ! empty ( $_POST [ 'req_' . $id ]) && is_array ( $_POST [ 'req_' . $id ]))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$i = 1 ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
foreach ( $_POST [ 'req_' . $id ] as $fid => $val )
{
if ( ! ( $val != '' && isset ( $_SESSION [ 'val_' . $fid ]) && in_array ( $val , $_SESSION [ 'val_' . $fid ])))
continue ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$from_dd [] = " %%PREFIX%%_document_fields AS t0 $i , " ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$where_dd [] = " ((t0 $i .document_id = a.Id) AND (t0 $i .rubric_field_id = $fid AND t0 $i .field_value = ' $val ')) " ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
++ $i ;
}
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
$i = 0 ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
while ( $row_ak = $sql_ak -> FetchRow ())
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
// id поля рубрики
$fid = $row_ak -> condition_field_id ;
2020-01-20 13:09:57 +03:00
2018-03-12 23:35:55 +03:00
// значение для условия
$val = trim ( $row_ak -> condition_value );
2020-01-20 13:09:57 +03:00
2018-03-12 23:35:55 +03:00
// если это поле используется для выпадающего списка или пустое значение для условия, пропускаем
2018-09-20 11:04:28 +03:00
if ( isset ( $_POST [ 'req_' . $id ]) && isset ( $_POST [ 'req_' . $id ][ $fid ]) || $val === '' )
2018-03-12 23:35:55 +03:00
continue ;
2020-01-20 13:09:57 +03:00
2018-03-12 23:35:55 +03:00
// И / ИЛИ
if ( ! isset ( $join ) && $row_ak -> condition_join )
$join = $row_ak -> condition_join ;
2020-01-20 13:09:57 +03:00
2018-03-12 23:35:55 +03:00
// тип сравнения
$type = $row_ak -> condition_compare ;
// выясняем, числовое поле или нет
if ( ! isset ( $numeric [ $fid ]))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$numeric [ $fid ] = ( bool ) $AVE_DB -> Query ( "
SELECT
rubric_field_numeric
FROM
" . PREFIX . " _rubric_fields
WHERE
Id = '" . $fid . "'
" )->GetCell();
2017-06-24 00:58:56 +03:00
}
2018-09-20 11:04:28 +03:00
$fv = $numeric [ $fid ]
? " t $fid .field_number_value "
: " UPPER(t $fid .field_value) " ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// подставляем название таблицы в свободные условия
$val = addcslashes ( str_ireplace ( array ( '[field]' , '[numeric_field]' ), $fv , $val ), " ' " );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// формируем выбор таблицы
// первый раз евалом проходим значение и запоминаем это в переменной $v[$i]
// как только таблица выбрана, фиксируем это в $t[$fid], чтобы не выбирать по несколько раз одни и те же таблицы
2020-01-20 13:09:57 +03:00
$from [] = " <?php \$ v[ $i ] = trim(eval2var(' ?> $val <?php ')); \$ t = []; if ( \$ v[ $i ]>'' && !isset( \$ t[ $fid ])) { echo \" %%PREFIX%%_document_fields AS t $fid , \" ; \$ t[ $fid ]=1;} ?> " ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// обрабатываем условия
switch ( $type )
{
2019-08-19 09:34:29 +03:00
case 'N<' : case '<' : $where [] = " <?php echo \$ 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 [] = " <?php echo \$ 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 [] = " <?php echo \$ 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 [] = " <?php echo \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv >= UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case '==' : $where [] = " <?php echo \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv = UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case '!=' : $where [] = " <?php echo \$ v[ $i ]>'' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND $fv != UPPER(' \$ v[ $i ]'))) $join\ " : '' ?> "; break;
case '%%' : $where [] = " <?php echo \$ 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 [] = " <?php echo \$ 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 [] = " <?php echo \$ 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 [] = " <?php echo \$ 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 [] = " <?php
2018-03-12 23:35:55 +03:00
\ $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 ]);
2019-08-19 09:34:29 +03:00
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 [] = " <?php
2018-03-12 23:35:55 +03:00
\ $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 ]);
2019-08-19 09:34:29 +03:00
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;
2018-03-12 23:35:55 +03:00
2019-08-19 09:34:29 +03:00
case 'IN=' : $where [] = " <?php echo ( \$ 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 [] = " <?php echo ( \$ 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;
2018-03-12 23:35:55 +03:00
2018-09-20 11:04:28 +03:00
case 'ANY' : $where [] = " <?php echo \$ 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 [] = " <?php echo \$ v[ $i ] > '' ? \" (t $fid .document_id = a.id AND (t $fid .rubric_field_id = ' $fid ' AND ( \$ v[ $i ]))) $join\ " : '' ; ?> "; break;
2018-03-12 23:35:55 +03:00
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$i ++ ;
}
2017-06-24 00:58:56 +03:00
2020-01-20 13:09:57 +03:00
$retval = [];
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( ! empty ( $where ) || ! empty ( $where_dd ))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
if ( ! empty ( $where_dd ))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$from = ( isset ( $from_dd ) ? array_merge ( $from , $from_dd ) : $from );
$from = implode ( ' ' , $from );
$where_dd = ( isset ( $where_dd ) ? ' AND ' : '' ) . implode ( ' AND ' , $where_dd );
2020-01-20 13:09:57 +03:00
$where = implode ( ' ' , $where ) . " <?php \$ a = []; echo (!array_sum( \$ a) || ' $join '=='AND') ? '1=1' : '1=0'; ?> " ;
$retval = [ 'from' => $from , 'where' => $where . $where_dd ];
2017-06-24 00:58:56 +03:00
}
else
{
2018-03-12 23:35:55 +03:00
$from = implode ( ' ' , $from );
2020-01-20 13:09:57 +03:00
$where = implode ( ' ' , $where ) . " <?php \$ a = []; echo (!array_sum( \$ a) || ' $join '=='AND') ? '1=1' : '1=0'; ?> " ;
$retval = [ 'from' => $from , 'where' => $where ];
2017-06-24 00:58:56 +03:00
}
}
2018-03-12 23:35:55 +03:00
// если вызвано из админки или просили обновить, обновляем запрос в бд
if ( defined ( 'ACP' ) || $update_db )
{
$AVE_DB -> Query ( "
UPDATE
" . PREFIX . " _request
SET
request_where_cond = '" . ($retval ? addslashes(serialize($retval)) : ' ') . "'
WHERE
Id = '" . $id . "'
" );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
$AVE_DB -> clearRequest ( $id );
2018-03-12 23:35:55 +03:00
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
return @ $retval ;
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
/**
* Функция обработки тэгов полей с использованием шаблонов
* в соответствии с типом поля
*
2018-09-20 11:04:28 +03:00
* @ param $field_id
* @ param int $document_id идентификатор документа
* @ param string $maxlength максимальное количество символов обрабатываемого поля
* @ param int $rubric_id идентификатор рубрики
*
2018-03-12 23:35:55 +03:00
* @ return string
*/
2020-01-20 13:09:57 +03:00
function request_get_document_field ( $field_id , $document_id , $maxlength = null , $rubric_id = 0 )
2018-03-12 23:35:55 +03:00
{
if ( ! is_numeric ( $document_id ) || $document_id < 1 )
return '' ;
2019-08-25 22:54:48 +03:00
$_maxlength = $maxlength ;
2018-03-12 23:35:55 +03:00
$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' ;
2019-08-25 22:54:48 +03:00
$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' ]);
2018-03-12 23:35:55 +03:00
if ( $maxlength != '' )
{
2018-05-16 23:14:07 +03:00
if ( $maxlength == 'more' || $maxlength == 'esc' || $maxlength == 'img' || $maxlength == 'strip' )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
if ( $maxlength == 'more' )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
// ToDo - Вывести в настройки или в настройки самого запроса
$teaser = explode ( '<a name="more"></a>' , $field_value );
$field_value = $teaser [ 0 ];
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
elseif ( $maxlength == 'esc' )
{
$field_value = addslashes ( $field_value );
}
elseif ( $maxlength == 'img' )
{
$field_value = getImgSrc ( $field_value );
}
2018-05-16 23:14:07 +03:00
elseif ( $maxlength == 'strip' )
{
$field_value = str_replace ( array ( " \r \n " , " \n " , " \r " ), " " , $field_value );
$field_value = strip_tags ( $field_value , REQUEST_STRIP_TAGS );
$field_value = preg_replace ( '/ +/' , ' ' , $field_value );
$field_value = trim ( $field_value );
}
2018-03-12 23:35:55 +03:00
}
elseif ( is_numeric ( $maxlength ))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
if ( $maxlength < 0 )
{
$field_value = str_replace ( array ( " \r \n " , " \n " , " \r " ), " " , $field_value );
$field_value = strip_tags ( $field_value , REQUEST_STRIP_TAGS );
$field_value = preg_replace ( '/ +/' , ' ' , $field_value );
$field_value = trim ( $field_value );
$maxlength = abs ( $maxlength );
}
// ToDo - сделать настройки окончаний
if ( $maxlength != 0 )
{
$field_value = truncate ( $field_value , $maxlength , REQUEST_ETC , REQUEST_BREAK_WORDS );
}
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
else
return false ;
}
return $field_value ;
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
function showteaser ( $id , $tparams = '' )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$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 );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
return $item ;
}
2017-06-24 00:58:56 +03:00
2020-01-20 13:09:57 +03:00
2018-03-12 23:35:55 +03:00
// Функция получения уникальных параметров для каждого тизера
function f_params_of_teaser ( $id_param_array , $num )
{
global $params_of_teaser ;
return $params_of_teaser [ $id_param_array ][ $num ];
}
2017-06-24 00:58:56 +03:00
2020-01-20 13:09:57 +03:00
2018-03-12 23:35:55 +03:00
// Функция получения элемента запроса
function showrequestelement ( $mixed , $template = '' , $tparams = '' )
2017-06-24 00:58:56 +03:00
{
2018-05-16 23:14:07 +03:00
global
$AVE_DB ,
$req_item_num ,
$params_of_teaser ,
$use_cache ,
$request_id ,
$request_changed ,
$request_changed_elements ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( is_array ( $mixed ))
2018-05-16 23:14:07 +03:00
$row = intval ( $mixed [ 1 ]);
2019-11-04 23:04:31 +03:00
else if ( is_numeric ( $mixed ))
$row = intval ( $mixed );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
$row = ( is_object ( $mixed )
? $mixed
: getDocument ( $row ));
unset ( $mixed );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( ! $row )
return '' ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$tparams_id = '' ;
if ( $tparams != '' )
{
2018-05-16 23:14:07 +03:00
$tparams_id = $row -> Id . md5 ( $tparams ); // Создаем уникальный id для каждого набора параметров
2020-01-20 13:09:57 +03:00
$params_of_teaser [ $tparams_id ] = []; // Для отмены лишних ворнингов
2018-09-20 11:04:28 +03:00
$tparams = trim ( $tparams , '[]:' ); // Удаляем: слева ':[', справа ']'
$params_of_teaser [ $tparams_id ] = explode ( '|' , $tparams ); // Заносим параметры в массив уникального id
2018-03-12 23:35:55 +03:00
}
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
$sql = "
SELECT
rubric_teaser_template
FROM
" . PREFIX . " _rubrics
WHERE
Id = '" . intval($row->rubric_id) . "'
" ;
$template = ( $template > ''
? $template
: $AVE_DB -> Query ( $sql ) -> GetCell ());
$hash = 'g-' . UGROUP ; // Группа пользователей
$hash .= 'r-' . $request_id ; // ID Запроса
$hash .= 't-' . $row -> Id ; // ID документа
$hash = md5 ( $hash );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
$cache_id = 'requests/elements/' . ( floor ( $row -> Id / 1000 )) . '/' . $row -> Id ;
$cachefile_docid = BASE_DIR . '/tmp/cache/sql/' . $cache_id . '/' . $hash . '.element' ;
if ( file_exists ( $cachefile_docid ) && isset ( $use_cache ) && $use_cache == 1 )
{
$check_file = $request_changed_elements ;
if ( $check_file > filemtime ( $cachefile_docid ))
unlink ( $cachefile_docid );
}
else
{
if ( file_exists ( $cachefile_docid ))
unlink ( $cachefile_docid );
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Если включен DEV MODE, то отключаем кеширование запросов
if ( defined ( 'DEV_MODE' ) AND DEV_MODE )
$cachefile_docid = null ;
if ( ! file_exists ( $cachefile_docid ))
2017-06-24 00:58:56 +03:00
{
2019-08-25 22:54:48 +03:00
// Если включено в настройках, проверять поле по содержимому
2018-05-23 19:32:14 +03:00
if ( defined ( 'USE_GET_FIELDS' ) && USE_GET_FIELDS )
{
$template = preg_replace ( " / \ [tag:if_notempty:rfld:([a-zA-Z0-9-_]+)] \ [(more|esc|img|strip|[0-9-]+)]/u " , '<' . '?php if((htmlspecialchars(get_field(\'$1\', ' . $row -> Id . '), ENT_QUOTES)) != \'\') { ' . '?' . '>' , $template );
$template = preg_replace ( " / \ [tag:if_empty:rfld:([a-zA-Z0-9-_]+)] \ [(more|esc|img|strip|[0-9-]+)]/u " , '<' . '?php if((htmlspecialchars(get_field(\'$1\', ' . $row -> Id . '), ENT_QUOTES)) == \'\') { ' . '?' . '>' , $template );
}
else
{
$template = preg_replace ( " / \ [tag:if_notempty:rfld:([a-zA-Z0-9-_]+)] \ [(more|esc|img|strip|[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|strip|[0-9-]+)]/u " , '<' . '?php if((htmlspecialchars(request_get_document_field(\'$1\', ' . $row -> Id . ', \'$2\', ' . ( int ) $row -> rubric_id . '), ENT_QUOTES)) == \'\') { ' . '?' . '>' , $template );
}
2018-03-12 23:35:55 +03:00
$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 );
// Парсим теги системных блоков
2019-08-19 09:34:29 +03:00
$item = preg_replace_callback ( '/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)(|:\{(.*?)\})\]/' ,
function ( $m )
{
return parse_sysblock ( $m [ 1 ], $m [ 2 ]);
},
$item );
2018-03-12 23:35:55 +03:00
2018-03-26 10:33:20 +03:00
// Парсим элементы полей
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tag:rfld:([a-zA-Z0-9-_]+)\]\[([0-9]+)]\[([0-9]+)]/' ,
function ( $m ) use ( $row )
{
return get_field_element ( $m [ 1 ], $m [ 2 ], $m [ 3 ], ( int ) $row -> Id );
},
$item );
2018-03-26 10:33:20 +03:00
// Парсим теги полей
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|strip|[0-9-]+)]/' ,
2019-08-25 22:54:48 +03:00
function ( $match ) use ( $row )
2018-09-20 11:04:28 +03:00
{
2019-08-25 22:54:48 +03:00
return request_get_document_field ( $match [ 1 ], ( int ) $row -> Id , $match [ 2 ], ( int ) $row -> rubric_id );
2018-09-20 11:04:28 +03:00
},
$item );
2018-03-26 10:33:20 +03:00
// Повторно парсим теги полей
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|strip|[0-9-]+)]/' ,
function ( $m ) use ( $row )
{
return request_get_document_field ( $m [ 1 ], ( int ) $row -> Id , $m [ 2 ], ( int ) $row -> rubric_id );
},
$item );
2018-03-26 10:33:20 +03:00
// Возвращаем поле документа из БД (document_***)
2018-03-12 23:35:55 +03:00
$item = preg_replace_callback ( '/\[tag:doc:([a-zA-Z0-9-_]+)\]/u' ,
2018-09-20 11:04:28 +03:00
function ( $m ) use ( $row )
2018-03-12 23:35:55 +03:00
{
2018-09-20 11:04:28 +03:00
return isset ( $row -> { $m [ 1 ]})
? $row -> { $m [ 1 ]}
2018-03-12 23:35:55 +03:00
: null ;
},
$item
);
// Если пришел вызов на активацию языковых файлов
$item = preg_replace_callback (
'/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u' ,
2018-09-20 11:04:28 +03:00
function ( $m )
2018-03-12 23:35:55 +03:00
{
global $AVE_Template ;
2018-09-20 11:04:28 +03:00
return $AVE_Template -> get_config_vars ( $m [ 1 ]);
2018-03-12 23:35:55 +03:00
},
$item
);
2018-03-26 10:33:20 +03:00
// Абсолютный путь
2018-03-12 23:35:55 +03:00
$item = str_replace ( '[tag:path]' , ABS_PATH , $item );
2018-03-26 10:33:20 +03:00
// Путь к папке шаблона
2018-03-12 23:35:55 +03:00
$item = str_replace ( '[tag:mediapath]' , ABS_PATH . 'templates/' . (( defined ( 'THEME_FOLDER' ) === false )
? DEFAULT_THEME_FOLDER
: THEME_FOLDER )
. '/' , $item );
// Watermarks
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/' ,
function ( $m )
{
watermarks ( $m [ 1 ], $m [ 2 ], $m [ 3 ]);
},
$item );
2018-03-12 23:35:55 +03:00
2018-03-26 10:33:20 +03:00
// Удаляем ошибочные теги полей документа и языковые, в шаблоне рубрики
2018-03-12 23:35:55 +03:00
$item = preg_replace ( '/\[tag:doc:\d*\]/' , '' , $item );
$item = preg_replace ( '/\[tag:langfile:\d*\]/' , '' , $item );
2018-03-26 10:33:20 +03:00
// Делаем линки на миниатюры
2018-03-12 23:35:55 +03:00
$item = preg_replace_callback ( '/\[tag:([r|c|f|t|s]\d+x\d+r*):(.+?)]/' , 'callback_make_thumbnail' , $item );
2018-03-26 10:33:20 +03:00
// Если был вызов тизера, ищем параметры
2018-03-12 23:35:55 +03:00
if ( $tparams != '' )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
// Заменяем tparam в тизере
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tparam:([0-9]+)\]/' ,
function ( $m ) use ( $tparams_id )
{
return f_params_of_teaser ( $tparams_id , $m [ 1 ]);
},
$item );
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
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 );
}
*/
$item = str_replace ( '[tag:domain]' , getSiteUrl (), $item );
$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 );
2019-08-19 09:34:29 +03:00
$item = str_replace ( '[tag:itemid]' , $row -> Id , $item );
2018-03-12 23:35:55 +03:00
$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 );
2019-10-02 12:38:11 +03:00
$item = str_replace ( '[tag:docdate]' , translate_date ( strftime ( DATE_FORMAT , $row -> document_published )), $item );
$item = str_replace ( '[tag:doctime]' , translate_date ( strftime ( TIME_FORMAT , $row -> document_published )), $item );
2018-03-12 23:35:55 +03:00
$item = str_replace ( '[tag:humandate]' , human_date ( $row -> document_published ), $item );
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tag:date:([a-zA-Z0-9-. \/]+)\]/' ,
function ( $m ) use ( $row )
{
return translate_date ( date ( $m [ 1 ], $row -> document_published ));
},
$item );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( preg_match ( '/\[tag:docauthor]/u' , $item ))
$item = str_replace ( '[tag:docauthor]' , get_username_by_id ( $row -> document_author_id ), $item );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$item = str_replace ( '[tag:docauthorid]' , $row -> document_author_id , $item );
2017-06-24 00:58:56 +03:00
2018-09-20 11:04:28 +03:00
$item = preg_replace_callback ( '/\[tag:docauthoravatar:(\d+)\]/' ,
function ( $m ) use ( $row )
{
return getAvatar ( intval ( $row -> document_author_id ), $m [ 1 ]);
},
$item );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( isset ( $use_cache ) && $use_cache == 1 )
{
// Кеширование элементов запроса
2018-03-26 10:33:20 +03:00
if ( ! file_exists ( dirname ( $cachefile_docid )))
2018-03-12 23:35:55 +03:00
@ mkdir ( dirname ( $cachefile_docid ), 0777 , true );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
file_put_contents ( $cachefile_docid , $item );
}
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
else
{
$item = file_get_contents ( $cachefile_docid );
}
2017-06-24 00:58:56 +03:00
2018-03-26 10:33:20 +03:00
// Кол-во просмотров
2018-03-12 23:35:55 +03:00
$item = str_replace ( '[tag:docviews]' , $row -> document_count_view , $item );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
unset ( $row );
return $item ;
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
/**
* Обработка тега запроса .
* Возвращает список документов удовлетворяющих параметрам запроса
* оформленный с использованием шаблона
*
2018-09-20 11:04:28 +03:00
* @ param int $id идентификатор запроса
* @ param array $params
*
2018-03-12 23:35:55 +03:00
* @ return string
*/
2020-01-20 13:09:57 +03:00
function request_parse ( $id , $params = [])
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
global $AVE_Core , $AVE_DB , $request_documents ;
// Если id пришёл из тега, берём нужную часть массива
if ( is_array ( $id ))
$id = $id [ 1 ];
2020-01-20 13:09:57 +03:00
$t = [];
$a = [];
$v = [];
2018-03-12 23:35:55 +03:00
// Получаем информацию о запросе
$request = request_get_settings ( $id );
// Фиксируем время начала генерации запроса
Debug :: startTime ( 'request_' . $id );
// Массив для полей SELECT
2020-01-20 13:09:57 +03:00
$request_select = [];
2018-03-12 23:35:55 +03:00
// Массив для присоединения таблиц JOIN
2020-01-20 13:09:57 +03:00
$request_join = [];
2018-03-12 23:35:55 +03:00
// Массив для добавления условий WHERE
2020-01-20 13:09:57 +03:00
$request_where = [];
2018-03-12 23:35:55 +03:00
// Массив для сортировки результатов ORDER BY
2020-01-20 13:09:57 +03:00
$request_order = [];
2018-03-12 23:35:55 +03:00
// Массив для сортировки результатов ORDER BY
2020-01-20 13:09:57 +03:00
$request_order_fields = [];
2018-03-12 23:35:55 +03:00
$request_order_str = '' ;
$request_select_str = '' ;
// Сортировка по полям из переданных параметров
if ( empty ( $params [ 'SORT' ]) && ! empty ( $_REQUEST [ 'requestsort_' . $id ]) && ! is_array ( $_REQUEST [ 'requestsort_' . $id ]))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
// Разрешаем перебор полей для сортировки через ";"
$sort = explode ( ';' , $_REQUEST [ 'requestsort_' . $id ]);
2017-06-24 00:58:56 +03:00
2020-01-20 13:09:57 +03:00
foreach ( $sort AS $v )
2017-10-02 11:50:22 +03:00
{
2018-03-12 23:35:55 +03:00
$v1 = explode ( '=' , $v );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Если хотим сортировку DESC то пишем alias = 0
$params [ 'SORT' ][ $v1 [ 0 ]] = ( isset ( $v1 [ 1 ]) && $v1 [ 1 ] == 0
? 'DESC'
: 'ASC' );
}
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Сортировка по полям
// Если пришел параметр SORT
if ( ! empty ( $params [ 'SORT' ]) && is_array ( $params [ 'SORT' ]))
{
foreach ( $params [ 'SORT' ] as $fid => $sort )
{
if ( is_numeric ( $fid ))
$fid = ( int ) get_field_num ( $request -> rubric_id , $fid );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Если значение больше 0
if (( int ) $fid > 0 )
2017-10-02 11:50:22 +03:00
{
2018-03-12 23:35:55 +03:00
$sort = strtolower ( $sort );
// Добавляем условие в SQL
2018-09-20 11:04:28 +03:00
$request_join [ $fid ] = " <?php 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 ') \" : ''?> " ;
2018-03-12 23:35:55 +03:00
// Если в сортировке указано ASC иначе DESC
$asc_desc = strpos ( strtolower ( $sort ), 'asc' ) !== false
? 'ASC'
: 'DESC' ;
$request_order [ 'field-' . $fid ] = " t $fid .field_value " . $asc_desc ;
$request_order_fields [] = $fid ;
2017-10-02 11:50:22 +03:00
}
2018-03-12 23:35:55 +03:00
else
{
// Если в сортировке указано ASC иначе DESC
$asc_desc = strpos ( strtolower ( $sort ), 'asc' ) !== false
? 'ASC'
: 'DESC' ;
2018-09-20 11:04:28 +03:00
// ToDo - Х З что это
2019-08-25 22:54:48 +03:00
$request_order [ $sort ] = " $fid " . $asc_desc ;
2018-03-12 23:35:55 +03:00
}
}
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
// Сортировка по полю из настроек (только если не передана другая в параметрах)
elseif ( $request -> request_order_by_nat )
{
$fid = ( int ) $request -> request_order_by_nat ;
// Добавляем с учётом переменной $t из условий, чтобы не выбирать те же таблиы заново - это оптимизирует время
2018-09-20 11:04:28 +03:00
$request_join [ $fid ] = " <?php echo (! 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 ') \" : ''?> " ;
2018-03-12 23:35:55 +03:00
$request_order [ 'field-' . $fid ] = " t $fid .field_value " . $request -> request_asc_desc ;
$request_order_fields [] = $fid ;
}
// Вторичная сортировка по параметру документа - добавляем в конец сортировок
if ( ! empty ( $params [ 'RANDOM' ]))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$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 ;
}
2017-10-02 11:50:22 +03:00
2018-03-12 23:35:55 +03:00
// Заменяем 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'
" );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
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 ]);
}
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
// Статус: если в параметрах, то е г о ставим. Иначе выводим только активные доки
$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()) " ;
// Условия запроса
// если условия пустые, получаем строку с сохранением её в бд
2018-05-16 23:14:07 +03:00
if ( ! $request -> request_where_cond )
$where_cond = request_get_condition_sql_string ( $request -> Id , false );
2018-03-12 23:35:55 +03:00
// иначе, берём из запроса
else
$where_cond = unserialize ( $request -> request_where_cond );
$where_cond [ 'from' ] = ( isset ( $where_cond [ 'from' ]))
? str_replace ( '%%PREFIX%%' , PREFIX , $where_cond [ 'from' ])
2017-06-24 00:58:56 +03:00
: '' ;
2018-03-12 23:35:55 +03:00
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' ] > '' )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
if ( is_array ( $params [ 'USER_WHERE' ]))
$request_where = array_merge ( $request_where , $params [ 'USER_WHERE' ]);
else
$request_where [] = $params [ 'USER_WHERE' ];
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
// Готовим строку с условиями
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 )
2019-08-22 13:00:37 +03:00
? get_current_page ( 'page' ) * $limit - $limit
2018-03-12 23:35:55 +03:00
: 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 );
2018-05-16 23:14:07 +03:00
unset ( $a , $t , $v );
2018-03-12 23:35:55 +03:00
2018-05-16 23:14:07 +03:00
if ( ! isset ( $params [ 'SQL_QUERY' ]))
{
// Составляем запрос к БД
$sql = " ?>
SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS
#REQUEST = $request->Id
a .*
" . $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 . "
< ? " . " php " ;
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
$sql_request = eval2var ( $sql );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
unset ( $sql );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
// Убираем дубли в выборе полей
foreach ( array_keys ( $request_join ) AS $key )
2018-03-12 23:35:55 +03:00
{
2018-05-16 23:14:07 +03:00
$search = PREFIX . '_document_fields AS t' . $key . ',' ;
if ( preg_match ( '/' . $search . '/' , $sql_request ) > 0 )
{
$sql_request = str_replace ( $search , '' , $sql_request );
}
2018-03-12 23:35:55 +03:00
}
2017-06-24 00:58:56 +03:00
}
2018-05-16 23:14:07 +03:00
else
{
$sql_request = $params [ 'SQL_QUERY' ];
}
2017-06-24 00:58:56 +03:00
2018-05-19 09:15:15 +03:00
// Если просили просто показать сформированный запрос
if (( isset ( $params [ 'DEBUG' ]) && $params [ 'DEBUG' ] == 1 ) || $request -> request_show_sql == 1 )
{
$return = Debug :: _print ( $sql_request );
return $return ;
}
2018-03-12 23:35:55 +03:00
// Выполняем запрос к бд
2018-05-16 23:14:07 +03:00
$sql = $AVE_DB -> Query ( $sql_request , ( int ) $request -> request_cache_lifetime , 'rqs_' . $id , true , '.request' );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
// Если просили просто вернуть резльтат запроса, возвращаем результат
2018-03-12 23:35:55 +03:00
if ( isset ( $params [ 'RETURN_SQL' ]) && $params [ 'RETURN_SQL' ] == 1 )
return $AVE_DB -> GetFoundRows ();
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Если есть вывод пагинации, то выполняем запрос на получение кол-ва элементов
if ( $request -> request_show_pagination == 1 || ( isset ( $params [ 'SHOW' ]) && $params [ 'SHOW' ] == 1 ))
2018-05-16 23:14:07 +03:00
$num_items = $AVE_DB -> NumAllRows ( $sql_request , ( int ) $request -> request_cache_lifetime , 'rqs_' . $id );
2018-03-12 23:35:55 +03:00
else
2018-05-16 23:14:07 +03:00
$num_items = (( isset ( $params [ 'NO_FOUND_ROWS' ]) && $params [ 'NO_FOUND_ROWS' ] == 1 ) || ! $request -> request_count_items
? 0
: $AVE_DB -> GetFoundRows ());
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Если просили просто вернуть кол-во, возвращаем результат
if ( isset ( $params [ 'RETURN_COUNT' ]) && $params [ 'RETURN_COUNT' ] == 1 )
return $num_items ;
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
unset ( $sql_request );
2018-03-12 23:35:55 +03:00
// Приступаем к обработке шаблона
$main_template = $request -> request_template_main ;
2018-05-16 23:14:07 +03:00
//-- Если кол-во элементов больше 0, удалаяем лишнее
2018-03-12 23:35:55 +03:00
if ( $num_items > 0 )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$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 );
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
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 );
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$pagination = '' ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Кол-во страниц
$num_pages = ( $limit > 0 )
? ceil ( $num_items / $limit )
: 0 ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// Собираем пагинацию, еслиесть указание е е выводить
if ( $request -> request_show_pagination == 1 || ( isset ( $params [ 'SHOW' ]) && $params [ 'SHOW' ] == 1 ))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
// Если в запросе пришел номер страницы и он больше, чем кол-во страниц
// Делаем перенаправление
2019-08-22 13:00:37 +03:00
if ( isset ( $_REQUEST [ 'page' ]) && is_numeric ( $_REQUEST [ 'page' ]) && $_REQUEST [ 'page' ] > $num_pages )
2018-03-12 23:35:55 +03:00
{
$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' ]
: '' )
2019-08-22 13:00:37 +03:00
. (( isset ( $_REQUEST [ 'apage' ]) && is_numeric ( $_REQUEST [ 'apage' ]))
? '&apage=' . $_REQUEST [ 'apage' ]
2018-03-12 23:35:55 +03:00
: '' ));
header ( 'Location:' . $redirect_link );
exit ;
}
// Запоминаем глобально
2019-08-22 13:00:37 +03:00
@ $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'page' ] = ( isset ( $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'page' ]) && $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'page' ] > $num_pages
? @ $GLOBALS [ 'page_id' ][ $_REQUEST [ 'id' ]][ 'page' ]
2018-03-12 23:35:55 +03:00
: $num_pages );
$pagination = '' ;
2018-05-16 23:14:07 +03:00
// Если кол-во страниц больше 1й
2018-03-12 23:35:55 +03:00
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 )
2019-08-22 13:00:37 +03:00
. '&page={s}'
2018-03-12 23:35:55 +03:00
. (( isset ( $_REQUEST [ 'artpage' ]) && is_numeric ( $_REQUEST [ 'artpage' ]))
? '&artpage=' . $_REQUEST [ 'artpage' ]
: '' )
2019-08-22 13:00:37 +03:00
. (( isset ( $_REQUEST [ 'apage' ]) && is_numeric ( $_REQUEST [ 'apage' ]))
? '&apage=' . $_REQUEST [ 'apage' ]
2018-03-12 23:35:55 +03:00
: '' )
// Добавляем GET-запрос в пагинацию
. clean_php ( $queries )
;
// ID пагинации
$pagination_id = ( isset ( $params [ 'PAGINATION' ]) && $params [ 'PAGINATION' ] > 0 )
? $params [ 'PAGINATION' ]
: $request -> request_pagination ;
// Собираем пагинацию
2019-08-22 13:00:37 +03:00
$pagination = AVE_Paginations :: getPagination ( $num_pages , 'page' , $pagination , $pagination_id );
2018-03-12 23:35:55 +03:00
// Костыли для Главной страницы
$pagination = str_ireplace ( '"//"' , '"/"' , str_ireplace ( '///' , '/' , rewrite_link ( $pagination )));
$pagination = str_ireplace ( '"//' . URL_SUFF . '"' , '"/"' , $pagination );
}
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
// Элементы запроса
2020-01-20 13:09:57 +03:00
$rows = [];
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
// id найденных документов
2020-01-20 13:09:57 +03:00
$request_documents = [];
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
while ( $row = $sql -> FetchRow ())
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
// Собираем Id документов
array_push ( $request_documents , $row -> Id );
// Собираем оставшуюся информацию
array_push ( $rows , $row );
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
//-- Обрабатываем шаблоны элементов
$items = '' ;
//-- Счетчик
$x = 0 ;
//-- Общее число элементов
$items_count = count ( $rows );
2017-06-24 00:58:56 +03:00
2018-05-16 23:14:07 +03:00
global $req_item_num , $use_cache , $request_id , $request_changed , $request_changed_elements ;
2018-03-12 23:35:55 +03:00
$use_cache = $request -> request_cache_elements ;
2018-05-16 23:14:07 +03:00
$request_id = $request -> Id ;
$request_changed = $request -> request_changed ;
$request_changed_elements = $request -> request_changed_elements ;
2018-03-12 23:35:55 +03:00
foreach ( $rows as $row )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$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 ;
2018-09-20 11:04:28 +03:00
$item = '<' . '?php $req_item_id = ' . $row -> Id . '; ?>' . $item ;
2018-03-12 23:35:55 +03:00
$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 ;
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//== Обрабатываем теги запроса
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Парсим теги визуальных блоков
$main_template = preg_replace_callback ( '/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/' , 'parse_block' , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Парсим теги системных блоков
$main_template = preg_replace_callback ( '/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/' , 'parse_sysblock' , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Заменяем тег пагинации на пагинацию
$main_template = str_replace ( '[tag:pages]' , $pagination , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Дата
$main_template = preg_replace_callback (
'/\[tag:date:([a-zA-Z0-9-. \/]+)\]/' ,
2019-08-22 13:01:37 +03:00
function ( $match ) use ( $AVE_Core )
{
return translate_date ( date ( $match [ 1 ], $AVE_Core -> curentdoc -> document_published ));
},
2018-03-12 23:35:55 +03:00
$main_template
);
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- ID Документа
$main_template = str_replace ( '[tag:docid]' , $AVE_Core -> curentdoc -> Id , $main_template );
//-- ID Автора
$main_template = str_replace ( '[tag:docauthorid]' , $AVE_Core -> curentdoc -> document_author_id , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Имя автора
2018-04-19 19:11:58 +03:00
if ( preg_match ( '[tag:docauthor]' , $main_template ))
$main_template = str_replace ( '[tag:docauthor]' , get_username_by_id ( $AVE_Core -> curentdoc -> document_author_id ), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Время - 1 день назад
$main_template = str_replace ( '[tag:humandate]' , human_date ( $AVE_Core -> curentdoc -> document_published ), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Дата создания
$main_template = str_replace ( '[tag:docdate]' , pretty_date ( strftime ( DATE_FORMAT , $AVE_Core -> curentdoc -> document_published )), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Время создания
$main_template = str_replace ( '[tag:doctime]' , pretty_date ( strftime ( TIME_FORMAT , $AVE_Core -> curentdoc -> document_published )), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Домен
$main_template = str_replace ( '[tag:domain]' , getSiteUrl (), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Общее число элементов запроса
$main_template = str_replace ( '[tag:doctotal]' , $num_items , $main_template );
//-- Показано элементов запроса на странице
$main_template = str_replace ( '[tag:doconpage]' , $x , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Номер страницы пагинации
2019-08-22 13:00:37 +03:00
$main_template = str_replace ( '[tag:pages:curent]' , get_current_page ( 'page' ), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Общее кол-во страниц пагинации
$main_template = str_replace ( '[tag:pages:total]' , $num_pages , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Title
$main_template = str_replace ( '[tag:pagetitle]' , stripslashes ( htmlspecialchars_decode ( $AVE_Core -> curentdoc -> document_title )), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Alias
$main_template = str_replace ( '[tag:alias]' , ( isset ( $AVE_Core -> curentdoc -> document_alias ) ? $AVE_Core -> curentdoc -> document_alias : '' ), $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Возвращаем параметр документа из БД
$main_template = preg_replace_callback ( '/\[tag:doc:([a-zA-Z0-9-_]+)\]/u' ,
2018-09-20 11:04:28 +03:00
function ( $match ) use ( $row )
2018-03-12 23:35:55 +03:00
{
return isset ( $row -> { $match [ 1 ]})
? $row -> { $match [ 1 ]}
: null ;
},
$main_template
);
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Если пришел вызов на активацию языковых файлов
$main_template = preg_replace_callback (
'/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u' ,
function ( $match )
{
global $AVE_Template ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
return $AVE_Template -> get_config_vars ( $match [ 1 ]);
},
$main_template
);
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Вставляем элементы запроса
$return = str_replace ( '[tag:content]' , $items , $main_template );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Парсим тег [hide]
$return = parse_hide ( $return );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Абсолютный путь
$return = str_replace ( '[tag:path]' , ABS_PATH , $return );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Путь до папки шаблона
$return = str_replace ( '[tag:mediapath]' , ABS_PATH . 'templates/' . (( defined ( 'THEME_FOLDER' ) === false ) ? DEFAULT_THEME_FOLDER : THEME_FOLDER ) . '/' , $return );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Парсим модули
$return = $AVE_Core -> coreModuleTagParse ( $return );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
//-- Фиксируем время генерации запроса
$GLOBALS [ 'block_generate' ][ 'REQUESTS' ][ $id ][] = Debug :: endTime ( 'request_' . $id );
2017-11-17 12:02:05 +03:00
2018-03-12 23:35:55 +03:00
// Статистика
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 ;
2017-06-24 00:58:56 +03:00
}
2018-03-26 10:33:20 +03:00
2018-03-12 23:35:55 +03:00
/**
* Функция получения содержимого поля для обработки в шаблоне запроса
* < 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 )
{
2018-04-19 19:11:58 +03:00
if ( ! is_numeric ( $rubric_id ) || $rubric_id < 1 || ! is_numeric ( $document_id ) || $document_id < 1 )
return '' ;
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$document_fields = get_document_fields ( $document_id );
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
$field_value = isset ( $document_fields [ $rubric_id ])
? $document_fields [ $rubric_id ][ 'field_value' ]
: '' ;
if ( ! empty ( $field_value ))
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
$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 );
}
2017-06-24 00:58:56 +03:00
2018-03-12 23:35:55 +03:00
if ( is_numeric ( $maxlength ) && $maxlength != 0 )
2017-06-24 00:58:56 +03:00
{
2018-03-12 23:35:55 +03:00
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 );
}
2018-04-19 19:11:58 +03:00
$field_value = mb_substr ( $field_value , 0 , $maxlength ) . ( strlen ( $field_value ) > $maxlength
? '... '
: '' );
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
return $field_value ;
2017-06-24 00:58:56 +03:00
}
2018-03-12 23:35:55 +03:00
?>