Единый форум поддержки

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Единый форум поддержки » Форум для новичков » Общие вопросы от новичков (63) #3


Общие вопросы от новичков (63) #3

Сообщений 461 страница 480 из 502

1

В этой теме задаём простые вопросы по функционалу форумов

В этой теме новички могут задать свои вопросы о том, как устроен форум, какие у него есть функции, как пользоваться различными возможностями, какие существуют технические нюансы и ограничения и прочие простые вопросы, не относящиеся к оформлению, наполнению и раскрутке форума.
Если у вас возникли вопросы по оформлению форума, их можете задать в теме Общие вопросы по оформлению (65) #2
Для опытных администраторов форумов добро пожаловать в тему Общие вопросы по администрированию (7)

Важная информация перед тем, как задать вопрос:

  • Ответы дают другие участники форума по собственному желанию.

  • Администрация не может гарантировать моментальное решение или абсолютную корректность каждого ответа.

  • Пожалуйста, уважайте чужое время и усилия других пользователей, старайтесь писать грамотно и доходчиво.

  • Грубое или требовательное отношение к участникам форума неприемлемо и может привести к отказу в помощи на всём форуме.

Подробно сформулируйте свой вопрос, чтобы повысить вероятность отклика помощи:

  • Укажите ссылку на форум: Если ваш вопрос касается конкретного форума, обязательно укажите прямую ссылку на него. Это позволит нам увидеть проблему и предложить наиболее точное решение, не тратя время на догадки.

  • Опишите свой вопрос: Каким бы простым не был ваш вопрос, даже если ранее кем-то задавался, задайте его в этой теме. В случае чего, модераторы раздела перенесут ваше сообщение в другую тему.

Избегайте излишней навязчивости. В данной теме дают ответы на вопросы, не требующие особого вникания в проблему. Например, для нахождения того или иного функционала в административной части форума и последующей настройки этого функционала, вероятно, вам следовало бы обратиться в тему Общие вопросы по администрированию (7)

Инструменты для поиска и редактирования стиля (скриптов).

Как с помощью браузера можно определить элемент дизайна.

Каталог скриптов/CSS

Полезные скрипты, необходимые темы для новичков, а также ссылки на сайты рассказывающие что такое HTML и CSS.

Типовые Вопросы (ЧаВо)

Ответы на часто задаваемые вопросы.

Как задавать вопросы! Разница между стилем и скриптом. ( Советы)

Плюс к названию темы еще и Памятка.

Любой вопрос по оформлению/неполадкам сопровождайте ссылкой на форум, по которому возникли сложности!

Предыдущая часть темы: Общие вопросы от новичков (63)

Предыдущая часть темы: Общие вопросы от новичков (63) #2


Вопрос автора

Добрый вечер! На форуме возникла проблема с быстрой ссылкой или как её назвать... В форме ответа пишешь @ и выскакивает табличка с юзерами, нажимаешь на нужного и появляется ссылка на его профиль. Почему-то не работает именно с моим. Имя есть, а ссылки нет. С чем это может быть связано?

+2

461

Марина Аврора 22 написал(а):

Добрый день
У меня на форуме перестали загружаться картинки, сайт пишет,что превышение 1500 шт
Я не знала,как в настройках удалить часть картинок и просто удалила несколько картинок вручную, отредактировав первые посты
Картинок нет, а новые тем не менее, не загружается, хотя ох стало явно меньше
Почему так и что мне делать?
Пжл, подскажите, как решить эту проблему
https://risyiy.mybb.ru/

0

462

Марина Аврора 22 написал(а):

Я не знала,как в настройках удалить часть картинок и просто удалила несколько картинок вручную, отредактировав первые посты

Ну удаляются картинки по кнопке мои загрузки в юзер меню в шапке форума
Ну или можно оплатить VIP аккаунт(Улучшить аккаунт(тож в шапке форума) - там загрузка картинок без ограничений... (300р - год)

Отредактировано Deff (Чт, 22 Янв 2026 21:04:15)

0

463

Марина Аврора 22
Как вариант Новый загрузчик изображений (Imgur+Instagram, добавка перетаскиванием)

0

464

Merlin777 написал(а):

integral854
У вас неправильно вставляется цитата в форму быстрого ответа или неправильно форум показывает? Такое на некоторых форумах может быть, если вы выделяете текст в одном сообщении, а кнопку "Цитировать нажимаете в другом.
Неправильно показывает вроде бы.
Может быть и так, нажимаем ошибочно в другом сообщении, особенно при работе с телефона.
Появились предложения вообще отключить цитирование. Возможно ли это ?

0

465

И ещё вопрос. Если сделать регистрацию только по приглашениям, каким образом эти приглашения делать/отправлять ?

0

466

integral854 написал(а):

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

Зачем же сразу всё отключать? Вы сформулируйте проблему и её решайте:) Вы же админ, значит, волшебник :)

Вы хотите, чтобы выделение текста правильно вставлялось при любой нажатой кнопке "Цитировать"? Это в принципе можно сделать :) Вот код, который гарантирует вставку выделенного фрагмента в цитату,  со ссылкой на пост с фрагментом, при любой нажатой кнопке "Цитировать".

Посмотреть код
Код:
<!-- Аватарка в цитате версия для integral854 -->
<script>
       (function () {
      "use strict";
     
      if (window.quoteAvatarInitialized) {
        console.warn('[QuoteAvatar] Already initialized. Skipping.');
        return;
      }
      window.quoteAvatarInitialized = true;
     
      const QV_CONFIG = {
        quoteImage: 'https://forumstatic.ru/files/0015/ec/20/41408.png',
        defaultAvatar: 'https://forumstatic.ru/files/0000/14/1c/20038.jpg',
        cacheKey: 'QuoteAvatarCache'
      };
     
      // === Стили ===
      (function injectStyles() {
        if (document.getElementById('quote-avatar-styles')) return;
        const style = document.createElement('style');
        style.id = 'quote-avatar-styles';
        style.textContent = `
          .quote-box.with-avatar { padding-left: 50px !important; }
          .author-avatar + span { margin-left: 0; }
          .author-avatar { float: left; width: 39px; margin-left: -40px; margin-top: 0; }
          .author-avatar > img { width: 28px; padding: 2px; border: 1px solid #c4cad4; border-radius: 4px; }
        `;
        document.head.appendChild(style);
      })();
     
      // === Получение имени по postId ===
      function getAuthorNameByPostId(postId) {
        const post = document.getElementById(`p${postId}`);
        if (post) {
          const authorEl = post.querySelector('.pa-author');
          if (authorEl) {
            const nodes = Array.from(authorEl.childNodes);
            for (let i = nodes.length - 1; i >= 0; i--) {
              if (nodes[i].nodeType === Node.TEXT_NODE) {
                const t = nodes[i].textContent.trim();
                if (t) return t;
              }
            }
            return authorEl.textContent.replace(/^Автор:\s*/i, '').trim() || 'Гость';
          }
        }
        return 'Гость';
      }
     
   function enhanceQuoteButtons() {
  document.querySelectorAll('.post[id]').forEach(post => {
    const quoteLink = post.querySelector('.pl-quote > a');
    if (!quoteLink || quoteLink.classList.contains('with-ava')) return;
    
    const postIdMatch = post.id?.match(/^p(\d+)$/);
    if (!postIdMatch) return;
    
    const postId = postIdMatch[1];
    const userId = post.dataset.userId;
    if (!userId) return;
    
    const qHref = quoteLink.getAttribute('href');
    if (qHref) {
      // Сохраняем оригинальные параметры
      quoteLink.dataset.originalPostId = postId;
      quoteLink.dataset.originalUserId = userId;
      
      const newHref = qHref.replace(/quote\('([^']*)',\s*(\d+)\)/, `quote('${postId},${userId}', $2)`);
      quoteLink.setAttribute('href', newHref);
      quoteLink.classList.add('with-ava');
      
      // Добавляем обработчик только если его еще нет
      if (!quoteLink.dataset.clickHandlerAdded) {
        quoteLink.addEventListener('click', function(e) {
          e.preventDefault();
          
          const selection = window.getSelection();
          let targetPostId, targetUserId;
          
          // Если есть выделенный текст, ищем сообщение с выделением
          if (selection && !selection.isCollapsed) {
            const range = selection.getRangeAt(0);
            // Получаем элемент, содержащий выделение (может быть текстовым узлом)
            let selectedNode = range.commonAncestorContainer;
            
            // Если это текстовый узел, берем его родителя
            if (selectedNode.nodeType === Node.TEXT_NODE) {
              selectedNode = selectedNode.parentElement;
            }
            
            // Теперь можно использовать closest()
            const postElement = selectedNode.closest?.('.post[id]');
            
            if (postElement) {
              const selectedPostIdMatch = postElement.id.match(/^p(\d+)$/);
              if (selectedPostIdMatch) {
                targetPostId = selectedPostIdMatch[1];
                targetUserId = postElement.dataset.userId;
              }
            }
          }
          
          // Если не нашли сообщение с выделением, используем параметры из текущего сообщения
          if (!targetPostId || !targetUserId) {
            targetPostId = this.dataset.originalPostId;
            targetUserId = this.dataset.originalUserId;
          }
          
          // Извлекаем ID текстового поля из оригинальной ссылки
          const match = qHref.match(/quote\('([^']*)',\s*(\d+)\)/);
          if (match) {
            const textareaId = match[2];
            
            // Вызываем функцию цитирования с правильными параметрами
            if (typeof window.quote === 'function') {
              window.quote(`${targetPostId},${targetUserId}`, textareaId);
            } else {
              // Резервный вариант через eval
              try {
                eval(`quote('${targetPostId},${targetUserId}', ${textareaId})`);
              } catch (err) {
                console.error('Error quoting:', err);
              }
            }
          }
        });
        
        // Помечаем, что обработчик добавлен
        quoteLink.dataset.clickHandlerAdded = 'true';
      }
    }
  });
}
     
      function setLinkAndAva(selector = 'body') {
        const context = typeof selector === 'string' ? document.querySelector(selector) || document : selector;
        const boxes = Array.from(context.querySelectorAll('.quote-box:not(.with-avatar)'));
        if (boxes.length === 0) return;
     
        boxes.forEach(box => {
          const cite = box.querySelector(':scope > cite');
          if (!cite) return;
          let text = cite.textContent.trim();
          if (text === 'HTML+ написал(а):' || text === 'HTML написал(а):') return;
          if (/^Скрытый\sтекст/.test(text)) return;
     
          // --- Случай 1: "Сообщение от 12345,678" ---
          const match = text.match(/(?:Сообщение\s+от\s+)?(\d+)\s*,\s*(\d+)/i);
          if (match) {
            const postId = match[1];
            const userId = match[2];
            if (/^\d+$/.test(postId) && /^\d+$/.test(userId)) {
              const username = getAuthorNameByPostId(postId);
              const href = document.querySelector(`#p${postId}.post`)
                ? `#p${postId}`
                : `/viewtopic.php?pid=${postId}#p${postId}`;
     
              const avatarEl = document.createElement('span');
              avatarEl.className = 'author-avatar';
              avatarEl.innerHTML = `<img src="${QV_CONFIG.defaultAvatar}" alt="${username}" title="${username}" loading="lazy"/>`;
     
              const nameEl = document.createElement('span');
              nameEl.innerHTML = `<span class="qcn">Сообщение от</span> <span class="qc-uname">${username}</span>`;
     
              const linkA = document.createElement('a');
              linkA.href = href;
              linkA.className = 'qc-post-link';
              linkA.innerHTML = `<img src="${QV_CONFIG.quoteImage}" title="Перейти к сообщению"/>`;
     
              const linkSpan = document.createElement('span');
              linkSpan.className = 'qc-post-link';
              linkSpan.appendChild(linkA);
     
              cite.innerHTML = '';
              cite.appendChild(avatarEl);
              cite.appendChild(nameEl);
              cite.appendChild(document.createTextNode('\u00A0')); //  
              cite.appendChild(linkSpan);
     
              box.classList.add('with-avatar');
              box.id = `u${userId}`;
              cite.id = `p${postId}`;
              return;
            }
          }
     
          // --- Случай 2: старые форматы ---
          let avatar = QV_CONFIG.defaultAvatar;
          let username = 'Гость';
          let link = '#';
          let hasLink = false;
     
          if (text.includes('http://')) {
            const match2 = text.match(/^(.*?),http:\/\/(.*?)\sнаписал/mi);
            if (match2) {
              username = match2[1];
              const urlPart = match2[2];
              const [url, avatarPart] = urlPart.includes('|') ? urlPart.split('|', 2) : [urlPart, ''];
              link = `http://${url}`;
              if (avatarPart) avatar = `/img/avatars/${avatarPart}`;
              hasLink = true;
            }
          } else if (text.includes('#p')) {
            const match2 = text.match(/^#p(\d+),(.*?)\sнаписал/mi);
            if (match2) {
              const postId = match2[1];
              const userPart = match2[2];
              const [name, avatarPart] = userPart.includes('|') ? userPart.split('|', 2) : [userPart, ''];
              username = name;
              link = `#p${postId}`;
              if (!document.querySelector(`#p${postId}.post`)) link = `/viewtopic.php?pid=${postId}#p${postId}`;
              if (avatarPart) avatar = `/img/avatars/${avatarPart}`;
              hasLink = true;
            }
          } else {
            username = text.replace(/\sнаписал.*$/i, '').trim();
            if (username.includes(',undefined')) username = 'Гость';
          }
     
          if (!box.classList.contains('with-avatar')) {
            const avatarEl = document.createElement('span');
            avatarEl.className = 'author-avatar';
            avatarEl.innerHTML = `<img src="${avatar}" alt="${username}" title="${username}" loading="lazy"/>`;
     
            const nameEl = document.createElement('span');
            nameEl.innerHTML = `<span class="qcn">Сообщение от</span> <span class="qc-uname">${username}</span>`;
     
            cite.innerHTML = '';
            cite.appendChild(avatarEl);
            cite.appendChild(nameEl);
     
            if (hasLink) {
              const linkA = document.createElement('a');
              linkA.href = link;
              linkA.className = 'qc-post-link';
              linkA.innerHTML = `<img src="${QV_CONFIG.quoteImage}" title="Перейти к сообщению"/>`;
     
              const linkSpan = document.createElement('span');
              linkSpan.className = 'qc-post-link';
              linkSpan.appendChild(linkA);
     
              cite.appendChild(document.createTextNode('\u00A0'));
              cite.appendChild(linkSpan);
            }
     
            box.classList.add('with-avatar');
     
            if (document.getElementById('pun-messages')) {
              box.classList.remove('with-avatar');
              const avatarSpan = cite.querySelector('.author-avatar');
              if (avatarSpan) avatarSpan.remove();
            }
          }
        });
     
        // === API-улучшение ===
        const userIDs = [...new Set(
          Array.from(document.querySelectorAll('.quote-box[id^="u"]'))
            .map(box => box.id.substring(1))
            .filter(id => /^\d+$/.test(id))
        )];
     
        if (userIDs.length === 0) {
          document.getElementById('Hide_qCite')?.remove();
          return;
        }
     
        // Обновляем существующие элементы без перезаписи ссылок
        function parseQuote(user_id, ava, username) {
          document.querySelectorAll(`.quote-box[id="u${user_id}"]`).forEach(box => {
            const cite = box.querySelector(':scope > cite');
            if (!cite) return;
     
            const avatarImg = cite.querySelector('.author-avatar img');
            const usernameEl = cite.querySelector('.qc-uname');
     
            if (avatarImg && ava) {
              avatarImg.src = ava;
              avatarImg.alt = avatarImg.title = username || usernameEl?.textContent || 'Гость';
            }
     
            if (usernameEl && username) {
              usernameEl.textContent = username;
              if (avatarImg) {
                avatarImg.alt = avatarImg.title = username;
              }
            }
     
            // Обновляем иконку в ссылке, если она есть
            const linkImg = cite.querySelector('.qc-post-link img');
            if (linkImg) {
              linkImg.src = QV_CONFIG.quoteImage;
              linkImg.title = "Перейти к сообщению";
            }
          });
        }
     
        // === Кэшированный API ===
        function getAPIdataFor(ids) {
          let cache = {};
          try {
            cache = JSON.parse(sessionStorage.getItem(QV_CONFIG.cacheKey) || '{}');
          } catch (e) {
            cache = {};
          }
     
          const stillMissing = [];
          ids.forEach(uid => {
            if (cache[uid]) {
              const { avatar, username } = cache[uid];
              parseQuote(uid, avatar, username);
            } else {
              stillMissing.push(uid);
            }
          });
     
          if (stillMissing.length === 0) {
            document.getElementById('Hide_qCite')?.remove();
            return;
          }
     
          const url = `/api.php?method=users.get&user_id=${encodeURIComponent(stillMissing.join(','))}&fields=user_id,username,avatar`;
          fetch(url)
            .then(res => res.json())
            .then(data => {
              document.getElementById('Hide_qCite')?.remove();
              const users = data?.response?.users || {};
              let curCache = {};
              try {
                curCache = JSON.parse(sessionStorage.getItem(QV_CONFIG.cacheKey) || '{}');
              } catch (e) {
                curCache = {};
              }
     
              for (const id in users) {
                const user = users[id];
                parseQuote(user.user_id, user.avatar, user.username);
                curCache[user.user_id] = {
                  username: user.username,
                  avatar: user.avatar || QV_CONFIG.defaultAvatar
                };
              }
     
              try {
                sessionStorage.setItem(QV_CONFIG.cacheKey, JSON.stringify(curCache));
              } catch (e) {}
            })
            .catch(() => {
              document.getElementById('Hide_qCite')?.remove();
            });
        }
     
        getAPIdataFor(userIDs);
      }
     
      function init() {
        if (document.querySelector('.quote-box, #post-preview, .post[id]')) {
          const hideStyle = document.createElement('style');
          hideStyle.id = 'Hide_qCite';
          hideStyle.textContent = '.quote-box > cite{display:none!important;}';
          document.head.appendChild(hideStyle);
     
          setLinkAndAva('body');
          enhanceQuoteButtons();
     
          const targets = [
            document.querySelector('#pun-viewtopic'),
            document.querySelector('#post-box'),
            document.body
          ].filter(Boolean);
     
          const observer = new MutationObserver(mutations => {
            for (const mutation of mutations) {
              if (!mutation.addedNodes || mutation.addedNodes.length === 0) continue;
              let need = false;
              for (const node of mutation.addedNodes) {
                if (!node || node.nodeType !== 1) continue;
                if (
                  (node.matches && node.matches('.quote-box, .post, .post.new-ajax, #post-preview')) ||
                  (node.querySelector && node.querySelector('.quote-box, .post, .post.new-ajax, #post-preview')) ||
                  (mutation.target && mutation.target.closest && (mutation.target.closest('.post') || mutation.target.id === 'post-preview'))
                ) {
                  need = true;
                  break;
                }
              }
              if (need) {
                setTimeout(() => {
                  if (document.querySelector('.quote-box:not(.with-avatar)')) {
                    setLinkAndAva('body');
                    enhanceQuoteButtons();
                  }
                }, 0);
                break;
              }
            }
          });
     
          targets.forEach(t => observer.observe(t, { childList: true, subtree: true }));
        }
      }
     
      if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
      } else {
        init();
      }
     
      const reapply = () => setTimeout(() => {
        if (document.querySelector('.quote-box:not(.with-avatar)')) setLinkAndAva('body');
      }, 0);
      ['pun_post', 'pun_edit', 'pun_preview', 'pun_main_ready'].forEach(evt =>
        document.addEventListener(evt, reapply)
      );
     
    })();
</script>
<!-- Аватарка в цитате версия для integral854 -->

Код вставлять в Администрирование - Формы - HTML верх (или в HTML низ в данном случае нет разницы).
P.S. Если вставляемую аватарку надо куда-то подвинуть, или поменять её размер, то обратите внимание на блок  // === Стили === в коде.

+1

467

integral854 написал(а):

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

Используйте цитирование с BB-кодами отдельно или в составе визуального редактора сообщений.
С BB-цитированием гарантированно будет процитировано то сообщение, в котором нажата кнопка цитаты.

integral854 написал(а):

И ещё вопрос. Если сделать регистрацию только по приглашениям, каким образом эти приглашения делать/отправлять ?

В собственном профиле в разделе Профиль - Приглашения скопируйте ссылку с параметром invite и отправляйте тем, кого хотите пригласить зарегистрироваться на форуме.
Ссылка будет такого вида: https://forum.mybb.ru/register.php?invite=32995i9104318d

0

468

https://upforme.ru/uploads/0000/14/1c/37757/t10928.jpg
https://upforme.ru/uploads/0000/14/1c/37757/t33473.jpg
В профиле вроде вообще нет никаких разделов.

0

469

integral854
В левом блоке под ником и аватаром есть ссылка "Редактировать", пройдя по ней будут доступны разделы.

0

470

Alex_63, спасибо, нашёл уже.
А можно ли сделать, чтобы регистрация была возможна только после подтверждения админом.
Или лишить какого либо участника возможности приглашать новых участников.

Отредактировано integral854 (Вт, 27 Янв 2026 15:22:41)

0

471

Всем привет. Можно ли сделать так, чтобы отметка о редактировании сообщений не появлялась, если между написанием и редактированием прошло небольшое время.

0

472

integral854
Нет, такой возможности не предусмотрено. Но можно скрыть эту отметку совсем:

Код:
<style> .lastedit {display:none !important} </style>

+1

473

https://nezha.mybb.ru/

Срочно нужна помощь в дописании кусочка в стиле для курсора, чтобы он также не менялся при наведении на скрипт салюта на главной:

Код:
body #pun_wrap a,
body #pun_wrap{ 
cursor: url('https://forumstatic.ru/files/001c/a2/58/49107.png'), default;
}

Или же написать грамотный код курсора, НО чтобы он отображался ровно как в этом, при этом не меняясь на салюте главной страницы! (больше ничего и нигде менять НЕ нужно)

0

474

<3

Код:
body * { 
cursor: url('https://forumstatic.ru/files/001c/a2/58/49107.png'), default;
}

0

475

Alex_63
Не пашет такой вариант: меняет форму ответа, но не всю (а там вообще менять ничего не надо, я поэтому подробно пожелания описала) + при модерировании темы становится невидимкой и вообще не пашет нормально... А нужно только на салюте его изменение отключить.

Отредактировано <3 (Чт, 29 Янв 2026 15:18:59)

0

476

<3
Тогда вернуть прежний код и добавить красное в скрипт фейерверка:

boddie.style.backgroundColor="transparent";boddie.style.pointerEvents="none";document.body.appendChild(boddie);set_width();

+2

477

Подскажите пожалуйста, а где можно поставить свою аватарку для сайта? чтоб в поиске была видна эта аватарка на моём форуме

0

478

Anastasia01
Судя по всему, вы имеете в виду фавиконку (favicon) - значок сайта, отображаемый во вкладке браузера и в поисковых системах.
Его можно установить в разделе Администрирование - Настройки - Основные. Для этого желаемое изображение нужно загрузить например в Администрирование - Файлы. В качестве формата для фавиконки принят .ico, но .png тоже подойдёт.

+1

479

Alex_63 написал(а):

Anastasia01
Судя по всему, вы имеете в виду фавиконку (favicon) - значок сайта, отображаемый во вкладке браузера и в поисковых системах.
Его можно установить в разделе Администрирование - Настройки - Основные. Для этого желаемое изображение нужно загрузить например в Администрирование - Файлы. В качестве формата для фавиконки принят .ico, но .png тоже подойдёт.

Спасибо большое вам

0

480

Alex_63 написал(а):

Anastasia01
Судя по всему, вы имеете в виду фавиконку (favicon) - значок сайта, отображаемый во вкладке браузера и в поисковых системах.
Его можно установить в разделе Администрирование - Настройки - Основные. Для этого желаемое изображение нужно загрузить например в Администрирование - Файлы. В качестве формата для фавиконки принят .ico, но .png тоже подойдёт.

а как сделать чтобы в поисковой системе было тоже видно аватарку сайта?

0


Вы здесь » Единый форум поддержки » Форум для новичков » Общие вопросы от новичков (63) #3