Читабельные ссылки на темы форума для IP.Board 2.3

Читабельные ссылки на темы форума для IP.Board 2.3

Очередной артефакт прошлого. Когда то была очень крутая модификация для IP.Board 2.3. Эта модификация позволяла преобразовывать обычные ссылки на темы внутри форума в читабельный формат с текстом. Золотое время было…

Внедрение модификации

Открыть файл ./sources/classes/bbcode/class_bbcode_core.php, найти:

$show = $url['show'];

Добавить после:

if (strpos($show, $this->ipsclass->base_url) !== false) {
  $match = array();

  if (preg_match("/showtopic=(\d+)/", $show, $match) or preg_match("/&t=(\d+)/", $show, $match)) {
    $show = $this->_getUrlLocalName('topics', $match[1]);
  }

  if (preg_match("/showforum=(\d+)/", $show, $match)) {
    $show = $this->_getUrlLocalName('forums', $match[1]);
  }

  if (preg_match("/showuser=(\d+)/", $show, $match)) {
    $show = $this->_getUrlLocalName('members', $match[1]);
  }

  if (!$show) {
    $show = $url['show'];
  }
} else

Найти:

/*-------------------------------------------------------------------------*/
// Remove sessions in a nice way
/*-------------------------------------------------------------------------*/

Добавить перед:

function _getUrlLocalName($from = '', $for = '')
{
  // Сколько раз разбирали ссылки.
  static $parsedUrls;

  // Проверка на лимит разбора ссылок, чем больше число, тем больше
  // вероятность, что злоумышленник может создать нагрузку на БД.
  if (++$parsedUrls >= 10) return false;
  if (!$from or !$for) return false;

  // Оптимизация для ссылок на форумы/разделы. Берем имя не через запрос
  // к базе, а из кэша форумов. Спасибо улетает к SAT.
  if ($from == 'forums') {
    return $this->ipsclass->cache['forum_cache'][$for]['name'];
  }

  // 'pk' - имя первичного ключа (id'ентификатора) в таблице.
  // 'fieldName' - имя поля в таблице, в котором хранится возвращаемое имя.
  $pk = 'id';           // В большинстве случаев имя первичного ключа - 'id'.
  $fieldName = 'name';  // Имя поля - 'name'.

  // Однако в случае с темами у нас другие 'pk' и 'fieldName'.
  if ($from == 'topics') {
    $pk = 'tid';          // Имя первичного ключа - 'tid'.
    $fieldName = 'title'; // Имя поля с названием - 'title'.
  }

  // Однако в случае с пользователями у нас другое 'fieldName'.
  if ($from == 'members') {
    $fieldName = 'members_display_name'; // Имя поля с названием - 'members_display_name'.
  }

  $this->ipsclass->DB->simple_select($fieldName, $from, $pk . "= '" . $for . "'");
  $ci = $this->ipsclass->DB->exec_query();
  $row = $this->ipsclass->DB->fetch_row($ci);

  if ($fieldValue = $row[$fieldName]) {
    return $fieldValue;
  }

  return false;
}
Категории
Авторы
Мета
Лицензия
ID файла
UUID
Системный путь
Тип
Статистика
Количество слов
Время чтения
мин.
Размер
kB