Категории форума

На главной, выводим последний пост в плагин recentitems

на главной странице в блоке последних тем будет показываться текст последнего сообщения, а не первого поста или описания темы


webitproff
webitproff • 29.04.2026 19:46 #1

Чтобы в шаблоне recentitems.forums.index.tpl выводить не превью первого сообщения ({FORUM_ROW_PREVIEW}), а текст последнего поста в теме, нужно немного доработать функцию cot_build_recentforums() в файле плагина.

Сейчас переменная FORUM_ROW_PREVIEW берётся из ft_preview (первый пост). Мы добавим отдельную переменную FORUM_ROW_LAST_POST_TEXT, которая будет содержать текст последнего сообщения

 

 

Нужно добавить новую переменную в массив assign, которая будет содержать текст последнего сообщения темы (чистый текст, без HTML), и не трогать существующую FORUM_ROW_PREVIEW.

Вот что нужно сделать строго добавить в текущую функцию, ни строчки не меняя из того, что уже есть.

 

1. Перед циклом foreach ($recentTopics as $row) добавьте получение текста последних постов

Сразу после блока, где загружаются $users (после if (!empty($usersIds)) { ... }), вставьте:


// === Получаем текст последнего сообщения для каждой темы ===
$lastPostTexts = [];
$topicIdsForLastPost = [];
foreach ($recentTopics as $item) {
   if (empty($item['ft_movedto'])) {
       $topicIdsForLastPost[] = (int) $item['ft_id'];
   }
}
if (!empty($topicIdsForLastPost)) {
   $sqlLastPosts = "SELECT p.fp_topicid, p.fp_text
                    FROM " . Cot::$db->forum_posts . " AS p
                    INNER JOIN (
                        SELECT fp_topicid, MAX(fp_id) AS max_id
                        FROM " . Cot::$db->forum_posts . "
                        WHERE fp_topicid IN (" . implode(',', $topicIdsForLastPost) . ")
                        GROUP BY fp_topicid
                    ) AS last ON p.fp_topicid = last.fp_topicid AND p.fp_id = last.max_id";
   $res = Cot::$db->query($sqlLastPosts)->fetchAll();
   foreach ($res as $prow) {
       $lastPostTexts[$prow['fp_topicid']] = $prow['fp_text'];
   }
}
// ====================================================

 


2. Внутри цикла foreach ($recentTopics as $row) после блока $topicPreview = ...

Найдите этот блок (строки 151-158 в вашем листинге):


$topicPreview = '';
if (!empty($row['ft_preview'])) {
    $allowBBCodes = isset(Cot::$cfg['forums']['cat_' . $row['ft_cat']])
        ? Cot::$cfg['forums']['cat_' . $row['ft_cat']]['allowbbcodes']
        : Cot::$cfg['forums']['cat___default']['allowbbcodes'];
    $topicPreview = trim(cot_parse($row['ft_preview'], $allowBBCodes));
    if (!empty($topicPreview)) {
        $topicPreview .= '...';
    }
}

 

Сразу после него добавьте расчёт текста последнего сообщения:


// === Текст последнего сообщения (чистый) ===
$lastPostText = '';
if (empty($row['ft_movedto']) && !empty($lastPostTexts[$row['ft_id']])) {
    $allowBBCodes = isset(Cot::$cfg['forums']['cat_' . $row['ft_cat']])
        ? Cot::$cfg['forums']['cat_' . $row['ft_cat']]['allowbbcodes']
        : Cot::$cfg['forums']['cat___default']['allowbbcodes'];
    $parsed = trim(cot_parse($lastPostTexts[$row['ft_id']], $allowBBCodes));
    $lastPostText = strip_tags($parsed);
}
// ==============================================

 

3. В массив $recentitems->assign([...]) добавьте новую переменную

В самом массиве после строки 

'FORUM_ROW_PREVIEW' => $topicPreview, 

добавьте:


'FORUM_ROW_LAST_POST_TEXT' => $lastPostText,

Теперь в шаблоне станет доступна новая переменная {FORUM_ROW_LAST_POST_TEXT} с чистым текстом последнего сообщения, а {FORUM_ROW_PREVIEW} останется как было. Функция полностью сохраняет обратную совместимость.

 

И сам шаблон 

<!--
    /********************************************************************************
    * File: recentitems.forums.index.tpl
    * Extension: plugin 'recentitems'
    * Description: HTML template for recentitems plugin.
    * Compatibility: CMF/CMS Cotonti Siena v0.9.26[](https://github.com/Cotonti/Cotonti)
    * Dependencies: 
    *          Bootstrap 5.3.+[](https://getbootstrap.com/); 
    *          Font Awesome Free 7.1[](https://fontawesome.com/)
    * Theme: Index36  
    * Version: 1.0.2 
    * Created: 01 Feb 2026 
    * Updated: 29 Apr 2026 
    * Copyright (c) 2026 webitproff | https://github.com/webitproff
    * Source: https://github.com/webitproff/index36-cotonti-theme
    * Demo : https://freelance-script.abuyfile.com/ 
    * Help and support: https://abuyfile.com/ru/forums/cotonti/original/skins/index36
    * License: BSD (Free distribution with saving Copyright (c) 2026 webitproff)  
    ********************************************************************************/
-->
<!-- BEGIN: MAIN -->
<div class="list-group list-group-striped list-group-flush">
    <!-- BEGIN: TOPICS_ROW -->
    <li class="list-group-item list-group-item-action {FORUM_ROW_ODDEVEN}">
        <div class="row g-3">
            <div class="col-12 col-md-8">
                <h5 class="mb-0 fs-6 fw-semibold"><a href="{FORUM_ROW_LAST_POST_URL}">{FORUM_ROW_TITLE}</a></h5>
                <!-- IF {FORUM_ROW_LAST_POST_TEXT} -->
                <p class="mb-1 small">{FORUM_ROW_LAST_POST_TEXT|strip_tags($this)|mb_substr($this, 0, 150, 'UTF-8')}...</p>
                <!-- ELSE -->
                <p class="mb-1 small">{FORUM_ROW_PREVIEW|strip_tags($this)|mb_substr($this, 0, 120, 'UTF-8')} ...</p>
                <!-- ENDIF -->
            </div>
            <div class="col-12 col-md-4 text-center d-none d-lg-block">
                <div> <small class="text-body-secondary">{PHP.L.Lastpost} {FORUM_ROW_LAST_POSTER_NAME}</small></div>
                <small class="text-body-secondary">{FORUM_ROW_UPDATED_STAMP|cot_date('datetime_medium', $this)}</small>
                <small class="text-body-secondary">{FORUM_ROW_PATH_SHORT}</small>
            </div>
        </div>
    </li>
    <!-- END: TOPICS_ROW -->
    <!-- BEGIN: NO_TOPICS_FOUND -->
    <div class="list-group-item text-center text-muted py-3">{PHP.L.recentitems_nonewposts}</div>
    <!-- END: NO_TOPICS_FOUND -->
</div>
<!-- END: MAIN -->

 

имейте ввиду, после обновления плагина при обновлении движка - всё слетит!

Отредактировано: webitproff (29.04.2026 21:11, 2 месяца назад)
🗿

🧙‍♂️ Радуйся, странниче добрый и честный! Не понапрасну привела тя стезя в земли сии. Зде бо мужи мудры и искусники дела писменнаго и численнаго, что куют словеса и плетут узоры кода, тайны разгадывают и знанием делятся, летописи множа и ремесло цифровое творя.
⬅️ Аще налево пойдеши — обрящеши грамоты древния, писания старинныя и свитки учения. ⬆️ Аще прямо — слово мудрое и совет от мужей разумеющих, что в деле кодописном искусны, получиши. ➡️ Аще направо — сам в писцы и летописцы внидеши, и в ремесло цифровое, где строки и знаки в дело живое обращаются, слово свое в память веков вложиши.
📝 Не медли же — нареки имя свое, и вниди в чин наш, и стань с нами в братстве, где код есть магия, а строки — заклятия живыя, числом и буквою слово едины суть.
🏰 Не тайно есть собрание сие, и не инициации в нем, но многое сокрыто от пришлых и ступалого, понеже не всякому открывается знание, но токмо ищущим и пребывающим в деле сем.