1 (edited by PunBB 2019.05.07 15:01)

Topic: Перечень изменений вносимых в ядро движка

Начало изменений вносимых в PanBB 1.4.5

Переход с функции create_function на анонимные функции в следующих файлах:

/include/parser.php
строки с 814 по 817

$count = count($pattern_callback);
   for ($i = 0; $i < $count; $i++) {
      $text = preg_replace_callback($pattern_callback[$i], create_function('$matches', 'return '.$replace_callback[$i].';'), $text);
   }

замена на:

if (!$is_signature)
   {
       $count = count($pattern_callback);
       for ($i = 0; $i < $count; $i++) {
          $text = preg_replace_callback($pattern_callback[$i], create_function('$matches', 'return '.$replace_callback[$i].';'), $text);
       }
   }

/admin/index.php

2 (edited by PunBB 2018.03.30 21:02)

Re: Перечень изменений вносимых в ядро движка

Устранение проблемы с отправкой писем через почтовый сервер. Файл:
/include/email.php

        $_server = $_SERVER['SERVER_NAME'];
      fwrite($socket, 'EHLO '.$_server."\r\n");

Нотация PHP о переменной SERVER_NAME

'SERVER_NAME'
Имя хоста, на котором выполняется текущий скрипт. Если скрипт выполняется на виртуальном хосте, здесь будет содержатся имя, определенное для этого виртуального хоста.
Замечание: В Apache 2 вы должны установить UseCanonicalName = On и ServerName. В противном случае это значение отразит имя хоста, предоставленное клиентом, которое может быть подделано. Небезопасно полагаться на это значение в контексте требующем безопасности.

3 (edited by PunBB 2018.03.30 20:57)

Re: Перечень изменений вносимых в ядро движка

Поддержка некоторых запросов для SQLite3. Файл:
SQLite3.php

Ранее не создавалось новое поле с помощью функции

function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
{
////
}

Замена на функцию

   function add_field($table_name, $field_name, $field_type, $allow_null, $default_value = null, $after_field = null, $no_prefix = false)
   {
      if ($this->field_exists($table_name, $field_name, $no_prefix))
         return;

      $field_type = preg_replace(array_keys($this->datatype_transformations), array_values($this->datatype_transformations), $field_type);

      if ($default_value !== null && !is_int($default_value) && !is_float($default_value))
         $default_value = '\''.$this->escape($default_value).'\'';

      $this->query('ALTER TABLE '.($no_prefix ? '' : $this->prefix).$table_name.' ADD COLUMN '.$field_name.' '.$field_type.($allow_null ? ' ' : ' NOT NULL').($default_value !== null ? ' DEFAULT '.$default_value : ' ').($after_field != null ? ' AFTER '.$after_field : '')) or error(__FILE__, __LINE__);
   }

4 (edited by PunBB 2018.03.30 20:22)

Re: Перечень изменений вносимых в ядро движка

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

Зачем это нужно?

Как вы знаете в header.php стиль подключается напрямую без проверки на существование. Чем это плохо? Со временем админ может удалить те стили, которые сохранены в настройках пользователя, в результате это вызовет ошибку.

Решение.
Проверять стиль на существование, иначе подключать дефолтный.

Было

// Include stylesheets
require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';

Стало

// Include stylesheets
if (file_exists(FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php'))
   require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';
else
   $forum_loader->add_css($base_url.'/style/print.css', array('type' => 'url', 'group' => FORUM_CSS_GROUP_SYSTEM, 'media' => 'screen'));

+ проверка стиля перед подключением в функции

// Display a message when board is in maintenance mode
function maintenance_message()

Заменяемая область:

//   require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';
   if (file_exists(FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php'))
      require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';
   else
      $forum_loader->add_css($base_url.'/style/print.min.css', array('type' => 'url', 'group' => FORUM_CSS_GROUP_SYSTEM, 'media' => 'screen'));
   echo $forum_loader->render_css();

а так же в функции:

// Display $message and redirect user to $destination_url
function redirect($destination_url, $message)
{

Заменяемая область:

   // Include stylesheets
//   require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';
   if (file_exists(FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php'))
      require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';
   else
      $forum_loader->add_css($base_url.'/style/print.min.css', array('type' => 'url', 'group' => FORUM_CSS_GROUP_SYSTEM, 'media' => 'screen'));

5 (edited by PunBB 2018.03.05 00:09)

Re: Перечень изменений вносимых в ядро движка

Замена не строгого сравнения

   if ($return != null)
      return;

на строгое сравнение

   if ($return !== null)
      return;

в следующих файлах:

/include/cache.php   9 раз
/include/common_admin.php 2 раза
/include/email.php 2 раза
/include/functions.php 46 раз
/include/loader.php 9 раз
/include/parser.php 25 раз 
/include/search_functions.php 9 раз
/include/search_idx.php 3 раза
/include/xml.php 1 раз

6 (edited by PunBB 2018.03.05 00:21)

Re: Перечень изменений вносимых в ядро движка

Замена функции DBLayer на конструктор.

Нотация PHP

Внимание
Конструкторы старого типа объявлены УСТАРЕВШИМИ в PHP 7.0 и будут удалены в будущих версиях. В новом коде всегда используйте __construct().

Внесены изменения во все 7 типов баз данных.

7 (edited by PunBB 2018.03.05 17:21)

Re: Перечень изменений вносимых в ядро движка

В двух следующих файлах:
/include/template/admin.tpl
/include/template/main.tpl
удален JS. Все скрипты, стили и разные другие навороты стилизации и оформления должны находиться в папке темы.

Remore next one:

   <script>
       var main_menu = responsiveNav("#brd-navlinks", {
      label: "<!-- forum_board_title -->"
       });
       if(document.getElementsByClassName('admin-menu').length){
      var admin_menu = responsiveNav(".admin-menu", {
          label: "<!-- forum_lang_menu_admin -->"
      });
       }
       if(document.getElementsByClassName('main-menu').length){
      var profile_menu = responsiveNav(".main-menu", {
          label: "<!-- forum_lang_menu_profile -->"
      });
       }
   </script>

8 (edited by PunBB 2018.03.29 10:20)

Re: Перечень изменений вносимых в ядро движка

В виду многих жалоб на автозаполнения формы логина при регистрации нового юзера эта функция отключена.
Правка в файле register.php и /admin/install.php, закоментирована строка

Удаление

data-suggest-role="username"

из формы для вводы логина

<span class="fld-input"><input type="text" data-suggest-role="username" id="fld<?php echo $forum_page['fld_count'] ?>" name="req_username" value="<?php echo(isset($_POST['req_username']) ? forum_htmlencode($_POST['req_username']) : '') ?>" size="35" maxlength="25" required spellcheck="false" /></span>

заменено на

<span class="fld-input"><input type="text" id="fld<?php echo $forum_page['fld_count'] ?>" name="req_username" value="<?php echo(isset($_POST['req_username']) ? forum_htmlencode($_POST['req_username']) : '') ?>" size="35" maxlength="25" required spellcheck="false" /></span>

9 (edited by PunBB 2018.03.28 05:57)

Re: Перечень изменений вносимых в ядро движка

Добавлены расширенные настройки robots.txt

User-agent: *
Disallow: /admin/
Disallow: /cache/
Disallow: /profile*
Disallow: /search*
Disallow: /user*
Disallow: /?*

#Set link on your Sitremap file. Use Extension - Pan SEO.
#Sitemap: https://punbb.softplaza.net/sitemap.xml

10

Re: Перечень изменений вносимых в ядро движка

Включено ЧПУ по умолчанию. Файл .htaccess.dict переименован в .htaccess.
Урл схема по умолчанию Default.

11 (edited by PunBB 2018.03.18 23:28)

Re: Перечень изменений вносимых в ядро движка

Редактирование файла constants.php для повышения версии форума.

// Define the version and database revision that this code was written for
define('FORUM_VERSION', '1.4.5');

12 (edited by PunBB 2018.04.02 11:46)

Re: Перечень изменений вносимых в ядро движка

Редактирование копирайтов в файле footer.php

Замена:

   <p id="copyright"><?php echo sprintf($lang_common['Powered by'], '<a href="http://punbb.informer.com/">PunBB</a>'.($forum_config['o_show_version'] == '1' ? ' '.$forum_config['o_cur_version'] : ''), '<a href="http://www.informer.com/">Informer Technologies, Inc</a>') ?></p>

на

   <p id="copyright"><?php echo sprintf($lang_common['Powered by'], '<a href="https://punbb.softplaza.net/" target="_blank">PanBB</a>'.($forum_config['o_show_version'] == '1' ? ' '.$forum_config['o_cur_version'] : ''), '<a href="https://punbb.softplaza.net/">PunBB Info</a>') ?></p>

Расширено поле ввода по высоте на 3 строки в файле viewtopic.php

               <div class="txt-input"><span class="fld-input"><textarea id="fld1" name="req_message" rows="10" cols="95" required spellcheck="true" ></textarea></span></div>

13 (edited by PunBB 2018.03.28 05:54)

Re: Перечень изменений вносимых в ядро движка

Начало изменений вносимых в PanBB 1.4.6

Устранения проблемы пометки сообщений как прочитанных при посещении любой страницы какой либо темы

// Determine the post offset (based on $_GET['p'])
$forum_page['num_pages'] = ceil(($cur_topic['num_replies'] + 1) / $forum_user['disp_posts']);
$forum_page['page'] = (!isset($_GET['p']) || !is_numeric($_GET['p']) || $_GET['p'] <= 1 || $_GET['p'] > $forum_page['num_pages']) ? 1 : $_GET['p'];
$forum_page['start_from'] = $forum_user['disp_posts'] * ($forum_page['page'] - 1);
$forum_page['finish_at'] = min(($forum_page['start_from'] + $forum_user['disp_posts']), ($cur_topic['num_replies'] + 1));
$forum_page['items_info'] = generate_items_info($lang_topic['Posts'], ($forum_page['start_from'] + 1), ($cur_topic['num_replies'] + 1));

// Add/update this topic in our list of tracked topics
if (!$forum_user['is_guest'] && ($forum_page['num_pages'] == $forum_page['page']))
{
   $tracked_topics = get_tracked_topics();
   $tracked_topics['topics'][$id] = time();
   set_tracked_topics($tracked_topics);
}

+ смена блоков местами
+ добавлена проверка определения страницы с новыми сообщениями

if (!$forum_user['is_guest'] && ($forum_page['num_pages'] == $forum_page['page']))

14 (edited by PunBB 2018.03.30 20:21)

Re: Перечень изменений вносимых в ядро движка

+ Ужат файл дефолтных стилей в 2 раза.
+ Подключен более сжатый файл print.min.css

// Include stylesheets
if (file_exists(FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php'))
   require FORUM_ROOT.'style/'.$forum_user['style'].'/'.$forum_user['style'].'.php';
else
   $forum_loader->add_css($base_url.'/style/print.min.css', array('type' => 'url', 'group' => FORUM_CSS_GROUP_SYSTEM, 'media' => 'screen'));

Размер файла print.min.css составил 31кб вместо 65кб.

15 (edited by PunBB 2018.03.27 23:21)

Re: Перечень изменений вносимых в ядро движка

+ Уменьшение количества сообщений пользователя при удалении из темы одного его сообщения

Старая версия функции:

Spoiler
// Delete a single post
function delete_post($post_id, $topic_id, $forum_id)
{
   global $forum_db, $db_type;

   $return = ($hook = get_hook('fn_delete_post_start')) ? eval($hook) : null;
   if ($return !== null)
      return;

   $query = array(
      'SELECT'   => 'p.id, p.poster, p.posted',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id,
      'ORDER BY'   => 'p.id DESC',
      'LIMIT'      => '2'
   );

   ($hook = get_hook('fn_qr_get_topic_lastposts_info')) ? eval($hook) : null;
   $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
   list($last_id, ,) = $forum_db->fetch_row($result);
   list($second_last_id, $second_poster, $second_posted) = $forum_db->fetch_row($result);

   // Delete the post
   $query = array(
      'DELETE'   => 'posts',
      'WHERE'      => 'id='.$post_id
   );

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

   if (!defined('FORUM_SEARCH_IDX_FUNCTIONS_LOADED'))
      require FORUM_ROOT.'include/search_idx.php';

   strip_search_index($post_id);

   // Count number of replies in the topic
   $query = array(
      'SELECT'   => 'COUNT(p.id)',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id
   );

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

   // Update the topic now that a post has been deleted
   $query = array(
      'UPDATE'   => 'topics',
      'SET'      => 'num_replies='.$num_replies,
      'WHERE'      => 'id='.$topic_id
   );

   // If we deleted the most recent post, we need to sync up last post data as wel
   if ($last_id == $post_id)
      $query['SET'] .= ', last_post='.$second_posted.', last_post_id='.$second_last_id.', last_poster=\''.$forum_db->escape($second_poster).'\'';

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

   sync_forum($forum_id);

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

Исправленная функция: delete_post

// Delete a single post
function delete_post($post_id, $topic_id, $forum_id)
{
   global $forum_db, $db_type;

   $return = ($hook = get_hook('fn_delete_post_start')) ? eval($hook) : null;
   if ($return !== null)
      return;

   // Get poster id
   $query = array(
      'SELECT'   => 'p.id, p.poster_id',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.id='.$post_id,
   );

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

   $query = array(
      'SELECT'   => 'p.id, p.poster, p.posted',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id,
      'ORDER BY'   => 'p.id DESC',
      'LIMIT'      => '2'
   );

   ($hook = get_hook('fn_qr_get_topic_lastposts_info')) ? eval($hook) : null;
   $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
   list($last_id, ,) = $forum_db->fetch_row($result);
   list($second_last_id, $second_poster, $second_posted) = $forum_db->fetch_row($result);

   // Delete the post
   $query = array(
      'DELETE'   => 'posts',
      'WHERE'      => 'id='.$post_id
   );

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

   if (!defined('FORUM_SEARCH_IDX_FUNCTIONS_LOADED'))
      require FORUM_ROOT.'include/search_idx.php';

   strip_search_index($post_id);

   // Count number of replies in the topic
   $query = array(
      'SELECT'   => 'COUNT(p.id)',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id
   );

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

   // Update the topic now that a post has been deleted
   $query = array(
      'UPDATE'   => 'topics',
      'SET'      => 'num_replies='.$num_replies,
      'WHERE'      => 'id='.$topic_id
   );

   // If we deleted the most recent post, we need to sync up last post data as wel
   if ($last_id == $post_id)
      $query['SET'] .= ', last_post='.$second_posted.', last_post_id='.$second_last_id.', last_poster=\''.$forum_db->escape($second_poster).'\'';

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

   sync_forum($forum_id);


   if ($poster_info['poster_id'] > 1)
   {
      // Update count posts of cur user 
      $query = array(
         'UPDATE'   => 'users',
         'SET'      => 'num_posts=num_posts-1',
         'WHERE'      => 'id='.$poster_info['poster_id']
      );

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

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

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

16

Re: Перечень изменений вносимых в ядро движка

+ уменьшение количества сообщений пользователей при удалении всей темы полностью

Замена функции delete_topic

Spoiler
// Delete a topic and all of it's posts
function delete_topic($topic_id, $forum_id)
{
   global $forum_db, $db_type;

   $return = ($hook = get_hook('fn_delete_topic_start')) ? eval($hook) : null;
   if ($return !== null)
      return;

   // Create an array of forum IDs that need to be synced
   $forum_ids = array($forum_id);
   $query = array(
      'SELECT'   => 't.forum_id',
      'FROM'      => 'topics AS t',
      'WHERE'      => 't.moved_to='.$topic_id
   );

   ($hook = get_hook('fn_delete_topic_qr_get_forums_to_sync')) ? eval($hook) : null;
   $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
   while ($row = $forum_db->fetch_assoc($result))
      $forum_ids[] = $row['forum_id'];

   // Delete the topic and any redirect topics
   $query = array(
      'DELETE'   => 'topics',
      'WHERE'      => 'id='.$topic_id.' OR moved_to='.$topic_id
   );

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

   // Create a list of the post ID's in this topic
   $query = array(
      'SELECT'   => 'p.id',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id
   );

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

   $post_ids = array();
   while ($row = $forum_db->fetch_assoc($result))
      $post_ids[] = $row['id'];

   // Make sure we have a list of post ID's
   if (!empty($post_ids))
   {
      // Delete posts in topic
      $query = array(
         'DELETE'   => 'posts',
         'WHERE'      => 'topic_id='.$topic_id
      );

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

      if (!defined('FORUM_SEARCH_IDX_FUNCTIONS_LOADED'))
         require_once FORUM_ROOT.'include/search_idx.php';

      strip_search_index($post_ids);
   }

   // Delete any subscriptions for this topic
   $query = array(
      'DELETE'   => 'subscriptions',
      'WHERE'      => 'topic_id='.$topic_id
   );

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

   foreach ($forum_ids as $cur_forum_id)
      sync_forum($cur_forum_id);

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

на исправленную функцию

// Delete a topic and all of it's posts
function delete_topic($topic_id, $forum_id)
{
   global $forum_db, $db_type;

   $return = ($hook = get_hook('fn_delete_topic_start')) ? eval($hook) : null;
   if ($return !== null)
      return;

   // Create a list of the users ID's in this topic
   $query = array(
      'SELECT'   => 'p.id, p.poster_id',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id
   );

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

   $count_posters_posts = array();
   while ($row = $forum_db->fetch_assoc($result)) {
      if (!isset($count_posters_posts[$row['poster_id']]))
         $count_posters_posts[$row['poster_id']] = 1;
      else
         $count_posters_posts[$row['poster_id']] = $count_posters_posts[$row['poster_id']] + 1;
   }

   // Create an array of forum IDs that need to be synced
   $forum_ids = array($forum_id);
   $query = array(
      'SELECT'   => 't.forum_id',
      'FROM'      => 'topics AS t',
      'WHERE'      => 't.moved_to='.$topic_id
   );

   ($hook = get_hook('fn_delete_topic_qr_get_forums_to_sync')) ? eval($hook) : null;
   $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
   while ($row = $forum_db->fetch_assoc($result))
      $forum_ids[] = $row['forum_id'];

   // Delete the topic and any redirect topics
   $query = array(
      'DELETE'   => 'topics',
      'WHERE'      => 'id='.$topic_id.' OR moved_to='.$topic_id
   );

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

   // Create a list of the post ID's in this topic
   $query = array(
      'SELECT'   => 'p.id',
      'FROM'      => 'posts AS p',
      'WHERE'      => 'p.topic_id='.$topic_id
   );

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

   $post_ids = array();
   while ($row = $forum_db->fetch_assoc($result))
      $post_ids[] = $row['id'];

   // Make sure we have a list of post ID's
   if (!empty($post_ids))
   {
      // Delete posts in topic
      $query = array(
         'DELETE'   => 'posts',
         'WHERE'      => 'topic_id='.$topic_id
      );

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

      if (!defined('FORUM_SEARCH_IDX_FUNCTIONS_LOADED'))
         require_once FORUM_ROOT.'include/search_idx.php';

      strip_search_index($post_ids);
   }

   // Delete any subscriptions for this topic
   $query = array(
      'DELETE'   => 'subscriptions',
      'WHERE'      => 'topic_id='.$topic_id
   );

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

   foreach ($forum_ids as $cur_forum_id)
      sync_forum($cur_forum_id);

   if (!empty($count_posters_posts))
   {
      foreach ($count_posters_posts as $poster_id => $count)
      {
         // Update users
         $query = array(
            'UPDATE'   => 'users',
            'SET'      => 'num_posts=num_posts-'.$count,
            'WHERE'      => 'id='.$poster_id
         );

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

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

Функция удаляет не только сообщения пользователей, тему, но и уменьшает общее количество сообщений на число ответов каждого из постеров.

17

Re: Перечень изменений вносимых в ядро движка

+ Добавлена функция уменьшения сообщений при удалении раздела форума.
Модификация области кода в файле /admin/forums.php и замена

Spoiler
      // Prune all posts and topics
      prune($forum_to_delete, 1, -1);

      delete_orphans();

      // Delete the forum and any forum specific group permissions
      $query = array(
         'DELETE'   => 'forums',
         'WHERE'      => 'id='.$forum_to_delete
      );

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

      $query = array(
         'DELETE'   => 'forum_perms',
         'WHERE'      => 'forum_id='.$forum_to_delete
      );

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

      // Delete forum subscriptions
      $query = array(
         'DELETE'   => 'forum_subscriptions',
         'WHERE'      => 'forum_id='.$forum_to_delete
      );

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

на

      // Create a list of the users ID's in this forum
      $query = array(
         'SELECT'   => 'p.poster_id',
         'FROM'      => 'posts AS p',
         'JOINS'      => array(
            array(
               'INNER JOIN'   => 'topics AS t',
               'ON'         => 't.id=p.topic_id'
            ),
            array(
               'LEFT JOIN'      => 'forums AS f',
               'ON'         => 'f.id=t.forum_id'
            )
         ),
         'WHERE'      => 'f.id='.$forum_to_delete
      );

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

      $count_posters_posts = array();
      while ($row = $forum_db->fetch_assoc($result)) {
         if (!isset($count_posters_posts[$row['poster_id']]))
            $count_posters_posts[$row['poster_id']] = 1;
         else
            $count_posters_posts[$row['poster_id']] = $count_posters_posts[$row['poster_id']] + 1;
      }

      // Prune all posts and topics
      prune($forum_to_delete, 1, -1);

      delete_orphans();

      // Delete the forum and any forum specific group permissions
      $query = array(
         'DELETE'   => 'forums',
         'WHERE'      => 'id='.$forum_to_delete
      );

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

      $query = array(
         'DELETE'   => 'forum_perms',
         'WHERE'      => 'forum_id='.$forum_to_delete
      );

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

      // Delete forum subscriptions
      $query = array(
         'DELETE'   => 'forum_subscriptions',
         'WHERE'      => 'forum_id='.$forum_to_delete
      );

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

      //Update count posts of users
      if (!empty($count_posters_posts))
      {
         foreach ($count_posters_posts as $poster_id => $count)
         {
            // Update users
            $query = array(
               'UPDATE'   => 'users',
               'SET'      => 'num_posts=num_posts-'.$count,
               'WHERE'      => 'id='.$poster_id
            );

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

18

Re: Перечень изменений вносимых в ядро движка

+ Добавлена функция уменьшения количества сообщений пользователя при удалении категории на форуме

Правка файла /admin/categories.php

Замена кода

Spoiler
      @set_time_limit(0);

      $query = array(
         'SELECT'   => 'f.id',
         'FROM'      => 'forums AS f',
         'WHERE'      => 'cat_id='.$cat_to_delete
      );

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

      $forum_ids = array();
      while ($cur_forum_id = $forum_db->fetch_assoc($result)) {
         $forum_ids[] = $cur_forum_id['id'];
      }

      if (!empty($forum_ids))
      {
         foreach ($forum_ids as $cur_forum)
         {
            // Prune all posts and topics
            prune($cur_forum, 1, -1);

            // Delete the forum
            $query = array(
               'DELETE'   => 'forums',
               'WHERE'      => 'id='.$cur_forum
            );

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

            // Delete any forum subscriptions
            $query = array(
               'DELETE'   => 'forum_subscriptions',
               'WHERE'      => 'forum_id='.$cur_forum
            );

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

      delete_orphans();

      // Delete the category
      $query = array(
         'DELETE'   => 'categories',
         'WHERE'      => 'id='.$cat_to_delete
      );

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

      // Regenerate the quickjump cache
      if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
         require FORUM_ROOT.'include/cache.php';

      generate_quickjump_cache();

на

      @set_time_limit(0);

      // Create a list of the users ID's in this forum
      $query = array(
         'SELECT'   => 'p.poster_id',
         'FROM'      => 'posts AS p',
         'JOINS'      => array(
            array(
               'INNER JOIN'   => 'topics AS t',
               'ON'         => 't.id=p.topic_id'
            ),
            array(
               'LEFT JOIN'      => 'forums AS f',
               'ON'         => 'f.id=t.forum_id'
            ),
            array(
               'LEFT JOIN'      => 'categories AS c',
               'ON'         => 'c.id=f.cat_id'
            )
         ),
         'WHERE'      => 'c.id='.$cat_to_delete
      );

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

      $count_posters_posts = array();
      while ($row = $forum_db->fetch_assoc($result)) {
         if (!isset($count_posters_posts[$row['poster_id']]))
            $count_posters_posts[$row['poster_id']] = 1;
         else
            $count_posters_posts[$row['poster_id']] = $count_posters_posts[$row['poster_id']] + 1;
      }

      $query = array(
         'SELECT'   => 'f.id',
         'FROM'      => 'forums AS f',
         'WHERE'      => 'cat_id='.$cat_to_delete
      );

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

      $forum_ids = array();
      while ($cur_forum_id = $forum_db->fetch_assoc($result)) {
         $forum_ids[] = $cur_forum_id['id'];
      }

      if (!empty($forum_ids))
      {
         foreach ($forum_ids as $cur_forum)
         {
            // Prune all posts and topics
            prune($cur_forum, 1, -1);

            // Delete the forum
            $query = array(
               'DELETE'   => 'forums',
               'WHERE'      => 'id='.$cur_forum
            );

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

            // Delete any forum subscriptions
            $query = array(
               'DELETE'   => 'forum_subscriptions',
               'WHERE'      => 'forum_id='.$cur_forum
            );

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

      delete_orphans();

      // Delete the category
      $query = array(
         'DELETE'   => 'categories',
         'WHERE'      => 'id='.$cat_to_delete
      );

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

      //Update count posts of users
      if (!empty($count_posters_posts))
      {
         foreach ($count_posters_posts as $poster_id => $count)
         {
            // Update users
            $query = array(
               'UPDATE'   => 'users',
               'SET'      => 'num_posts=num_posts-'.$count,
               'WHERE'      => 'id='.$poster_id
            );

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

      // Regenerate the quickjump cache
      if (!defined('FORUM_CACHE_FUNCTIONS_LOADED'))
         require FORUM_ROOT.'include/cache.php';

      generate_quickjump_cache();

19 (edited by PunBB 2019.05.07 14:12)

Re: Перечень изменений вносимых в ядро движка

+ Добавлена кнопка удаления прочитанных отчетов.
Измененные файлы /admin/reports.php

Добавлено:

if (isset($_POST['del_read']))
{
   $query = array(
      'DELETE'   => 'reports',
      'WHERE'      => 'zapped IS NOT NULL'
   );

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

   // Add flash message
   $forum_flash->add_info($lang_admin_reports['all_reports_deleted']);

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

   redirect(forum_link($forum_url['admin_reports']), $lang_admin_reports['all_reports_deleted']);
}

сама кнопка:

      $last_report = end($zapped_reports);
      if ($cur_report['id'] == $last_report['id'])
      {
?>
         <div>
            <div>
               <form id="arp-new-report-form" class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_reports']) ?>">
                  <div class="hidden">
                     <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_reports'])) ?>" />
                  </div>

                  <div class="frm-buttons">
                     <span class="submit"><input type="submit" name="del_read" value="<?php echo $lang_admin_reports['delete_all_reports'] ?>" /></span>
<?php ($hook = get_hook('arp_del_report_read_pre_fieldset_end')) ? eval($hook) : null; ?>
                  </div>
               </form>
            </div>
         </div>
<?php
      }

Добавленные строки в лэнг файлы:
/lang/English/admin_reports.php

//added for PanBB 1.4.6
'delete_all_reports'         => 'Delete all reports',
'all_reports_deleted'         => 'All reports have been deleted.',

20

Re: Перечень изменений вносимых в ядро движка

+ добавлена функция удаления отчетов сразу после прочтения

// Delete selected reports
if (isset($_POST['del_selected']))
{
   if (empty($_POST['reports']))
      message($lang_admin_reports['No reports selected']);

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

   $reports_to_delete = array_map('intval', array_keys($_POST['reports']));

   $query = array(
      'DELETE'   => 'reports',
      'WHERE'      => 'zapped IS NULL AND id IN('.implode(',', $reports_to_delete).')'
   );

   ($hook = get_hook('arp_del_report_selected_qr_del_reports')) ? eval($hook) : null;
   $forum_db->query_build($query) or error(__FILE__, __LINE__);
   
   // Add flash message
   $forum_flash->add_info($lang_admin_reports['selected_deleted']);

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

   redirect(forum_link($forum_url['admin_reports']), $lang_admin_reports['selected_deleted']);
}

сама кнопка

      <form id="arp-new-report-form" class="frm-form" method="post" accept-charset="utf-8" action="<?php echo forum_link($forum_url['admin_reports']) ?>">
         <div class="hidden">
            <input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['admin_reports'])) ?>" />
         </div>

         <div class="frm-buttons">
            <span class="submit primary caution"><input type="submit" name="del_read" value="<?php echo $lang_admin_reports['delete_all_reports'] ?>" /></span>
<?php ($hook = get_hook('arp_del_report_read_pre_fieldset_end')) ? eval($hook) : null; ?>
         </div>
      </form>

пару строк в ланг файлах admin_reports.php:

'delete_selected'            => 'Delete selected',
'selected_deleted'            => 'All selected reports have been deleted.',

https://punbb.softplaza.net/uploads/images/2018/03/d81359f0b6562cb0d0c718edf574f01b.png

21

Re: Перечень изменений вносимых в ядро движка

+ Ссылка на время поста заменена ссылкой на сообщение.

https://punbb.softplaza.net/uploads/images/2018/07/395b1807206813573d51c238f4805f26.png

Редактируемые области файла viewtopic.php

      // Generate the post heading
//      $forum_page['post_ident']['num'] = '<span class="post-num">'.forum_number_format($forum_page['start_from'] + $forum_page['item_count']).'</span>';
      $forum_page['post_ident']['num'] = '<span class="post-num"><a class="permalink" rel="bookmark" title="'.$lang_topic['Permalink post'].'" href="'.forum_link($forum_url['post'], $cur_post['id']).'">#'.forum_number_format($forum_page['start_from'] + $forum_page['item_count']).'</a></span>';
//      $forum_page['post_ident']['link'] = '<span class="post-link"><a class="permalink" rel="bookmark" title="'.$lang_topic['Permalink post'].'" href="'.forum_link($forum_url['post'], $cur_post['id']).'">'.format_time($cur_post['posted']).'</a></span>';
      $forum_page['post_ident']['link'] = '<span class="post-link">'.format_time($cur_post['posted']).'</span>';

22 (edited by PunBB 2018.07.12 00:20)

Re: Перечень изменений вносимых в ядро движка

+ Удалены поля социальных сетей из профиля пользователя.
+ Добавлен Русский язык
+ Внесены коррективы в анонимные функции parser.php
+ Удален апендикс index.php из урл главной страницы вызывающий дублирующие страницы.
+ Закоментирована область в header.php

$gen_elements['<!-- forum_skip -->'] = '<p id="brd-access"><a href="#brd-main">'.$lang_common['Skip to content'].'</a></p>';

Скачать бета версию можно из первого поста запросов и предложений для версии 1.4.6

$matches[2]

Исправлены подготовленные запросы БД:

Измененные файлы:

---------------------
/admin/categories.php

line 77

'WHERE'      => 'cat_id='.$cat_to_delete
---------------------------------------
/admin/groups.php

line 391

'WHERE'      => 'group_id='.intval($_POST['base_group'])

line 424

'WHERE'      => 'g_title=\''.$forum_db->escape($title).'\' AND g_id!='.$group_id
---------------------------------------
/admin/ranks.php

line 46

'WHERE'      => 'min_posts='.$min_posts

line 98

'WHERE'      => 'id!='.$id.' AND min_posts='.$min_posts
--------------------------------------
/admin/users.php

line 43

'ORDER BY'   => 'last_used DESC'

line 599

'WHERE'      => 'id IN ('.implode(',', $users).') AND id>1'
--------------------------------------
/include/common_admin.php

line 124, 126

$query['WHERE'] .= ' AND last_post<'.$prune_date;

$query['WHERE'] .= ' AND sticky=\'0\'';
----------------------------------------
/include/functions.php

line 2029, 2033

'WHERE'      => '(UPPER(username)=UPPER(\''.$forum_db->escape($username).'\') OR UPPER(username)=UPPER(\''.$forum_db->escape(preg_replace('/[^\w]/u', '', $username)).'\')) AND id>1'

$query['WHERE'] .= ' AND id!='.$exclude_id;
----------------------------------------
/include/search_functions.php

line 534

'ORDER BY'   => 'pposted DESC'
-----------------------------
/login.php

line 43, 45

$query['WHERE'] = 'username=\''.$forum_db->escape($form_username).'\'';

$query['WHERE'] = 'LOWER(username)=LOWER(\''.$forum_db->escape($form_username).'\')';
----------------------------------------
/misc.php

line 643, 766

'WHERE'      => 'user_id='.$forum_user['id'].' AND topic_id='.$topic_id

'WHERE'      => 'user_id='.$forum_user['id'].' AND forum_id='.$forum_id
------------------------------------------------------------------------
/moderate.php

line 1374, 1421

'WHERE'      => 't.id='.$stick.' AND forum_id='.$fid

'WHERE'      => 't.id='.$unstick.' AND forum_id='.$fid
----------------------------------------------------
/post.php

line 258, 567 - 568

'WHERE'      => 'id='.$qid.' AND topic_id='.$tid

'WHERE'      => 'topic_id='.$tid,
'ORDER BY'   => 'id DESC',
----------------------------------------------------

1