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[] = "$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 = 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) . " "; $retval = array('from'=>$from,'where'=> $where.$where_dd); } else { $from = implode(' ', $from); $where = implode(' ', $where) . " "; $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("/()/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('', $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, ""); $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]', '', $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}+)\]/', '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] = ""; $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] = ""; $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 . " 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 = '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 .= "

Найдено: $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; } ?>