Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[IPB 3.1.4] Исправляем баг при переходе на конкретный пост в режиме модератора

(0 отзывов)

В режиме модератора в топиках отображаются скрытые посты, количество которых в топике может быть огромно. Так вот в этом случае, при скрытии нового поста система перекинет модератора на 1 или несколько страниц назад. И модератору снова нужно будет искать то место в топике, с которым он работал.

 

Вот наглядный пример:

sh_0011.png

Тестовая тема имеет 4 странцы в режиме модератора. В данной теме имеется 8 скрытых сообщений. При скрытии поста модератора перекинет на 1 страницу назад.

 

Баг этот происходит из-за некоррктной обработки параметра findpost в режиме модератора. Смело предполагаем, что разработчики снова забыли учесть количество скрытых постов в топике. Но, забегая вперёд, это не совсем так: они учитывают это количество, просто напросто допустили ошибку в определении самого модератора за штурвалом браузера.

 

Баг имеет место и при восстановлении скрытых постов.

 

Исправляем этот баг.

 

Открываем файлик /admin/applications/forums/modules_public/forums/findpost.php на редактирование и ищем в нём такой кодес:

'select'	=> 't.title_seo',

и заменяем его на такой:

'select'	=> 't.*',

 

Чуть ниже находим такой кодес:

    $query  = ' AND ' . $this->registry->class_forums->fetchPostHiddenQuery('visible');

   /* Can we deal with hidden posts? */
   if ( $this->registry->class_forums->canQueuePosts( $this->topic['forum_id'] ) )
   {
     if ( $this->permissions['softDeleteSee'] )
     {
       /* See queued and soft deleted */
       $query = '';
     }
     else

и заменяем его на такой:

    $sort_field = ($this->settings['post_order_column'] == 'pid') ? 'pid' : 'post_date';
   $sort_value = $sort_field == 'pid' ? $pid : $post['post_date'];

   $query  = '';

   /* Can we deal with hidden posts? */
   if ( $this->registry->class_forums->canQueuePosts( $post['forum_id'] ) )
   {       
     $softDeleteSee = $this->registry->getClass('class_forums')->canSeeSoftDeletedPosts( $post['forum_id'] );
     if ($softDeleteSee)
     {
       /* See queued and soft deleted */
       $query = ' AND ' . $this->registry->class_forums->fetchPostHiddenQuery( array( 'approved', 'sdeleted', 'hidden' ) );
     }
     else

Из данного кодеса видно, что массив $this->permissions по неизвестной причине не иниализирован. В причинах можете сами разобраться, но мне проще вставить сюда чтение одного элемента этого массива.

 

Так же ниже ищем кодес:

    $cposts = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as posts', 'from' => 'posts', 'where' => "topic_id={$post['topic_id']} AND pid <= {$pid}{$query}" ) );

и заменяем его на такой:

    if (strlen($query) < 2) 
     $query  = ' AND ' . $this->registry->class_forums->fetchPostHiddenQuery('visible');

   $cposts = $this->DB->buildAndFetch( array( 'select' => 'COUNT(*) as posts', 'from' => 'posts', 'where' => "topic_id={$post['topic_id']} AND {$sort_field} <=" . intval( $sort_value ) . $query ) );

 

Заливаем файлик findpost.php на WEB-сервер и проверяем.

После данного фикса параметр findpost в режиме модератора будет корректно обрабатываться. И поэтому двигло форума не будет более перекидывать модератора фиг знает куда.

 

PS. Исправление частично взято из IPB 3.3.4 (касательно переменной $sort_value).

0 комментариев

Рекомендованные комментарии

Нет комментариев для отображения

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.