Migrate a phpBB3 forum to Discourse

Markdown также должен работать, но, думаю, использование <strong> может обойти ещё больше крайних случаев. Обратите внимание, что смешивание HTML и Markdown тоже имеет свои подводные камни… Вот простое решение на Markdown:

**multiline\
\
text**

Мне интересно, из какой версии phpBB вы импортируете? Конвертация BBCode в Markdown значительно лучше в версии 3.2 по сравнению с предыдущими. В идеале вы больше не должны видеть [b] в импортированных сообщениях.

2 лайка

Думаю, ты прав, не понимаю, почему я сразу об этом не подумал…

Я мигрирую с phpBB 3.0.7-PL1.

2 лайка

Вы значительно облегчите себе задачу, если обновитесь до версии 3.2 перед импортом. :wink:

Убедитесь, что все BBC-коды в сообщениях перенесены в новый формат хранения, запустив парсер текста phpBB: https://www.phpbb.com/support/docs/en/3.3/kb/article/phpbb-32%2B-text-reparser/

3 лайка

Я думал об этом в самом начале, но… я ненавижу компьютерные дела :sweat_smile:
Я плохо знаком с phpBB и не хотел брать на себя ответственность за любые ошибки, которые могли бы возникнуть при обновлении с такой старой версии.

Поскольку скрипт миграции в Discourse совместим с phpBB 3.0, я решил не обновлять phpBB…
Возможно, некоторые проблемы с bbcode, с которыми я столкнулся, удалось бы избежать при обновлении phpBB. Такие вещи, как вложенные списки, [b] с переносами строк и т. д…:man_shrugging:

Но так как я начал работу над импортом в декабре, я уже почти добился успешного импорта (в идеале новый форум будет запущен примерно через две недели…), и я не уверен, что хочу сейчас экспериментировать с обновлением phpBB, особенно если мне придётся пересматривать все мои кастомные исправления импорта, чтобы проверить, справляется ли импортер phpBB 3.2 с этими вещами лучше :sweat_smile:. Это займёт много времени.

Тем не менее… я мог бы поэкспериментировать с этим в выходные во второй половине дня, если мне будет достаточно скучно!


edit: Я попробовал; переезд на новый сервер и последующее обновление до phpBB 3.2 — это сплошная головная боль. Проблемы с HTTPS. Проблемы с кэшем. Другие проблемы. Запутанные и раздражающие процедуры. Официальная инструкция рекомендует использовать инструменты, требующие устаревшей версии PHP (эй, PHP 5, давно не виделись…). Похоже, иногда мне бывает скучно, но не до безумия — по крайней мере, не настолько, чтобы заниматься подобными вещами.

Герхард! Ты вводишь в заблуждение! Обновление до 3.2 — это не одолжение! :laughing:

Но хватит говорить о самом phpBB… И восславим одношаговое обновление в Discourse.

1 лайк

Привет,

Я пытаюсь мигрировать пользователей WordPress в Discourse. Мне удалось следовать инструкциям по подключению к нашей базе данных WordPress и импортировать пользователей в контейнере Docker. Я хочу убедиться, что во время или после миграции не будут отправляться письма, так как мы используем плагин SSO для WordPress.

Я добавил префикс «import_» к адресам электронной почты, чтобы пользователи не получали письма в случае фоновых задач, отправляющих подтверждение по электронной почте после завершения миграции.

Я вижу, что после миграции установлен столбец last_emailed_at:

Я знаю, что он устанавливается с помощью opts[:last_emailed_at] = opts.fetch(:last_emailed_at, Time.now) в функции ImportScripts::Base::create_user().

Существует ли аналогичная функция для admin.email_tokens.update_all(confirmed: true), используемая в ImportScripts::Base::create_admin, которая подтверждает электронную почту?

Я не вижу никаких записей в логах о том, что письма были отправлены. Были ли письма действительно отправлены? Будет ли Discourse пытаться отправлять письма после того, как я изменю адреса на действительные?

1 лайк

Это оффтопик, так как тема посвящена миграции phpBB3… :wink:

Если вы хотите гарантировать, что некоторые пользователи никогда не получат письма, рекомендую использовать домен .invalid (например, foo@mywpimport.invalid). Однако, если ваша цель — просто отключить исходящую рассылку до момента готовности, лучший вариант — установить параметр сайта disable_emails в значение «yes» или «non-staff»!

Исходящие письма автоматически отключаются во время импорта. Значения атрибута last_emailed_at, вероятно, возникли из-за попыток Discourse отправить письмо до того, как система обнаружила, что это запрещено.

После завершения миграции Discourse обязательно попытается отправить письма.

2 лайка

Спасибо. Сначала я попробовал пустую строку для поля электронной почты, и базовый класс ImportScript сгенерировал поддельные адреса с недопустимым доменом. У них также установлен атрибут last_emailed_at.

Получается, что как только я исправлю электронную почту в базе данных, Discourse попытается отправить письмо? Но обычный вход через WordPress с аутентификацией не требует подтверждения по электронной почте. Нет ли способа обойти это с помощью ImportScript?

1 лайк

Моя миграция завершена и прошла успешно.
Однако у меня возникло две проблемы. Скажите, пожалуйста, не выходит ли это за рамки темы.

  1. В содержании некоторых постов встречается такой код:

    [url=https://www.casimages.com/i/1907271141431956116331631.jpg.html][ 
    [img]https://nsm09.casimages.com/img/2019/07/27//1907271141431956116331631.jpg[/img][/url]
    

    Изображения отображаются в предпросмотре, но в самом посте они разбиты (не отображаются), даже после перестроения HTML:

    Сгенерированный HTML для каждого изображения выглядит так:

    <p><a href="https://www.casimages.com/i/1907271151181956116331666.jpg.html" data-bbcode="true"><span alt="" class="broken-image" title="This image is broken"><svg class="fa d-icon d-icon-unlink svg-icon" aria-hidden="true"><use href="#unlink"></use></svg></span></a></p>
    

    Я сталкиваюсь с этой проблемой во многих постах. Есть ли у вас идея, как исправить это глобально?

  2. Как и на многих старых форумах, ссылки на Imageshack уже давно и навсегда перестали работать. Однако некоторые ссылки теперь отображают флаг Украины вместо пустоты:

    Как бы вы поступили в такой ситуации?

Я открыт для любых идей, но администратор форума имеет статическую резервную копию всего форума на старом жестком диске, где большинство старых изображений корректны (поскольку они были загружены и сохранены локально). Я думаю, что в будущем могу написать скрипт, который заменит все «мертвые» ссылки Imageshack на корректные изображения из статической копии. Это кажется очень сложной задачей, но именно поэтому я не уверен, что хочу просто удалить все ссылки Imageshack с форума, заменив их на пустую строку или что-то подобное.

1 лайк

Думаю, проблема именно в переносе строки. Вам нужно перенастроить эти BB-коды, чтобы убрать перенос строки. Статья Replace a string in all posts может помочь.

Может быть, пока преобразовать их в HTML-комментарии? Позже их можно будет заменить на сохранённые изображения.

2 лайка

Похоже, что это не проблема:
Я добавил переносы строк, чтобы содержимое выглядело так:

[url=https://www.casimages.com/i/1907271141431956116331631.jpg.html]

[img]https://nsm09.casimages.com/img/2019/07/27//1907271141431956116331631.jpg[/img]

[/url]

И результат:

Примеры постов:

Да, отличная идея! :+1: То есть, по сути, заменять строки (из темы, на которую вы дали ссылку) с помощью регулярных выражений, чтобы нацеливаться только на ссылки Imageshack, верно?

2 лайка

Так что, после экспериментов с новыми строками, оказывается, что это не проблема.

Но если я копирую и вставляю содержимое сообщения в новое сообщение на том же форуме, содержимое отображается корректно :woozy_face: :question: :


(и даже горячие ссылки на изображения успешно загружаются локально)

В отличие от:

Я попробовал перекомпилировать сообщение с битыми изображениями (которые корректно отображаются в предпросмотре сообщения, см. моё предыдущее сообщение), но это ничего не исправило.

Насколько мне известно, исходное содержимое обоих сообщений абсолютно одинаково.

Но обработанное содержимое первого сообщения (вторая строка) приводит к битым изображениям:

Я в замешательстве.

1 лайк

Странная ситуация:
Если я пытаюсь пересобрать HTML любого сообщения, получаю ошибку 500:

В логах отображается фатальная ошибка и предупреждение:

Скриншот окна логов:

Фатальная ошибка:

ArgumentError (wrong number of arguments (given 0, expected 1)) lib/guardian/ensure_magic.rb:11:in 'method_missing' app/controllers/posts_controller.rb:570:in 'rebake' app/controllers/application_cont

plugins/discourse-chat/lib/guardian_extensions.rb:71:in `can_rebake?'
lib/guardian/ensure_magic.rb:11:in `method_missing'
app/controllers/posts_controller.rb:570:in `rebake'
actionpack (6.1.4.1) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (6.1.4.1) lib/abstract_controller/base.rb:228:in `process_action'
actionpack (6.1.4.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (6.1.4.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (6.1.4.1) lib/active_support/callbacks.rb:117:in `block in run_callbacks'
app/controllers/application_controller.rb:397:in `block in with_resolved_locale'
i18n (1.10.0) lib/i18n.rb:328:in `with_locale'
app/controllers/application_controller.rb:397:in `with_resolved_locale'
activesupport (6.1.4.1) lib/active_support/callbacks.rb:126:in `block in run_callbacks'
activesupport (6.1.4.1) lib/active_support/callbacks.rb:137:in `run_callbacks'
actionpack (6.1.4.1) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (6.1.4.1) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (6.1.4.1) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (6.1.4.1) lib/active_support/notifications.rb:203:in `block in instrument'
activesupport (6.1.4.1) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport (6.1.4.1) lib/active_support/notifications.rb:203:in `instrument'
actionpack (6.1.4.1) lib/action_controller/metal/instrumentation.rb:33:in `process_action'
actionpack (6.1.4.1) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
activerecord (6.1.4.1) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack (6.1.4.1) lib/abstract_controller/base.rb:165:in `process'
actionview (6.1.4.1) lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler (3.0.0) lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack (6.1.4.1) lib/action_controller/metal.rb:190:in `dispatch'
actionpack (6.1.4.1) lib/action_controller/metal.rb:254:in `dispatch'
actionpack (6.1.4.1) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack (6.1.4.1) lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack (6.1.4.1) lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack (6.1.4.1) lib/action_dispatch/journey/router.rb:32:in `each'
actionpack (6.1.4.1) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (6.1.4.1) lib/action_dispatch/routing/route_set.rb:842:in `call'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.3) lib/rack/conditional_get.rb:40:in `call'
rack (2.2.3) lib/rack/head.rb:12:in `call'
actionpack (6.1.4.1) lib/action_dispatch/http/permissions_policy.rb:22:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:358:in `call'
rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/cookies.rb:689:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport (6.1.4.1) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (6.1.4.1) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
logster (2.10.1) lib/logster/middleware/reporter.rb:43:in `call'
railties (6.1.4.1) lib/rails/rack/logger.rb:37:in `call_app'
railties (6.1.4.1) lib/rails/rack/logger.rb:28:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/request_id.rb:26:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
rack (2.2.3) lib/rack/method_override.rb:24:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
rack (2.2.3) lib/rack/sendfile.rb:110:in `call'
actionpack (6.1.4.1) lib/action_dispatch/middleware/host_authorization.rb:92:in `call'
rack-mini-profiler (3.0.0) lib/mini_profiler/profiler.rb:249:in `call'
message_bus (4.2.0) lib/message_bus/rack/middleware.rb:60:in `call'
lib/middleware/request_tracker.rb:202:in `call'
railties (6.1.4.1) lib/rails/engine.rb:539:in `call'
railties (6.1.4.1) lib/rails/railtie.rb:207:in `public_send'
railties (6.1.4.1) lib/rails/railtie.rb:207:in `method_missing'
rack (2.2.3) lib/rack/urlmap.rb:74:in `block in call'
rack (2.2.3) lib/rack/urlmap.rb:58:in `each'
rack (2.2.3) lib/rack/urlmap.rb:58:in `call'
unicorn (6.1.0) lib/unicorn/http_server.rb:634:in `process_client'
unicorn (6.1.0) lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn (6.1.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn (6.1.0) lib/unicorn/http_server.rb:143:in `start'
unicorn (6.1.0) bin/unicorn:128:in `<top (required)>'
vendor/bundle/ruby/2.7.0/bin/unicorn:25:in `load'
vendor/bundle/ruby/2.7.0/bin/unicorn:25:in `<main>'

Это происходило в режиме safe-mode, когда все темы и плагины были отключены, но в этом блоке кода на первой строке упоминается:
plugins/discourse-chat/lib/guardian_extensions.rb:71:in 'can_rebake?'

Предупреждение:

Failed to handle exception in exception app middleware : ArgumentError : wrong number of arguments (given 0, expected 1)

/var/www/discourse/plugins/discourse-chat/lib/guardian_extensions.rb:71:in `can_rebake?'
/var/www/discourse/lib/guardian/ensure_magic.rb:11:in `method_missing'
/var/www/discourse/app/controllers/posts_controller.rb:570:in `rebake'
actionpack-6.1.4.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack-6.1.4.1/lib/abstract_controller/base.rb:228:in `process_action'
actionpack-6.1.4.1/lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack-6.1.4.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport-6.1.4.1/lib/active_support/callbacks.rb:117:in `block in run_callbacks'
/var/www/discourse/app/controllers/application_controller.rb:397:in `block in with_resolved_locale'
i18n-1.10.0/lib/i18n.rb:328:in `with_locale'
/var/www/discourse/app/controllers/application_controller.rb:397:in `with_resolved_locale'
activesupport-6.1.4.1/lib/active_support/callbacks.rb:126:in `block in run_callbacks'
activesupport-6.1.4.1/lib/active_support/callbacks.rb:137:in `run_callbacks'
actionpack-6.1.4.1/lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack-6.1.4.1/lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack-6.1.4.1/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport-6.1.4.1/lib/active_support/notifications.rb:203:in `block in instrument'
activesupport-6.1.4.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport-6.1.4.1/lib/active_support/notifications.rb:203:in `instrument'
actionpack-6.1.4.1/lib/action_controller/metal/instrumentation.rb:33:in `process_action'
actionpack-6.1.4.1/lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
activerecord-6.1.4.1/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack-6.1.4.1/lib/abstract_controller/base.rb:165:in `process'
actionview-6.1.4.1/lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler-3.0.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack-6.1.4.1/lib/action_controller/metal.rb:190:in `dispatch'
actionpack-6.1.4.1/lib/action_controller/metal.rb:254:in `dispatch'
actionpack-6.1.4.1/lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack-6.1.4.1/lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack-6.1.4.1/lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack-6.1.4.1/lib/action_dispatch/journey/router.rb:32:in `each'
actionpack-6.1.4.1/lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack-6.1.4.1/lib/action_dispatch/routing/route_set.rb:842:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
rack-2.2.3/lib/rack/tempfile_reaper.rb:15:in `call'
rack-2.2.3/lib/rack/conditional_get.rb:40:in `call'
rack-2.2.3/lib/rack/head.rb:12:in `call'
actionpack-6.1.4.1/lib/action_dispatch/http/permissions_policy.rb:22:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:358:in `call'
rack-2.2.3/lib/rack/session/abstract/id.rb:266:in `context'
rack-2.2.3/lib/rack/session/abstract/id.rb:260:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/cookies.rb:689:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport-6.1.4.1/lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack-6.1.4.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
logster-2.10.1/lib/logster/middleware/reporter.rb:43:in `call'
railties-6.1.4.1/lib/rails/rack/logger.rb:37:in `call_app'
railties-6.1.4.1/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:23:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/request_id.rb:26:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:23:in `call'
rack-2.2.3/lib/rack/method_override.rb:24:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/executor.rb:14:in `call'
rack-2.2.3/lib/rack/sendfile.rb:110:in `call'
actionpack-6.1.4.1/lib/action_dispatch/middleware/host_authorization.rb:92:in `call'
rack-mini-profiler-3.0.0/lib/mini_profiler/profiler.rb:249:in `call'
message_bus-4.2.0/lib/message_bus/rack/middleware.rb:60:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:202:in `call'
railties-6.1.4.1/lib/rails/engine.rb:539:in `call'
railties-6.1.4.1/lib/rails/railtie.rb:207:in `public_send'
railties-6.1.4.1/lib/rails/railtie.rb:207:in `method_missing'
rack-2.2.3/lib/rack/urlmap.rb:74:in `block in call'
rack-2.2.3/lib/rack/urlmap.rb:58:in `each'
rack-2.2.3/lib/rack/urlmap.rb:58:in `call'
unicorn-6.1.0/lib/unicorn/http_server.rb:634:in `process_client'
unicorn-6.1.0/lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn-6.1.0/lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn-6.1.0/lib/unicorn/http_server.rb:143:in `start'
unicorn-6.1.0/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/unicorn:25:in `load'
/var/www/discourse/vendor/bundle/ruby/2.7.0/bin/unicorn:25:in `<main>'

Помогут ли эти данные?
Я делаю всё возможное, чтобы попытаться исправить эти сообщения, но начинаю полагать, что проблема связана с самим Discourse, а не с моими настройками? :person_shrugging:


edit: см. автоматически связанное сообщение ниже.


Проблема решена:

Теперь мне осталось только пересобрать все мои сообщения. :wink:


Ещё одно редактирование:

Это наверняка могло бы сработать, и сработает для изображений, у которых всё ещё есть старые прямые URL-адреса, но:

  • Поскольку все старые нерабочие ссылки на Imageshack были заменены действительными изображениями с флагом Украины, которые отображаются самим Imageshack, они были автоматически загружены в Discourse, изменив свой URL на локальную ссылку на изображение в формате Markdown.

  • К счастью, все эти флаги были загружены в Discourse с идентичными ссылками (![](upload://sOlmOE8qRgLUJ8cCe6N1JNkDV3Y.jpeg) в моём случае — отличное поведение Discourse, кстати :+1:), что означает, что их будет очень легко найти и удалить/заменить чем-то другим. :slight_smile:

Я просто пишу это, чтобы проинформировать людей, которые столкнутся с той же проблемой, что и я, после миграции.

4 лайка

Похоже, значение poll_option_total иногда некорректно. Я вижу больше неанонимных голосов за вариант, чем значение poll_option_total. И все эти пользователи существуют.

Использование GREATEST(..., 0) исправляет это. По крайней мере, теперь это не вызывает сбоев.

        SELECT o.poll_option_id, o.poll_option_text, o.poll_option_total AS total_votes,
          GREATEST(CAST(o.poll_option_total AS SIGNED) - (
            SELECT COUNT(DISTINCT v.vote_user_id)
              FROM #{@table_prefix}poll_votes v
                JOIN #{@table_prefix}users u ON (v.vote_user_id = u.user_id)
                JOIN #{@table_prefix}topics t ON (v.topic_id = t.topic_id)
              WHERE v.poll_option_id = o.poll_option_id AND v.topic_id = o.topic_id
          ),0) AS anonymous_votes
        FROM #{@table_prefix}poll_options o
        WHERE o.topic_id = #{topic_id}
        ORDER BY o.poll_option_id
3 лайка

Я очень хочу перенести форум phpBB 3.3 моей компании на Discourse. У кого-нибудь есть информация, когда это будет поддерживаться?

1 лайк
3 лайка

Ого, это здорово! Спасибо!

1 лайк

Если мне стоит создать новую тему для этого, приношу извинения заранее.

У меня есть phpBB-форум в подпапке:

thedomain.com/forum/

Я планирую использовать скрипт импорта для миграции с phpBB на Discourse в поддомене, то есть:

forum.thedomain.com

Похоже, всё, что мне нужно будет сделать для домена и постоянных ссылок, — это установить следующее в settings.yml, используя HTTPS на новом сайте:

site_prefix:
    # это необходимо для переписывания внутренних ссылок в постах
    original: thdomain.com/forum    # без http(s)://
    new: https://forum.thedomain.com       # с http:// или https://

  # Включите это, если хотите перенаправлять старые ссылки форума на новые места.
  permalinks:
    categories: true  # перенаправление /viewforum.php?f=1            на /c/category-name
    topics: true      # перенаправление /viewtopic.php?f=6&t=43       на /t/topic-name/81
    posts: true      # перенаправление /viewtopic.php?p=2455#p2455   на /t/topic-name/81/4
    # Добавьте префикс к каждому типу ссылки, например 'forum', чтобы перенаправлять /forum/viewtopic.php?f=6&t=43 на /t/topic-name/81
    # Оставьте пустым, если ваш форум был установлен не в подпапке.
    prefix: forum

А затем на исходном сервере, где работает Apache, в файле .htaccess, где RewriteEngine уже включён, мне понадобится:

RewriteCond %{HTTP_HOST} ^thedomain.com
RewriteRule ^forum/(.*)$ https://forum.thedomain.com/$1 [L,R=301]

Если всё действительно так просто, этот скрипт — просто супер! :grinning:

У меня есть ещё несколько дополнительных вопросов:

  1. В настройках постоянных ссылок для постов установлено значение “false”. Я знаю, что в интернете есть ссылки на конкретные посты, поэтому хотел бы, чтобы они тоже имели постоянные ссылки. Есть ли какая-то причина не устанавливать их в true, например, проблемы с производительностью или что-то подобное?
  2. Подходит ли префикс без одинарных кавычек, или его следует заключить в кавычки, как в комментарии?
2 лайка

Это немного замедлит импорт, но вам не стоит об этом беспокоиться. По умолчанию это в основном отключено, потому что это редко требуется.

Да, это нормально.

2 лайка

Я столкнулся с трудностью при подготовке к этому импорту.

Форум phpBB, который я планирую мигрировать, использует кастомный BB-код, который создаёт HTML-теги <img> для изображений, хранящихся в папках по годам в директории вне phpBB, но на той же учётной записи сервера. Формат BB-кода следующий:

[Gallery]{NUMBER1}|{NUMBER2}|{NUMBER3}|{SIMPLETEXT}[/Gallery]

Здесь {NUMBER1} и {NUMBER2} — целые числа, обозначающие ширину и высоту изображения соответственно. {NUMBER3} — целое число, указывающее на папку года, в которой находится изображение, а {SIMPLETEXT} — имя файла изображения. Замена этого BB-кода на HTML выглядит так:

<img class="postimage gallery-image" src="/gallery/files/{NUMBER3}/{SIMPLETEXT}" width="{NUMBER1}" height="{NUMBER2}" />

Мне нужно понять, как обработать этот кастомный BB-код в скрипте миграции: как преобразовать его в формат, понятный Discourse, и где разместить файлы изображений в файловой структуре для импорта.

Я изучил библиотеку Ruby-BBcode-to-MD, которая, как утверждается, «позволяет легко расширять этот набор кастомными тегами, редактируя файл tags.rb». Я посмотрел на tags.rb, но поскольку это мой первый опыт работы с кодом на Ruby, я не знаю, как справиться с моим кастомным BB-кодом, так как его формат с разделителями в виде вертикальных черт отличается от любого официального BB-кода, включённого в файл tags.rb, который мог бы послужить мне ориентиром.

У меня ещё не загружен файл templates/import/phpbb3.template.yml, поэтому я предполагаю, что именно он добавляет gem Ruby BBcode to MD?

Итак, у меня есть вопросы:

  1. Какой лучший способ обработать этот кастомный BB-код при миграции? Стоит ли редактировать файл tags.rb? (Если да, то я проведу исследование по программированию на Ruby и, возможно, регулярным выражениям, но любые подсказки будут приветствоваться!)
  2. Где лучше всего разместить файлы изображений для этой галереи в файловой структуре импорта, чтобы они были сохранены в Discourse и отображались в импортированных сообщениях?
1 лайк

Этот gem больше не используется. Из какой версии phpBB вы импортируете? Если это v3.1 или ниже, вам нужно будет применить некоторые регулярные выражения в файле discourse/script/import_scripts/phpbb3/support/text_processor.rb at ea2fd75d10e81687334f8d29e0d3e786dbdb4a53 · discourse/discourse · GitHub.

Для v3.2 вы можете добавить обработку BBCode в файле discourse/script/import_scripts/phpbb3/support/bbcode/xml_to_markdown.rb at a71b219c9a18ad418e330282fde511bcb79ba7c4 · discourse/discourse · GitHub

2 лайка