1 (edited by PunBB 2020.09.30 04:10)

Topic: Скрытые форумы

Здравствуйте.
Может кто знает. Есть ли расширение, которое может скрывать некоторые (по списку) форумы на главной странице?
Т.е. форум "N" виден на главной странице и доступен по внутренней ссылке.
А форум "M" НЕвиден на главной странице, но доступен по внутренней ссылке.
Эти оба форума - самые обычные форумы, но второй из них не виден на главной странице.
Может как-то можно это реализовать.

(Кстати, может сделать отдельную ветку "Поиск расширения"?)

2

Re: Скрытые форумы

такого расширения нет, но это несложно написать. Кстати, можете быть первым PunBB_INFO_ICQ/wink  если что я помогу

3 (edited by belelectroteam 2020.09.30 08:15)

Re: Скрытые форумы

Я себе это представляю так:
1. При создании нового форума админ указывает его название. Это название может быть обычным, а может и с первым символом " " (пробел).
Это пробел не будет виден нигде: ни на главной, ни в хлебных крошках, ни в ссылках. На то он и пробел. Только это именно первый пробел, т.к. далее в названии форума могут еще быть пробелы (куда ж без них).
2. При отрисовке главной (только главной) страницы некий скрипт проверяет наличие первого пробела в названии форума. Если это символ " " (пробел), то цикл пропускает отрисовку данного форума и по алгоритму ищется в базе следующий форум (или как оно там делается). Но ссылка для входа на этот форум имеется. Т.е. форум существует. По ссылке можно войти!
3. Пока что есть проблема. Имена форумов нельзя начинать с пробела. Если так сделать, то движок просто убирает первый пробел.
4. Пробел выбран именно из-за его "невидимости". Я пробовал с точками и дефисами - получается плохо.

---------------------------------

PunBB wrote:

но это несложно написать

А какой файл отвечает за начальную страницу форума?


---------------------------------

index.php Так?
В нем есть кусок кода, который отвечает за вывод категорий и форумов:

Spoiler
// Print the categories and forums
$query = array(
   'SELECT'   => 'c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.forum_desc, f.redirect_url, f.moderators, f.num_topics, f.num_posts, f.last_post, f.last_post_id, f.last_poster',
   'FROM'      => 'categories AS c',
   'JOINS'      => array(
      array(
         'INNER JOIN'   => 'forums AS f',
         'ON'         => 'c.id=f.cat_id'
      ),
      array(
         'LEFT JOIN'      => 'forum_perms AS fp',
         'ON'         => '(fp.forum_id=f.id AND fp.group_id='.$forum_user['g_id'].')'
      )
   ),
   'WHERE'      => 'fp.read_forum IS NULL OR fp.read_forum=1',
   'ORDER BY'   => 'c.disp_position, c.id, f.disp_position'
);

($hook = get_hook('in_qr_get_cats_and_forums')) ? eval($hook) : null;
$result = $forum_db->query_build($query) or error(__FILE__, __LINE__);

$forum_page['cur_category'] = $forum_page['cat_count'] = $forum_page['item_count'] = 0;

while ($cur_forum = $forum_db->fetch_assoc($result))
{
   ($hook = get_hook('in_forum_loop_start')) ? eval($hook) : null;

   ++$forum_page['item_count'];

   if ($cur_forum['cid'] != $forum_page['cur_category'])   // A new category since last iteration?
   {
      if ($forum_page['cur_category'] != 0)
         echo "\t".'</div>'."\n";

      ++$forum_page['cat_count'];
      $forum_page['item_count'] = 1;

      $forum_page['item_header'] = array();
      $forum_page['item_header']['subject']['title'] = '<strong class="subject-title">'.$lang_index['Forums'].'</strong>';
      $forum_page['item_header']['info']['topics'] = '<strong class="info-topics">'.$lang_index['topics'].'</strong>';
      $forum_page['item_header']['info']['post'] = '<strong class="info-posts">'.$lang_index['posts'].'</strong>';
      $forum_page['item_header']['info']['lastpost'] = '<strong class="info-lastpost">'.$lang_index['last post'].'</strong>';

      ($hook = get_hook('in_forum_pre_cat_head')) ? eval($hook) : null;

      $forum_page['cur_category'] = $cur_forum['cid'];

?>   <div class="main-head">
      <h2 class="hn"><span><?php echo forum_htmlencode($cur_forum['cat_name']) ?></span></h2>
   </div>
   <div class="main-subhead">
      <p class="item-summary"><span><?php printf($lang_index['Category subtitle'], implode(' ', $forum_page['item_header']['subject']), implode(', ', $forum_page['item_header']['info'])) ?></span></p>
   </div>
   <div id="category<?php echo $forum_page['cat_count'] ?>" class="main-content main-category">
<?php

   }

   // Reset arrays and globals for each forum
   $forum_page['item_status'] = $forum_page['item_subject'] = $forum_page['item_body'] = $forum_page['item_title'] = array();

   // Is this a redirect forum?
   if ($cur_forum['redirect_url'] != '')
   {
      $forum_page['item_body']['subject']['title'] = '<h3 class="hn"><a class="external" href="'.forum_htmlencode($cur_forum['redirect_url']).'" title="'.sprintf($lang_index['Link to'], forum_htmlencode($cur_forum['redirect_url'])).'"><span>'.forum_htmlencode($cur_forum['forum_name']).'</span></a></h3>';
      $forum_page['item_status']['redirect'] = 'redirect';

      if ($cur_forum['forum_desc'] != '')
         $forum_page['item_subject']['desc'] = $cur_forum['forum_desc'];

      $forum_page['item_subject']['redirect'] = '<span>'.$lang_index['External forum'].'</span>';

      ($hook = get_hook('in_redirect_row_pre_item_subject_merge')) ? eval($hook) : null;

      if (!empty($forum_page['item_subject']))
         $forum_page['item_body']['subject']['desc'] = '<p>'.implode(' ', $forum_page['item_subject']).'</p>';

      // Forum topic and post count
      $forum_page['item_body']['info']['topics'] = '<li class="info-topics"><span class="label">'.$lang_index['No topic info'].'</span></li>';
      $forum_page['item_body']['info']['posts'] = '<li class="info-posts"><span class="label">'.$lang_index['No post info'].'</span></li>';
      $forum_page['item_body']['info']['lastpost'] = '<li class="info-lastpost"><span class="label">'.$lang_index['No lastpost info'].'</span></li>';

      ($hook = get_hook('in_redirect_row_pre_display')) ? eval($hook) : null;
   }
   else
   {
      // Setup the title and link to the forum
      $forum_page['item_title']['title'] = '<a href="'.forum_link($forum_url['forum'], array($cur_forum['fid'], sef_friendly($cur_forum['forum_name']))).'"><span>'.forum_htmlencode($cur_forum['forum_name']).'</span></a>';

      // Are there new posts since our last visit?
      if (!$forum_user['is_guest'] && $cur_forum['last_post'] > $forum_user['last_visit'] && (empty($tracked_topics['forums'][$cur_forum['fid']]) || $cur_forum['last_post'] > $tracked_topics['forums'][$cur_forum['fid']]))
      {
         // There are new posts in this forum, but have we read all of them already?
         foreach ($new_topics[$cur_forum['fid']] as $check_topic_id => $check_last_post)
         {
            if ((empty($tracked_topics['topics'][$check_topic_id]) || $tracked_topics['topics'][$check_topic_id] < $check_last_post) && (empty($tracked_topics['forums'][$cur_forum['fid']]) || $tracked_topics['forums'][$cur_forum['fid']] < $check_last_post))
            {
               $forum_page['item_status']['new'] = 'new';
               $forum_page['item_title']['status'] = '<small>'.sprintf($lang_index['Forum has new'], '<a href="'.forum_link($forum_url['search_new_results'], $cur_forum['fid']).'" title="'.$lang_index['New posts title'].'">'.$lang_index['Forum new posts'].'</a>').'</small>';

               break;
            }
         }
      }

      ($hook = get_hook('in_normal_row_pre_item_title_merge')) ? eval($hook) : null;

      $forum_page['item_body']['subject']['title'] = '<h3 class="hn">'.implode(' ', $forum_page['item_title']).'</h3>';


      // Setup the forum description and mod list
      if ($cur_forum['forum_desc'] != '')
         $forum_page['item_subject']['desc'] = $cur_forum['forum_desc'];

      if ($forum_config['o_show_moderators'] == '1' && $cur_forum['moderators'] != '')
      {
         $forum_page['mods_array'] = unserialize($cur_forum['moderators']);
         $forum_page['item_mods'] = array();

         foreach ($forum_page['mods_array'] as $mod_username => $mod_id)
            $forum_page['item_mods'][] = ($forum_user['g_view_users'] == '1') ? '<a href="'.forum_link($forum_url['user'], $mod_id).'">'.forum_htmlencode($mod_username).'</a>' : forum_htmlencode($mod_username);

         ($hook = get_hook('in_row_modify_modlist')) ? eval($hook) : null;

         $forum_page['item_subject']['modlist'] = '<span class="modlist">'.sprintf($lang_index['Moderated by'], implode(', ', $forum_page['item_mods'])).'</span>';
      }

      ($hook = get_hook('in_normal_row_pre_item_subject_merge')) ? eval($hook) : null;

      if (!empty($forum_page['item_subject']))
         $forum_page['item_body']['subject']['desc'] = '<p>'.implode(' ', $forum_page['item_subject']).'</p>';


      // Setup forum topics, post count and last post
      $forum_page['item_body']['info']['topics'] = '<li class="info-topics"><strong>'.forum_number_format($cur_forum['num_topics']).'</strong> <span class="label">'.(($cur_forum['num_topics'] == 1) ? $lang_index['topic'] : $lang_index['topics']).'</span></li>';
      $forum_page['item_body']['info']['posts'] = '<li class="info-posts"><strong>'.forum_number_format($cur_forum['num_posts']).'</strong> <span class="label">'.(($cur_forum['num_posts'] == 1) ? $lang_index['post'] : $lang_index['posts']).'</span></li>';

      if ($cur_forum['last_post'] != '')
         $forum_page['item_body']['info']['lastpost'] = '<li class="info-lastpost"><span class="label">'.$lang_index['Last post'].'</span> <strong><a href="'.forum_link($forum_url['post'], $cur_forum['last_post_id']).'">'.format_time($cur_forum['last_post']).'</a></strong> <cite>'.sprintf($lang_index['Last poster'], forum_htmlencode($cur_forum['last_poster'])).'</cite></li>';
      else
         $forum_page['item_body']['info']['lastpost'] = '<li class="info-lastpost"><strong>'.$lang_common['Never'].'</strong></li>';

      ($hook = get_hook('in_normal_row_pre_display')) ? eval($hook) : null;
   }

   // Generate classes for this forum depending on its status
   $forum_page['item_style'] = (($forum_page['item_count'] % 2 != 0) ? ' odd' : ' even').(($forum_page['item_count'] == 1) ? ' main-first-item' : '').((!empty($forum_page['item_status'])) ? ' '.implode(' ', $forum_page['item_status']) : '');

   ($hook = get_hook('in_row_pre_display')) ? eval($hook) : null;

?>      <div id="forum<?php echo $cur_forum['fid'] ?>" class="main-item<?php echo $forum_page['item_style'] ?>">
         <span class="icon <?php echo implode(' ', $forum_page['item_status']) ?>"><!-- --></span>
         <div class="item-subject">
            <?php echo implode("\n\t\t\t\t", $forum_page['item_body']['subject'])."\n" ?>
         </div>
         <ul class="item-info">
            <?php echo implode("\n\t\t\t\t", $forum_page['item_body']['info'])."\n" ?>
         </ul>
      </div>
<?php

}
// Did we output any categories and forums?
if ($forum_page['cur_category'] > 0)
{

?>   </div>
<?php

}
else
{

?>   <div class="main-head">
      <h2 class="hn"><span><?php echo $lang_common['Forum message']?></span></h2>
   </div>
   <div class="main-content main-message">
      <p><?php echo $lang_index['Empty board'] ?></p>
   </div>
<?php

}

($hook = get_hook('in_end')) ? eval($hook) : null;

$tpl_temp = forum_trim(ob_get_contents());
$tpl_main = str_replace('<!-- forum_main -->', $tpl_temp, $tpl_main);
ob_end_clean();
// END SUBST - <!-- forum_main -->

---------------------------------

Ну и тут где-то должен быть цикл, который их выводит.


---------------------------------

Вот похоже он:

Spoiler
while ($cur_forum = $forum_db->fetch_assoc($result))
{ ...

---------------------------------

А вот тут формируется строка-ссылка на форум:

Spoiler
// Setup the title and link to the forum
      $forum_page['item_title']['title'] = '<a href="'.forum_link($forum_url['forum'], array($cur_forum['fid'], sef_friendly($cur_forum['forum_name']))).'"><span>'.forum_htmlencode($cur_forum['forum_name']).'</span></a>';

---------------------------------

Знания у меня конечно никакие в этом языке программирования... PunBB_INFO_ICQ/sad
Короче, нужно эту строку кода завернуть в условие "if".
Типа: if (первый символ = " ") then { ...

4

Re: Скрытые форумы

Ну если уж хак писать, то лучше что то вроде этого.

if ($forum_id != 3)
{
    //Показываем все форумы кроме 3
}

То есть скрываете по id форума.

5

Re: Скрытые форумы

Да. Хорошая идея: скрывать не по первому " " (пробелу), а по id.

---------------------------------

Правильно, что id никогда не меняется? Ни перелинковки, не переиндексирование его не меняют? Да?


---------------------------------

PunBB wrote:

Ну если уж хак писать

Кстати, а что такое "хак"?

6

Re: Скрытые форумы

@belelectroteam, наилучший способ, раз уж вам действительно нужна эта примочка, создать простое расширение добавив поле в таблицу FORUMS, например: имя_расширения_hide.
Установить значение по умолчанию 1.
Затем в настройках каждого форума менять значение в зависимости от того нужно ли скрыть форум.
Проверять можно так:
if ($forum['имя_расширения_hide'] == 1)
{
  // Show this forum
}

7

Re: Скрытые форумы

Блин! Это очень сложно с таблицей. Я такое сам точно не реализую. Вот в index.php я вроде бы разобрался куда вставить костыль "if".
Кстати, это будет чистой воды костыль! Но... Сам расширение я точно не напишу.
Может Вы?

8

Re: Скрытые форумы

@belelectroteam, почему бы не скрыть этот раздел стилем?

---------------------------------

@belelectroteam, вот, смотрите, для примера, раздел:
https://i.gyazo.com/7aa8b323efc98510c21276fbd944b160.png
Дописываем в стиль куда-нибудь:

#brd-index #forum13 {
    display: none;
}

И всё, нет раздела.
https://i.gyazo.com/2f956c0ae33b0124812bd344474fcf67.png

9

Re: Скрытые форумы

@satsana, думаю так не стоит делать:
1. Наверное, Яше и Гоше это может не понравиться - куча ссылок и все "display none". Но я неуверен.
2. Ожидается, что видимых форумов будет 10% (и они первичны и постоянны), а невидимых форумов 90% (и они могут меняться). Получается, что давить стилями придется 90% форумов - очень трудоёмко и долго для админа.

Кароч, @PunBB, давайте я сделаю тему в "Платных услугах" и сделаем по-быстрому через "if" или расширение с полем в БД.
Возметесь?

10

Re: Скрытые форумы

Я думаю не стоит плодить одинаковые темы, идея понятна. Я сейчас немного занят другим проектом, может @satsana хочет написать для вас, она неплохо в этом разбирается. О цене можете договориться в лс.  PunBB_INFO_ICQ/cool

11 (edited by belelectroteam 2020.09.30 14:52)

Re: Скрытые форумы

Зачем все это надо? Давайте разложим по полочкам.
Несколько дней назад мы начали пытаться найти расширение для вложенности форумов. Существует три расширения, которые позволяют реализовать такую функцию. Но два из них создают лишь подфорумы 1 (одного) уровня. А нужно что-бы были подфорумы 2 (двух) уровней. Т.е. Категория - Надфорум - Форум - Подфорум. То третье расширение дает такую возможность (оно дает возможность клепать подфорумы многоуровневые). Это неподдерживаемое расширение от Putnik (его вообще не рекомендуют ставить на форумы).
Оно ставится на движки 1.4.4 и 1.4.5 (хотя официально работает максимум на 1.4.2), но выдает ряд ошибок. Например:

Spoiler

Notice: Undefined offset: 3 in /hosting1/.../index.php on line 160 Warning: Invalid argument supplied for foreach() in /hosting1/.../index.php on line 160

или

Spoiler

Какая-то детская ошибка типа не найден идентификатор. Не успел скопировать...

Также есть проблема с описанием форумов - при правке описания у форумов - NORM, а у подфорумов - notNORM PunBB_INFO_ICQ/sad
Одним словом - недопиленное расширение. И непонятно как с ним будут стыковаться другие расширения. А putnik - молчит, как партизан!

Но мы нашли простое и топорное средство как заставить форум работать с вложенностями!
Просто мы не будем делать никаких вложенностей! PunBB_INFO_ICQ/smile Будут просто категории и форумы.
В описании к видимому форуму мы будем вставлять ссылки на невидимый форум:

https://punbb.info/uploads/images/2020/10/2fcc49f07a5f91d5dc378e6aa0fd8cb5.png

Ну и на главной странице тогда будем видеть:

https://punbb.info/uploads/images/2020/10/1ab3fd166d0e9ce3e01fe84c1e3374fc.png

И "Микрорайон Уручье", и "Городецкая", и "Дом 2", и "Дом 4" - это обычные форумы.
Как-бы у пользователя создается иллюзия о вложенности форумов: можно писать в ветку всего микрорайона Уручье, в под-ветку улицы Городецкой, в под-под-ветку домов 2 или 4. Есть как-бы вложенность.
Но на самом деле это всё простые форумы без дополнительных установленных расширений. Только вложенные форумы не отображаются в списке на главной странице, а доступны по внутренним ссылкам из описания к родительскому форуму. Извините за винигрет...

С хлебными крошками тоже будет нормально для каждого из форумов:

Spoiler

My PunBB forum → Микрорайон Уручье
My PunBB forum → Городецкая ул.
My PunBB forum →  Городецкая ул., д.2
My PunBB forum →  Городецкая ул., д.4

Т.е. в каждом форуме по хлебным крошкам однозначно видно где вы находитесь. И все форумы всегда уникальны - в названии присутствует и улица и дом. Повторов не будет.
Осталось только найти исполнителя на эти "костыли"  PunBB_INFO_ICQ/pardon

Простите за винигрет. Всем спокойной ночи и снов про punBB on Top in the Google! PunBB_INFO_ICQ/smile

12

Re: Скрытые форумы

@PunBB, я пока тоже, увы, занята другим проектом, даже не одним. У меня минимум на месяц очередь выстроилась.
Тот же стиль можно пихнуть не в стиль, а в описание создаваемого форума в теге <style>... как временный вариант.

13 (edited by belelectroteam 2020.09.30 23:12)

Re: Скрытые форумы

satsana wrote:

стиль можно пихнуть не в стиль, а в описание создаваемого форума в теге <style>

Здравствуйте!
Увы так не получается:
1. Ставим тег в описание создаваемого форума:
https://punbb.info/uploads/images/2020/10/bdca34da1a9cb68892febe78f2a6676b.png
2. Видим на главной странице:
https://punbb.info/uploads/images/2020/10/62c88738925052b22707469b8daf6da9.png
Т.е. создаваемый форум не исчезает. Исчезает только описание форума.

---------------------------------

Получилось найти код, который выводит форум на главной странице:

Spoiler
?>      <div id="forum<?php echo $cur_forum['fid'] ?>" class="main-item<?php echo $forum_page['item_style'] ?>">
             <span class="icon <?php echo implode(' ', $forum_page['item_status']) ?>"><!-- --></span>
             <div class="item-subject">
                <?php echo implode("\n\t\t\t\t", $forum_page['item_body']['subject'])."\n" ?>
             </div>
             <ul class="item-info">
                <?php echo implode("\n\t\t\t\t", $forum_page['item_body']['info'])."\n" ?>
             </ul>
          </div>
<?php

Я его вставляю в условие "if". Получаю:

Spoiler
    if ($forum_id !=3)
    {
    ?>      <div id="forum<?php echo $cur_forum['fid'] ?>" class="main-item<?php echo $forum_page['item_style'] ?>">
             <span class="icon <?php echo implode(' ', $forum_page['item_status']) ?>"><!-- --></span>
             <div class="item-subject">
                <?php echo implode("\n\t\t\t\t", $forum_page['item_body']['subject'])."\n" ?>
             </div>
             <ul class="item-info">
                <?php echo implode("\n\t\t\t\t", $forum_page['item_body']['info'])."\n" ?>
             </ul>
          </div>
    <?php
    }

Начал пробовать разные варианты (для общего понимания):
1. If (1==1) {... - и форумы выводятся, и ошибок по PHP нету.
2. If (0==1) {... - и форумы НЕ выводятся, и ошибок по PHP нету.
Т.е. место для вставки кода правильное и интерпретатор не ругается.

А если вставить If ($forum_id!=3) {... - то получим нотайс в этой строке:

Notice: Undefined variable: forum_id in /.../index.php on line 217

Т.е. интерпретатор не знает переменной $forum_id или она объявлена не там. ХЗ.
Вот так:
https://punbb.info/uploads/images/2020/10/ecd61e61682afb1278e3a65db8aecb1b.png

14

Re: Скрытые форумы

belelectroteam wrote:

Т.е. создаваемый форум не исчезает.

Разумеется, не исчезает. Вы же скрываете не форум, а див внутри описания.

satsana wrote:

#brd-index #forum13 {
    display: none;
}

Внутри тега <style></style> это нужно написать, поменяв номер форума на тот, который у вас. Тогда он должен исчезнуть целиком.

15 (edited by belelectroteam 2020.10.01 01:55)

Re: Скрытые форумы

@satsana, да, действительно, так тоже получается скрыть форум. Т.е. в описании к любому другому форуму можно вписать :

<style>#brd-index #forumNN {
    display: none;</style>

это попадает в какой-то реестр стилей и потом при отображении форума NN стиль будет display:none
Форум перестанет быть видимым на главной странице, но будет доступен по внутренней ссылке.
Спасибо за помощь.

16

Re: Скрытые форумы

Просто создаешь видимость того или иного форума для той или иной группы пользователей... можно хоть многоуровневый доступ сделать в зависимости от группы в которой пользователь.

17 (edited by PunBB 2020.10.02 00:29)

Re: Скрытые форумы

@belelectroteam, за активное общение и кучу найденных ошибок, а так же за предоставленные решения некоторых держите конфетку...
This content is available only to registered users.

---------------------------------

Вам нужно открыть файл /hook/in_row_pre_display.php
и перечислить ID форумов которые хотите скрыть

1

18 (edited by belelectroteam 2020.10.01 13:23)

Re: Скрытые форумы

Ахахаха! Спасибо. Будем тестить!