Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

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

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

Генерация случайных чисел через BB-код

Добрый день!

Несколько недель бьюсь над задачей: нужно создать BB-код, который бы выводил заданное количество случайных целых чисел в некотором промежутке. Он должен выглядеть примерно вот так:

[rand]3 from 1 to 100[/rand]

Если в скрипте просто использовать функцию mt_rand() или rand(), то возникает проблема: выпавшие значения сохраняются на какое-то время, но после обновления кэша они меняются, т.к. парсер заново обрабатывает текст сообщения и заново генерирует случайные числа.

Чтобы избежать этого, можно задать исходное число для генератора случайных чисел (seed), тогда каждый раз последовательность случайных чисел будет одной и той же. При этом для каждого форумного поста это исходное число должно быть уникальным. Было бы идеально для этого брать ID поста. Есть ли какой-нибудь способ, как в класс кастомного BB-кода можно вытянуть ID поста, текст которого сейчас обрабатывается?

Какие были идеи:

1) Можно было бы попробовать сделать запрос к базе данных типа 

SELECT pid FROM posts WHERE post = $txt;

где $txt - текст поста, подающийся для парсинга в класс BB-кода. Однако текст для парсинга BB-кода и текст поста в базе данных отличаются друг от друга, надо будет его дополнительно обрабатывать, это проблематично.

2) Можно было бы попробовать через $request. Если создается новый пост (или топик), то выясняем это через через значение поля "do", и тогда ID нового поста можно узнать через запрос к базе данных:

SELECT MAX[pid] FROM posts;

к которому прибавляем единицу. Но мне непонятно, насколько это долговечный способ и что будет с итоговыми случайными значениями при обновлении кэша. Возможно, этот способ можно скомбинировать с каким-то другим: при создании поста делаем так, а потом добываем ID поста как-то иначе.

3) Можно было бы попробовать передавать ID поста из класса в класс через сигнатуры методов с самого начала, но тут надо хорошо разбираться в устройстве форума, чтобы ничего не поломать.

Может быть, у этой задачи есть какое-то простое и элегантное решение? Может быть, можно вообще не заморачиваться с определением ID поста и брать какое-нибудь другое уникальное число?

Рекомендованные сообщения

Как вариант записать в таблицу posts сразу отпарсенный ббкод, который в дальнейшем будет хранится как обычный текст и повторно не будет парсится. Ведь это уникальное число для форума и оно не должно меняться. Только обработать пост придется наверное не через ббкоды, а хуком перед или после записи в бд и возможно перед отображением.
 

2 часа назад, Matias Nemo сказал:

Может быть, у этой задачи есть какое-то простое и элегантное решение?

Может быть можно обойтись и без ббкода? Зачем вам это случайное число в сообщение?

Чем-то похоже на 

 

Создайте аккаунт или войдите в него для комментирования

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.