mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1094 lines
40 KiB
1094 lines
40 KiB
<?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) use ($row) |
|
{ |
|
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); |
|
|
|
$item = preg_replace_callback('/\[tag:([r|c|f|t|s]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $item); |
|
|
|
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); |
|
} |
|
*/ |
|
|
|
$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); |
|
$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) |
|
{ |
|
if (is_numeric($fid)) |
|
$fid = (int)get_field_num($request->rubric_id, $fid); |
|
|
|
if ((int)$fid > 0) |
|
{ |
|
$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; |
|
} |
|
else |
|
{ |
|
$asc_desc = strpos(strtolower($sort),'asc') !== false ? 'ASC' : 'DESC'; |
|
$request_order[$param] = "$fid " . $asc_desc; |
|
} |
|
} |
|
} |
|
// Сортировка по полю из настроек (только если не передана другая в параметрах) |
|
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); |
|
|
|
$main_template = str_replace('[tag:domain]', getSiteUrl(), $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; |
|
} |
|
?>
|
|
|