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; } ?>