Query($sql, -1, 'rqs_' . $id, true, '.settings')->FetchRow(); // Выходим, если нет запроса if (! is_object($reqest_settings)) return ''; else return $reqest_settings; } /** * Обработка условий запроса. * Возвращает строку условий в SQL-формате * * @param int $id идентификатор запроса * @param bool $update_db * * @return array */ function request_get_condition_sql_string ($id, $update_db = false) { global $AVE_DB, $AVE_Core; $id = (int)$id; $from = []; $where = []; $sql = " SELECT * FROM " . PREFIX . "_request_conditions WHERE request_id = '" . $id . "' AND condition_status = '1' ORDER BY condition_position ASC; "; $request_settings = request_get_settings($id); $sql_ak = $AVE_DB->Query($sql, -1, 'rqc_' . $id, true, '.conditions'); // Обрабатываем выпадающие списки 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; $numeric = []; if (! defined('ACP')) { $query = " SELECT Id, rubric_field_numeric FROM " . PREFIX . "_rubric_fields WHERE rubric_id = '". $request_settings->rubric_id."' "; $sql = $AVE_DB->Query($query); while ($row = $sql->FetchAssocArray()) $numeric[$row['Id']] = $row['rubric_field_numeric']; } 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[] = "$val'' && !isset(\$t[$fid])) {echo \"%%PREFIX%%_document_fields AS t$fid,\"; \$t[$fid]=1;} ?>"; // обрабатываем условия switch ($type) { case 'N<':case '<': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv < UPPER('\$v[$i]'))) $join\" : '' ?>"; break; case 'N>':case '>': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv > UPPER('\$v[$i]'))) $join\" : '' ?>"; break; case 'N<=':case '<=': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv <= UPPER('\$v[$i]'))) $join\" : '' ?>"; break; case 'N>=':case '>=': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv >= UPPER('\$v[$i]'))) $join\" : '' ?>"; break; case '==': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv = UPPER('\$v[$i]'))) $join\" : '' ?>"; break; case '!=': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv != UPPER('\$v[$i]'))) $join\" : '' ?>"; break; case '%%': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv LIKE UPPER('%\$v[$i]%'))) $join\" : '' ?>"; break; case '%': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv LIKE UPPER('\$v[$i]%'))) $join\" : '' ?>"; break; case '--': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv NOT LIKE UPPER('%\$v[$i]%'))) $join\" : '' ?>"; break; case '!-': $where[] = "'' ? \"(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]{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]{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]{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]{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[] = " '' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv=ANY(\$v[$i]))) $join\" : ''; ?>"; break; case 'FRE': $where[] = " '' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND (\$v[$i]))) $join\" : ''; ?>"; break; } $i++; } $retval = []; 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) . " "; $retval = ['from' => $from, 'where' => $where . $where_dd]; } else { $from = implode(' ', $from); $where = implode(' ', $where) . " "; $retval = ['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 . "' "); $AVE_DB->clearRequest($id); } return @$retval; } /** * Функция обработки тэгов полей с использованием шаблонов * в соответствии с типом поля * * @param $field_id * @param int $document_id идентификатор документа * @param string $maxlength максимальное количество символов обрабатываемого поля * @param int $rubric_id идентификатор рубрики * * @return string */ function request_get_document_field ($field_id, $document_id, $maxlength = null, $rubric_id = 0) { if (! is_numeric($document_id) || $document_id < 1) return ''; $_maxlength = $maxlength; $document_fields = get_document_fields($document_id); // ToDo 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' || $maxlength == 'strip') { if ($maxlength == 'more') { // ToDo - Вывести в настройки или в настройки самого запроса $teaser = explode('', $field_value); $field_value = $teaser[0]; } elseif ($maxlength == 'esc') { $field_value = addslashes($field_value); } elseif ($maxlength == 'img') { $field_value = getImgSrc($field_value); } 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); } } elseif (is_numeric($maxlength)) { 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); } } 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, $request_id, $request_changed, $request_changed_elements; if (is_array($mixed)) $row = intval($mixed[1]); else if (is_numeric($mixed)) $row = intval($mixed); $row = (is_object($mixed) ? $mixed : getDocument($row)); unset ($mixed); if (! $row) return ''; $tparams_id = ''; if ($tparams != '') { $tparams_id = $row->Id . md5($tparams); // Создаем уникальный id для каждого набора параметров $params_of_teaser[$tparams_id] = []; // Для отмены лишних ворнингов $tparams = trim($tparams,'[]:'); // Удаляем: слева ':[', справа ']' $params_of_teaser[$tparams_id] = explode('|',$tparams); // Заносим параметры в массив уникального id } $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); $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); } // Если включен DEV MODE, то отключаем кеширование запросов if (defined('DEV_MODE') AND DEV_MODE) $cachefile_docid = null; if (! file_exists($cachefile_docid)) { // Если включено в настройках, проверять поле по содержимому 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); } $template = str_replace('[tag:if:else]', '', $template); $template = str_replace('[tag:/if]', '', $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}+)(|:\{(.*?)\})\]/', function ($m) { return parse_sysblock($m[1], $m[2]); }, $item); // Парсим элементы полей $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); // Парсим теги полей $item = preg_replace_callback('/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|strip|[0-9-]+)]/', function ($match) use ($row) { return request_get_document_field($match[1], (int)$row->Id, $match[2], (int)$row->rubric_id); }, $item); // Повторно парсим теги полей $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); // Возвращаем поле документа из БД (document_***) $item = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', function ($m) use ($row) { return isset($row->{$m[1]}) ? $row->{$m[1]} : null; }, $item ); // Если пришел вызов на активацию языковых файлов $item = preg_replace_callback( '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', function ($m) { global $AVE_Template; return $AVE_Template->get_config_vars($m[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]+)\]/', 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_callback('/\[tparam:([0-9]+)\]/', function ($m) use ($tparams_id) { 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:itemid]', $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]', translate_date(strftime(DATE_FORMAT, $row->document_published)), $item); $item = str_replace('[tag:doctime]', translate_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-. \/]+)\]/', function ($m) use ($row) { 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+)\]/', function ($m) use ($row) { 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); Registry::remove('documents', $row->Id); Registry::remove('fields', $row->Id); Registry::remove('fields_param', $row->Id); unset($row, $template); return $item; } /** * Обработка тега запроса. * Возвращает список документов удовлетворяющих параметрам запроса * оформленный с использованием шаблона * * @param int $id идентификатор запроса * @param array $params * * @return string */ function request_parse ($id, $params = []) { global $AVE_Core, $AVE_DB, $request_documents; // Если id пришёл из тега, берём нужную часть массива if (is_array($id)) $id = $id[1]; $t = []; $a = []; $v = []; // Получаем информацию о запросе $request = request_get_settings($id); // Фиксируем время начала генерации запроса Debug::startTime('request_' . $id); // Массив для полей SELECT $request_select = []; // Массив для присоединения таблиц JOIN $request_join = []; // Массив для добавления условий WHERE $request_where = []; // Массив для сортировки результатов ORDER BY $request_order = []; // Массив для сортировки результатов ORDER BY $request_order_fields = []; $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'); } } // Сортировка по полям // Если пришел параметр 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); // Если значение больше 0 if ((int)$fid > 0) { $sort = strtolower($sort); // Добавляем условие в SQL $request_join[$fid] = ""; // Если в сортировке указано 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; } else { // Если в сортировке указано ASC иначе DESC $asc_desc = strpos(strtolower($sort),'asc') !== false ? 'ASC' : 'DESC'; // ToDo - ХЗ что это $request_order[$sort] = "$fid " . $asc_desc; } } } // Сортировка по полю из настроек (только если не передана другая в параметрах) elseif ($request->request_order_by_nat) { $fid = (int)$request->request_order_by_nat; // Добавляем с учётом переменной $t из условий, чтобы не выбирать те же таблиы заново - это оптимизирует время $request_join[$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 (! $request->request_where_cond) $where_cond = request_get_condition_sql_string($request->Id, false); // иначе, берём из запроса 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('page') * $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); if (! isset($params['SQL_QUERY'])) { // Составляем запрос к БД $sql = " ?> SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS #REQUEST = $request->Id a.Id " . $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 . " 0) { $sql_request = str_replace($search, '', $sql_request); } } } else { $sql_request = $params['SQL_QUERY']; } // Если просили просто показать сформированный запрос if ((isset($params['DEBUG']) && $params['DEBUG'] == 1) || $request->request_show_sql == 1) { $return = Debug::_print($sql_request); return $return; } Debug::startTime('SQL'); // Выполняем запрос к бд $sql = $AVE_DB->Query($sql_request, (int)$request->request_cache_lifetime, 'rqs_' . $id, true, '.request'); $GLOBALS['block_generate']['REQUESTS'][$id]['SQL'] = Debug::endTime('SQL'); // Если просили просто вернуть резльтат запроса, возвращаем результат if (isset($params['RETURN_SQL']) && $params['RETURN_SQL'] == 1) return $AVE_DB->GetFoundRows(); // Если есть вывод пагинации, то выполняем запрос на получение кол-ва элементов if ($request->request_show_pagination == 1 || (isset($params['SHOW']) && $params['SHOW'] == 1)) $num_items = $AVE_DB->NumAllRows($sql_request, (int)$request->request_cache_lifetime, 'rqs_' . $id); else $num_items = ((isset($params['NO_FOUND_ROWS']) && $params['NO_FOUND_ROWS'] == 1) || ! $request->request_count_items ? 0 : $AVE_DB->GetFoundRows()); // Если просили просто вернуть кол-во, возвращаем результат if (isset($params['RETURN_COUNT']) && $params['RETURN_COUNT'] == 1) return $num_items; 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['page']) && is_numeric($_REQUEST['page']) && $_REQUEST['page'] > $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['apage']) && is_numeric($_REQUEST['apage'])) ? '&apage=' . $_REQUEST['apage'] : '')); header('Location:' . $redirect_link); exit; } // Запоминаем глобально @$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'] : $num_pages); $pagination = ''; // Если кол-во страниц больше 1й 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) . '&page={s}' . ((isset($_REQUEST['artpage']) && is_numeric($_REQUEST['artpage'])) ? '&artpage=' . $_REQUEST['artpage'] : '') . ((isset($_REQUEST['apage']) && is_numeric($_REQUEST['apage'])) ? '&apage=' . $_REQUEST['apage'] : '') // Добавляем GET-запрос в пагинацию . clean_php($queries) ; // ID пагинации $pagination_id = (isset($params['PAGINATION']) && $params['PAGINATION'] > 0) ? $params['PAGINATION'] : $request->request_pagination; // Собираем пагинацию $pagination = AVE_Paginations::getPagination($num_pages, 'page', $pagination, $pagination_id); // Костыли для Главной страницы $pagination = str_ireplace('"//"', '"/"', str_ireplace('///', '/', rewrite_link($pagination))); $pagination = str_ireplace('"//' . URL_SUFF . '"', '"/"', $pagination); } } // Элементы запроса $rows = []; // id найденных документов $request_documents = []; 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, $request_id, $request_changed, $request_changed_elements; $use_cache = $request->request_cache_elements; $request_id = $request->Id; $request_changed = $request->request_changed; $request_changed_elements = $request->request_changed_elements; Debug::startTime('ELEMENTS_ALL'); foreach ($rows AS $row) { $x++; $last_item = ($x == $items_count ? true : false); $item_num = $x; $req_item_num = $item_num; Debug::startTime('ELEMENT_' . $item_num); $item = showrequestelement($row->Id, $request->request_template_item); $GLOBALS['block_generate']['REQUESTS'][$id]['ELEMENTS'][$item_num] = Debug::endTime('ELEMENT_' . $item_num); $item = str_replace('[tag:item_num]', $item_num, $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; Registry::remove('documents', $row->Id); Registry::remove('fields', $row->Id); Registry::remove('fields_param', $row->Id); } $GLOBALS['block_generate']['REQUESTS'][$id]['ELEMENTS']['ALL'] = Debug::endTime('ELEMENTS_ALL'); // ============ Обрабатываем теги запроса ============ // //-- Парсим теги визуальных блоков $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 = preg_replace_callback('/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', function ($match) use ($AVE_Core) { return translate_date(date($match[1], $AVE_Core->curentdoc->document_published)); }, $main_template ); $str_replace = [ //-- ID Документа '[tag:docid]' => $AVE_Core->curentdoc->Id, //-- ID Автора '[tag:docauthorid]' => $AVE_Core->curentdoc->document_author_id, //-- Имя автора '[tag:docauthor]' => get_username_by_id($AVE_Core->curentdoc->document_author_id), //-- Время - 1 день назад '[tag:humandate]' => human_date($AVE_Core->curentdoc->document_published), //-- Дата создания '[tag:docdate]' => pretty_date(strftime(DATE_FORMAT, $AVE_Core->curentdoc->document_published)), //-- Время создания '[tag:doctime]' => pretty_date(strftime(TIME_FORMAT, $AVE_Core->curentdoc->document_published)), //-- Домен '[tag:domain]' => getSiteUrl(), //-- Заменяем тег пагинации на пагинацию '[tag:pages]' => $pagination, //-- Общее число элементов запроса '[tag:doctotal]' => $num_items, //-- Показано элементов запроса на странице '[tag:doconpage]' => $x, //-- Номер страницы пагинации '[tag:pages:curent]' => get_current_page('page'), //-- Общее кол-во страниц пагинации '[tag:pages:total]' => $num_pages, //-- Title '[tag:pagetitle]' => stripslashes(htmlspecialchars_decode($AVE_Core->curentdoc->document_title)), //-- Alias '[tag:alias]' => (isset($AVE_Core->curentdoc->document_alias) ? $AVE_Core->curentdoc->document_alias : '') ]; $main_template = str_replace(array_keys($str_replace), array_values($str_replace), $main_template); //-- Возвращаем параметр документа из БД $main_template = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', function ($match) use ($row) { 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); unset ($items, $main_template, $str_replace, $pagination); //-- Парсим тег [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']['REQUESTS'][$id]['TIME'] = Debug::endTime('request_' . $id); // Статистика if ($request->request_show_statistic) $return .= "

Найдено: $num_items
Показано: $items_count
Время генерации: " . Debug::endTime('request_' . $id) . " сек
Пиковое значение: ".number_format(memory_get_peak_usage()/1024, 0, ',', ' ') . ' Kb
'; return $return; } function parse_request ($id, $params = []) { global $AVE_Core; // Получаем информацию о запросе $request = request_get_settings($id); // Фиксируем время начала генерации запроса Debug::startTime('request_' . $id); // Элементы запроса $rows = $params['ROWS']; //-- Обрабатываем шаблоны элементов $items = ''; //-- Счетчик $x = 0; //-- Общее число элементов $items_count = $num_items= count($rows); global $req_item_num, $use_cache, $request_id, $request_changed, $request_changed_elements; $use_cache = $request->request_cache_elements; $request_id = $request->Id; $request_changed = $request->request_changed; $request_changed_elements = $request->request_changed_elements; $limit = (isset($params['LIMIT']) && is_numeric($params['LIMIT']) && $params['LIMIT'] > '') ? (int)$params['LIMIT'] : (int)$request->request_items_per_page; // Кол-во страниц $num_pages = ($limit > 0) ? ceil($num_items / $limit) : 0; Debug::startTime('ELEMENTS_ALL'); foreach ($rows AS $row) { $x++; $last_item = ($x == $items_count ? true : false); $item_num = $x; $req_item_num = $item_num; Debug::startTime('ELEMENT_' . $item_num); $item = showrequestelement($row, $request->request_template_item); $GLOBALS['block_generate']['REQUESTS'][$id]['ELEMENTS'][$item_num] = Debug::endTime('ELEMENT_' . $item_num); $item = str_replace('[tag:item_num]', $item_num, $item); $item = '<'.'?php $item_num='.var_export($item_num,1).'; $last_item='.var_export($last_item,1).'?'.'>'.$item; $item = '<'.'?php $req_item_id = ' . $row . '; ?>' . $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; Registry::remove('documents', $row); Registry::remove('fields', $row); Registry::remove('fields_param', $row); } $GLOBALS['block_generate']['REQUESTS'][$id]['ELEMENTS']['ALL'] = Debug::endTime('ELEMENTS_ALL'); // Приступаем к обработке шаблона $main_template = $request->request_template_main; // ============ Обрабатываем теги запроса ============ // //-- Парсим теги визуальных блоков $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 = preg_replace_callback('/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', function ($match) use ($AVE_Core) { return translate_date(date($match[1], $AVE_Core->curentdoc->document_published)); }, $main_template ); $str_replace = [ //-- ID Документа '[tag:docid]' => $AVE_Core->curentdoc->Id, //-- ID Автора '[tag:docauthorid]' => $AVE_Core->curentdoc->document_author_id, //-- Имя автора '[tag:docauthor]' => get_username_by_id($AVE_Core->curentdoc->document_author_id), //-- Время - 1 день назад '[tag:humandate]' => human_date($AVE_Core->curentdoc->document_published), //-- Дата создания '[tag:docdate]' => pretty_date(strftime(DATE_FORMAT, $AVE_Core->curentdoc->document_published)), //-- Время создания '[tag:doctime]' => pretty_date(strftime(TIME_FORMAT, $AVE_Core->curentdoc->document_published)), //-- Домен '[tag:domain]' => getSiteUrl(), //-- Заменяем тег пагинации на пагинацию '[tag:pages]' => $pagination, //-- Общее число элементов запроса '[tag:doctotal]' => $num_items, //-- Показано элементов запроса на странице '[tag:doconpage]' => $x, //-- Номер страницы пагинации '[tag:pages:curent]' => get_current_page('page'), //-- Общее кол-во страниц пагинации '[tag:pages:total]' => $num_pages, //-- Title '[tag:pagetitle]' => stripslashes(htmlspecialchars_decode($AVE_Core->curentdoc->document_title)), //-- Alias '[tag:alias]' => (isset($AVE_Core->curentdoc->document_alias) ? $AVE_Core->curentdoc->document_alias : '') ]; $main_template = str_replace(array_keys($str_replace), array_values($str_replace), $main_template); //-- Возвращаем параметр документа из БД $main_template = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', function ($match) use ($row) { 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); unset ($items, $main_template, $str_replace, $pagination); //-- Парсим тег [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']['REQUESTS'][$id]['TIME'] = Debug::endTime('request_' . $id); // Статистика if ($request->request_show_statistic) $return .= "

Найдено: $num_items
Показано: $items_count
Время генерации: " . Debug::endTime('request_' . $id) . " сек
Пиковое значение: ".number_format(memory_get_peak_usage()/1024, 0, ',', ' ') . ' Kb
'; return $return; } /** * Функция получения содержимого поля для обработки в шаблоне запроса *
	 * Пример использования в шаблоне:
	 *	
  • * *
  • *
    * * @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, '

    '); $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, ""); $field_value = preg_replace('/ +/', ' ', $field_value); $maxlength = abs($maxlength); } $field_value = mb_substr($field_value, 0, $maxlength) . (strlen($field_value) > $maxlength ? '... ' : ''); } return $field_value; } ?>