139 lines
5.7 KiB
PHP
139 lines
5.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* AVE.cms - Модуль Похожие документы
|
|
*
|
|
* @package AVE.cms
|
|
* @subpackage module_MoreDoc
|
|
* @filesource
|
|
*/
|
|
|
|
if(!defined('BASE_DIR')) exit;
|
|
|
|
/**
|
|
* Функция обработки тега модуля
|
|
*
|
|
*/
|
|
function mod_moredoc()
|
|
{
|
|
global $AVE_Core, $AVE_DB, $AVE_Template;
|
|
|
|
require_once(BASE_DIR . '/functions/func.modulglobals.php');
|
|
set_module_globals('moredoc');
|
|
|
|
$AVE_Template->caching = true; // Включаем кеширование
|
|
$AVE_Template->cache_lifetime = 60*60*24; // Время жизни кеша 1 день в секундах
|
|
|
|
$tpl_dir = BASE_DIR . '/modules/moredoc/templates/'; // Указываем путь к шаблону модуля
|
|
|
|
// Если нету в кеше, то начинаем обрабатывать
|
|
if (!$AVE_Template->is_cached($tpl_dir . 'moredoc.tpl', $AVE_Core->curentdoc->Id))
|
|
{
|
|
$limit = 5; // Количество связных документов
|
|
$flagrubric = 1; // Учитывать или нет рубрику документа (0 - нет, 1 - да)
|
|
|
|
$moredoc = array();
|
|
|
|
// Проверяем, есть ли папка для кеша, если нет (первый раз) — создаем
|
|
if (!is_dir($AVE_Template->getCacheDir()))
|
|
{
|
|
$oldumask = umask(0);
|
|
@mkdir($AVE_Template->getCacheDir(), 0777);
|
|
umask($oldumask);
|
|
}
|
|
|
|
// Получаем ключевые слова и ID рубрики текущего документа
|
|
$row = $AVE_DB->Query("
|
|
SELECT
|
|
rubric_id,
|
|
document_meta_keywords
|
|
FROM " . PREFIX . "_documents
|
|
WHERE Id = '" . (int)$AVE_Core->curentdoc->Id . "'
|
|
LIMIT 1
|
|
")->FetchRow();
|
|
|
|
$keywords = explode(',', $row->document_meta_keywords);
|
|
$keywords = trim($keywords[0]);
|
|
|
|
if ($keywords != '')
|
|
{
|
|
$inrubric = $flagrubric ? ("AND d.rubric_id = '" . (int)$row->rubric_id . "'") : '';
|
|
$doctime = get_settings('use_doctime')
|
|
? ("AND d.document_published <= " . time() . " AND (d.document_expire = 0 OR d.document_expire >= " . time() . ")") : '';
|
|
|
|
/**
|
|
* Используем подзапрос rf_first, чтобы найти минимальный ID поля image_single для каждой рубрики.
|
|
*/
|
|
$sql = $AVE_DB->Query("
|
|
SELECT
|
|
d.Id,
|
|
d.document_published,
|
|
d.document_count_view,
|
|
d.document_expire,
|
|
d.document_title,
|
|
d.document_alias,
|
|
d.document_meta_description,
|
|
df.field_value AS document_image
|
|
FROM " . PREFIX . "_documents AS d
|
|
|
|
/* Находим ID самого первого поля типа image_single для каждой рубрики */
|
|
LEFT JOIN (
|
|
SELECT rubric_id, MIN(Id) as first_img_id
|
|
FROM " . PREFIX . "_rubric_fields
|
|
WHERE rubric_field_type = 'image_single'
|
|
GROUP BY rubric_id
|
|
) AS rf_first ON (rf_first.rubric_id = d.rubric_id)
|
|
|
|
/* Подтягиваем значение именно этого конкретного поля */
|
|
LEFT JOIN " . PREFIX . "_document_fields AS df ON (
|
|
df.document_id = d.Id AND
|
|
df.rubric_field_id = rf_first.first_img_id
|
|
)
|
|
|
|
WHERE d.document_meta_keywords LIKE '" . addslashes($keywords) . "%'
|
|
AND d.Id != 1
|
|
AND d.Id != '" . (int)PAGE_NOT_FOUND_ID . "'
|
|
AND d.Id != '" . (int)$AVE_Core->curentdoc->Id . "'
|
|
AND d.document_status != '0'
|
|
AND d.document_deleted != '1'
|
|
" . $inrubric . "
|
|
" . $doctime . "
|
|
GROUP BY d.Id
|
|
ORDER BY d.document_count_view DESC
|
|
LIMIT " . (int)$limit . "
|
|
");
|
|
|
|
while ($row = $sql->FetchRow())
|
|
{
|
|
// Обработка изображения: берем кроп-миниатюру через ядро
|
|
if (!empty($row->document_image)) {
|
|
$img_parts = explode('|', $row->document_image);
|
|
$original_link = trim($img_parts[0]);
|
|
|
|
// 'c300x180' — жесткая обрезка под размер контейнера
|
|
$row->document_image = make_thumbnail(array(
|
|
'link' => $original_link,
|
|
'size' => 'c300x180'
|
|
));
|
|
}
|
|
|
|
if ($doctime != '' && (time() + $AVE_Template->cache_lifetime) > $row->document_expire)
|
|
{
|
|
$AVE_Template->cache_lifetime = $row->document_expire - time();
|
|
}
|
|
|
|
$row->document_link = rewrite_link('index.php?id=' . $row->Id . '&doc=' . (empty($row->document_alias) ? prepare_url($row->document_title) : $row->document_alias));
|
|
array_push($moredoc, $row);
|
|
}
|
|
$sql->Close();
|
|
}
|
|
|
|
$AVE_Template->assign('moredoc', $moredoc);
|
|
$lang_file = BASE_DIR . '/modules/moredoc/lang/' . $_SESSION['user_language'] . '.txt';
|
|
$AVE_Template->config_load($lang_file, 'module');
|
|
}
|
|
|
|
$AVE_Template->display($tpl_dir . 'moredoc.tpl', $AVE_Core->curentdoc->Id);
|
|
$AVE_Template->caching = false;
|
|
}
|
|
?>
|