Я попытался реализовать это сегодня, но столкнулся с несколькими проблемами:
- В сообщении форума сгенерированный URL (из discourseEmbedUrl?) приводится к нижнему регистру (lowercased()), что нарушает работу чувствительных к регистру URL в ссылке, следующей за текстом «Это тема для обсуждения, связанная с оригинальной записью по адресу …».
- При первой загрузке страницы встраиваемый блок отображает «Загрузка обсуждения…» и зависает. При второй загрузке всё работает корректно.
- «Тряска» страницы: когда iframe загружается, он имеет высоту по умолчанию, но если комментариев не найдено, высота уменьшается до одной строки с надписью «Начать обсуждение». Это усугубляет проблему с зависанием «Загрузка обсуждения…», так как удерживает большую вертикальную высоту.
- Было бы неплохо, если бы данные, извлекаемые из родительского элемента embed, отдавали предпочтение мета-тегу вместо преобразования всей страницы в текст. Предполагаю, это более общая особенность поведения Discourse.
Самым большим сюрпризом стало то, что при каждом посещении URL со встроенным обсуждением создается новая тема. Это указано в исходном посте (OP):
Единственное решение, которое я могу придумать, довольно хаковое и полагается на краткосрочный SSR/кэширование для опроса конечной точки embed:
Поэтому, думаю, логика должна быть следующей:
-
Проверить
$discourse/embed/info?embed_url=$link. -
Если тема существует, показать embed как обычно.
-
Если нет, показать кнопку «Начать разговор», ведущую по ссылке
$discourse/new-topic?subject=$link.
Сработает ли это, или необходимо реализовать какую-то другую связку?