Администрирование - Формы - HTML низ
Аватар в цитате V.2 © Alex_63 / Ч.2 в HTML низ
Выделение цветом прикреплённых, закрытых и непрочитанных тем
Ужатие некликабельных и кликабельных картинок в постах
Кнопки для быстрой прокрутки страницы вверх и вниз
Регулировка размера шрифта в постах
Новых тем за сутки (в статистике)
Кнопки входа через соцсети на каждой странице
Аватарка в строке приветствия
Красивые кнопки в форме ответа + компактная форма ответа
Расширенная палитра цветов
Кликабельность ника в постах Гостя
Привью темы, рейтинг и подписчики
Рестор (восстановление) ссылки "Новые сообщения" на главной странице
Кнопка "Показать пароль" в форме входа
Быстрый переход по разделам форума
Изменяем отображение статистики на главной
Исключаем из поиска: хештеги в цитатах, Текст в подписи, надпись "Отредактировано" при цитировании
Добавка ссылки на тему к заголовку поста
Снятие выделения с форума по клику
Первые N тем в описании форума
Ссылка на профиль по клику на аву
Окно для незарегистрированных, на главной странице
Уменьшение количества кнопок в форме быстрого ответа при мобильном просмотре
Выделить код и скопировать в буфер обмена
Кнопка выравнивания текста по ширине (в форме быстрого ответа)
Дополнительные смайлики в форме ответа
Код:<!-- Дополнительные смайлики в форме ответа -->
<!--дополнительные смайлы v.3.1 © Romych-->
<style type="text/css">
#wrapper{position:relative;width:500px;}
.tabs{height:22px;line-height:21px;margin:0 0 3px;list-style:none;}
.tabs li{float:left;cursor:pointer;}
.tabs li a{background:transparent url("https://forumstatic.ru/files/0017/d8/50/91984.png")no-repeat scroll 0 0/cover;color:#444;display:block;margin-bottom:-1px;padding:0 5px 1px;position:relative;text-align:center;text-decoration:none;width:70px;}
.tabs li a:hover{color:#efefef;background:url("https://forumstatic.ru/files/0017/d8/50/91984.png")no-repeat scroll 0-22.1px/cover;text-decoration:none;}
.tabs li.active a{color:#444;border:medium hidden;line-height:22px;background-position:0 -43.5px;}
.tabs li.active a:hover{color:#6A5ACD;}
#smilies-area div[class^="t-"]:not(.t-0){display:none;width:470px;
overflow: inherit;
}
#wrapper, #wrapper > div {
max-width: 100%;
}
#smilies-block, #wrapper ul ~ div {
clear: both;
}
</style>
<script type="text/javascript">
var nabor=[];
nabor['CRAZY'] = [
'https://kolobok.us/smiles/madhouse/alcoholic.gif',
'https://kolobok.us/smiles/madhouse/crazy_pilot.gif',
'https://kolobok.us/smiles/madhouse/dash1.gif',
'https://kolobok.us/smiles/madhouse/dash2.gif',
'https://kolobok.us/smiles/madhouse/dash3.gif',
'https://kolobok.us/smiles/madhouse/drag.gif',
'https://kolobok.us/smiles/madhouse/gamer1.gif',
'https://kolobok.us/smiles/madhouse/gamer2.gif',
'https://kolobok.us/smiles/madhouse/gamer3.gif',
'https://kolobok.us/smiles/madhouse/gamer4.gif',
'https://kolobok.us/smiles/madhouse/girl_crazy.gif',
'https://kolobok.us/smiles/madhouse/girl_hospital.gif',
'https://kolobok.us/smiles/madhouse/girl_wacko.gif',
'https://kolobok.us/smiles/madhouse/hang1.gif',
'https://kolobok.us/smiles/madhouse/hang2.gif',
'https://kolobok.us/smiles/madhouse/hang3.gif',
'https://kolobok.us/smiles/madhouse/hunter.gif',
'https://kolobok.us/smiles/madhouse/locomotive.gif',
'https://kolobok.us/smiles/madhouse/mail1.gif',
'https://kolobok.us/smiles/madhouse/man_in_love.gif',
'https://kolobok.us/smiles/madhouse/on_the_quiet2.gif',
'https://kolobok.us/smiles/madhouse/pilot.gif',
'https://kolobok.us/smiles/madhouse/prankster.gif',
'https://kolobok.us/smiles/madhouse/prankster2.gif',
'https://kolobok.us/smiles/madhouse/preved.gif',
'https://kolobok.us/smiles/madhouse/russian_roulette.gif',
'https://kolobok.us/smiles/madhouse/sarcastic.gif',
'https://kolobok.us/smiles/madhouse/sarcastic_blum.gif',
'https://kolobok.us/smiles/madhouse/sarcastic_hand.gif',
'https://kolobok.us/smiles/madhouse/slow.gif',
'https://kolobok.us/smiles/madhouse/stinker.gif',
'https://kolobok.us/smiles/madhouse/suicide2.gif',
'https://kolobok.us/smiles/madhouse/tease.gif',
'https://kolobok.us/smiles/madhouse/telephone.gif',
'https://kolobok.us/smiles/madhouse/to_become_senile.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose2.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose3.gif',
'https://kolobok.us/smiles/madhouse/to_pick_ones_nose_eat.gif',
'https://kolobok.us/smiles/madhouse/wacko.gif',
'https://kolobok.us/smiles/madhouse/wacko2.gif'];
nabor['RPG'] = [
'https://kolobok.us/smiles/rpg/assassin.gif',
'https://kolobok.us/smiles/rpg/butcher.gif',
'https://kolobok.us/smiles/rpg/dwarf.gif',
'https://kolobok.us/smiles/rpg/elf.gif',
'https://kolobok.us/smiles/rpg/girl_werewolf.gif',
'https://kolobok.us/smiles/rpg/jester.gif',
'https://kolobok.us/smiles/rpg/king.gif',
'https://kolobok.us/smiles/rpg/king2.gif',
'https://kolobok.us/smiles/rpg/orc.gif',
'https://kolobok.us/smiles/rpg/paladin.gif',
'https://kolobok.us/smiles/rpg/queen.gif',
'https://kolobok.us/smiles/rpg/vampire.gif',
'https://kolobok.us/smiles/rpg/wizard.gif'];
$('#button-smile').one('click',function(){$('#smilies-block').addClass('t-0');var vkl = '<div id="wrapper"><ul class="tabs" onclick="return changeVisibility (\'smilies-area\', false)"><li class="t-0 active"><a>Обычные</a></li></ul></div>';$('#smilies-area').prepend(vkl);for(var i in nabor){$('.tabs').append('<li class="t-'+i+'"><a>'+i+'</a></li>');$('#wrapper').append('<div class="t-'+i+'"></div>');$.each(nabor[i],function(q){$('div.t-'+i).append('<img loading="lazy" src="'+nabor[i][q]+'" onclick=smile("[img]'+nabor[i][q]+'[/img]") />');})};$('.tabs li').click(function(){var thisClass=this.className;$('#smilies-area div[class^="t-"]').hide();$('div.'+thisClass).fadeToggle('slow');$('.tabs li').removeClass('active');$(this).addClass('active');}); });
</script>
<!-- Дополнительные смайлики в форме ответа -->
Добавление чекбокса "Выбрать все сообщения на странице" для модераторов
Своё описание к форуму на странице форума
Картинка перед ником юзера (например, шляпка)
Список поблагодаривших под постом
Вставка видео с помощью Sendvid
Счётчик тем, созданных юзером (в мини-профиле) - кликабельность надписи
Счётчик сообщений, созданных юзером (в мини-профиле) - кликабельность надписи
Универсальный скрипт замены © Merlin777
Код:
<!-- Начало: Универсальный скрипт замены © Merlin777 kuban.mybb.ru -->
<script>
document.addEventListener("DOMContentLoaded", function () {
// =========================
// 📦 CONFIG — Настройки
// =========================
const CONFIG = {
observerDelay: 0, // ⏳ Задержка обновления элементов (0 = requestAnimationFrame для максимально плавного обновления)
// ✅ Разрешить покраску ников на главной странице сайта (в статистике)
enableIndexNickColoring: true,
// 🔤 Автозамены текста в профиле, кнопках и мини-профиле
replacements: {
profileElements: [
['.pl-email.profile', 'Профиль', '👤Профиль'], // Заменяем текст "Профиль" на с эмодзи
['.pl-email.email', 'E-mail', '📧Mail'], // "E-mail" → "📧Mail"
['.pl-email.pm', 'ЛС', '✉️\u00A0ЛС'], // "ЛС" → "✉️ ЛС"
['.pl-website.website', 'Вебсайт', '🌐'] // "Вебсайт" → "🌐"
],
postButtons: [
['.pl-edit a', 'Редактировать', '✍️\u00A0Редактировать'], // Кнопка редактирования
['.pl-delete a', 'Удалить', '❌\u00A0Удалить'], // Кнопка удаления
['.pl-quote a', 'Цитировать', '💬\u00A0Цитировать'], // Кнопка цитирования
['.pl-reply a', 'Ответить', '↩️\u00A0Ответить'], // Кнопка ответа
['.pa-posts', 'Сообщений', '📨 Сообщений'], // Кол-во сообщений с эмодзи
],
miniProfile: [
['.pa-ip', 'IP', '🖧 IP'], // IP пользователя
['.pa-sex', 'Пол', '⚧️ Пол'], // Пол с эмодзи
['.pa-fld3', 'Создано тем', '➕ Создано тем'], // Кол-во созданных тем
['.fld-name', 'Откуда', '🧭 Откуда'], // Местоположение
['.pa-respect', 'Уважение', '⭐ Рейтинг'] // Рейтинг
]
},
// 🎨 Селекторы мини-профиля для перекраски
miniProfileSelectors: ["li.pa-title","li.pa-fld1"],
// 🎨 Цвета ников по группам (основной и ховер)
groupColors: {
1: ['#008080','#a1b2cc'], // 🛡️ Админ
2: ['#993232','#d15f13'], // 🧑⚖️ Модератор
3: ['#000000','#B0B0B0'], // 👤 Гость (черный с серым ховером)
4: ['#072387','#5869a3'] // 🧙♂️ Пользователь (темно-синий с светло-синим ховером)
},
// 🎨 Цвета для мини-профиля по именам
miniProfileColors: {
"Модератор": { color: ['#38761d','#6abd46'], groups: [2] }, // Зеленый оттенок
"Администратор": { color: ['#5c1eba','#a1b2cc'], groups: [1] }, // Фиолетовый оттенок
"The Wizard of the Realm": { color: ['#2986cc','#a1b2cc'], groups: [1] } // Синий
}
};
// =========================
// 💬 CSS hover — плавное изменение цвета при наведении
// =========================
const style = document.createElement('style');
style.innerHTML = 'a[data-base-color], span[data-base]{transition: color 0.25s ease; cursor:pointer;}';
document.head.appendChild(style);
// =========================
// 🔄 Функция автозамены текста
// =========================
function ChangeAll(scope=document){
// Объединяем все массивы автозамен
[].concat(CONFIG.replacements.profileElements,
CONFIG.replacements.postButtons,
CONFIG.replacements.miniProfile).forEach(function(r){
var sel = r[0], from = r[1], to = r[2];
// Находим элементы, которые еще не заменены
scope.querySelectorAll(sel+':not([data-replaced])').forEach(function(el){
if(el.innerHTML.indexOf(from) !== -1) el.innerHTML = el.innerHTML.replaceAll(from,to);
el.dataset.replaced = 'true'; // Помечаем элемент как обработанный
});
});
}
// =========================
// 🎨 Покраска ников в постах
// =========================
function recolorPostNicks(users, scope = document) {
const userMap = {};
users.forEach(u => {
if (u.username) userMap[u.username.trim().toLowerCase()] = parseInt(u.group_id);
});
// 🧱 Общая функция покраски по элементу
function colorNick(el, username) {
const group_id = userMap[username.toLowerCase()] || 4; // default group
const colors = CONFIG.groupColors[group_id];
if (!colors) return;
el.style.color = colors[0];
el.dataset.baseColor = colors[0];
el.dataset.hoverColor = colors[1] || colors[0];
}
// 🎯 1. Ники в постах
scope.querySelectorAll('.post a[href^="javascript:to("]').forEach(el => {
if (el.closest('.quote-box, .dropdown, #pun-navlinks, .vote-list, .user-menu')) return;
const username = el.textContent.trim();
colorNick(el, username);
});
// 🏠 2. Ники на главной (например, в #onlinelist)
if (CONFIG.enableIndexNickColoring && document.getElementById('onlinelist')) {
document.querySelectorAll('#onlinelist a[href*="profile.php"]').forEach(el => {
const username = el.textContent.trim();
colorNick(el, username);
});
}
}
// =========================
// 🎨 Покраска мини-профиля
// =========================
function recolorMiniProfile(scope=document){
CONFIG.miniProfileSelectors.forEach(function(sel){
scope.querySelectorAll(sel).forEach(function(el){
if(el.dataset.mpRecolored) return; // Уже перекрашен
let html = el.innerHTML;
Object.entries(CONFIG.miniProfileColors).forEach(function([name,obj]){
const [base,hover] = obj.color;
if(html.includes(name)){
// Заменяем текст на span с цветами
html = html.replace(name,
'<span data-base="'+base+'" data-hover="'+hover+'" style="font-weight:bold;color:'+base+';">'+name+'</span>'
);
}
});
el.innerHTML = html;
el.dataset.mpRecolored = 'true'; // Отмечаем как обработанный
});
});
}
// =========================
// 🎨 Универсальная перекраска всего (посты + мини-профиль)
// =========================
function recolorAll(scope=document){
recolorPostNicks(JSON.parse(localStorage.getItem('UsersAdmList')?.split('|')[1] || '[]'), scope);
recolorMiniProfile(scope);
}
// =========================
// 🌐 Получение пользователей через API
// =========================
function fetchUsersAndRecolor(force=false, scope=document){
var key='UsersAdmList';
var now=Math.floor(Date.now()/1000);
var cached=localStorage.getItem(key);
if(cached && !force){
try{
var arr=cached.split('|');
if((now-parseInt(arr[0]))<24*3600){ // ⏱ кеш на 24 часа
recolorAll(scope);
return;
}
}catch(e){console.warn(e);}
}
// Запрос через API
fetch('/api.php',{
method:'POST',
headers:{'Content-Type':'application/x-www-form-urlencoded'},
body:new URLSearchParams({method:'users.get',limit:'500',fields:'user_id,username,group_id'})
}).then(r=>r.json()).then(function(data){
if(data?.response?.users){
var users=data.response.users;
localStorage.setItem(key,now+'|'+JSON.stringify(users)); // Сохраняем кеш
recolorAll(scope);
}
}).catch(console.error);
}
// =========================
// 👆 Hover — меняем цвет при наведении
// =========================
document.body.addEventListener('mouseover',function(e){
var el = e.target.closest('span[data-base], a[data-base-color]');
if(el) el.style.color = el.dataset.hoverColor || el.dataset.hover || el.style.color;
});
document.body.addEventListener('mouseout',function(e){
var el = e.target.closest('span[data-base], a[data-base-color]');
if(el) el.style.color = el.dataset.baseColor || el.dataset.base || el.style.color;
});
// =========================
// ⏳ Планирование обновления через requestAnimationFrame или setTimeout
// =========================
let scheduled = false;
function scheduleUpdate(){
if(scheduled) return;
scheduled = true;
if(CONFIG.observerDelay === 0){
requestAnimationFrame(()=>{ ChangeAll(); recolorAll(); scheduled=false; });
} else {
setTimeout(()=>{ ChangeAll(); recolorAll(); scheduled=false; }, CONFIG.observerDelay);
}
}
// =========================
// 👁 MutationObserver — следим за изменениями DOM и автоматически перекрашиваем новые элементы
// =========================
const observer = new MutationObserver(()=>scheduleUpdate());
observer.observe(document.body,{childList:true,subtree:true});
// =========================
// ▶ Инициализация при загрузке страницы
// =========================
ChangeAll();
fetchUsersAndRecolor();
// =========================
// 🆕 Live-подгрузка новых постов
// =========================
document.addEventListener('pun_post',function(e){
var scope = e.detail?.post || document.body;
ChangeAll(scope);
fetchUsersAndRecolor(true, scope); // форсируем обновление при новых постах
});
});
</script>
<!-- Конец: Универсальный скрипт замены © Merlin777 kuban.mybb.ru -->
📄 Краткое текстовое описание работы скрипта по пунктам
1. Загрузка и конфигурация:
Скрипт выполняется после полной загрузки страницы (DOMContentLoaded).
В объекте CONFIG настраиваются:
текстовые автозамены (смайлики и подписи),
цвета групп (для ников),
цвета мини-профиля,
включение/отключение покраски на главной странице (enableIndexNickColoring),
задержка обновлений (через observerDelay),
список селекторов, в которых производится автозамена текста.
2. Замена текста (ChangeAll):
Заменяет стандартные подписи (например, "Профиль" → "👤Профиль") в:
Каждый элемент помечается data-changed="true", чтобы не заменять повторно.
3. Перекраска ников (recolorUsers и recolorPostNicks):
Загружает список пользователей с группами из:
.post a[href^="javascript:to("] — ссылки на ники внутри тем.
Исключает ненужные области (шапка, цитаты, меню, dropdown'ы и т.п.).
Если включено enableIndexNickColoring, то красит ники в блоке #onlinelist на главной странице.
Поддерживает hover-эффект (цвет меняется при наведении).
4. Перекраска мини-профиля (recolorMiniProfile):
li.pa-title, li.pa-fld1, li.pa-fld2, и т.д.
Цвет задаётся в CONFIG.groupProfileColors по group_id.
5. Объединённая функция перекраски (recolorAll):
6. Hover через делегирование:
На body навешиваются события mouseover и mouseout.
Отслеживаются все элементы с data-base или data-base-color.
При наведении цвет меняется на hover-цвет, при уходе — возвращается.
7. Обновление при динамических изменениях (MutationObserver):
Следит за изменениями в document.body.
Вызывает scheduleUpdate, который:
запускает обновление через requestAnimationFrame (если observerDelay: 0),
или через setTimeout (если указана задержка).
Позволяет скрипту корректно обрабатывать любые подгрузки и изменения DOM.
8. AJAX события (pun_post):
При событии pun_post (используется live-подгрузка на форуме):
вызывается scheduleUpdate() — обновляет DOM,
и fetchAndColor(true) — принудительно обновляет список пользователей и перекраску.
Это гарантирует, что все новые сообщения получают раскраску, как старые.
9. Кэширование пользователей (fetchAndColor):
Пользователи с username и group_id сохраняются в localStorage.
Кэш действует 24 часа (86400 секунд).
Это минимизирует запросы и ускоряет загрузку скрипта.
- Подпись автора
Функционал форума Книга жалоб Книга предложений Знак зодиака Как вставить видео на форум Форум"Грибные места" Слайдер для картинок Live-box с темами