Сообщества с встроенными лентами Twitter

Привет,

Интересует, знает ли кто-нибудь о сообществах Discourse, в которые встроена лента Twitter? Я прочитал несколько тем на эту тему, но хотел бы увидеть примеры, чтобы ознакомиться с ними.

Заранее спасибо!

Чтобы увидеть это, необходимо зарегистрироваться, так как я удалил это из темы по умолчанию, поскольку оно нарушало отображение страницы для пользователей, не авторизованных в системе. Создайте аккаунт и выберите тёмную или светлую тему в меню-гамбургере, чтобы увидеть это в действии. Если же вы не хотите регистрироваться, вот скриншот:

Спасибо, @smrtey! Я зарегистрируюсь, чтобы посмотреть поближе, но скриншот выглядит отлично!

Выглядит отлично. Не могли бы вы рассказать, как вы это сделали, если вам не сложно?

Мой коллега создал скрипт и переопределил шаблон для боковой панели, а я просто добавил ленту Twitter и несколько файлов cookie. Он сказал, что я могу опубликовать скрипт здесь, так что вот он с добавленными элементами Twitter и CSS.

edit: Хорошо, это он ниже, так что я оставлю это ему.

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

OK, это должно обеспечить встраивание ленты Twitter в левую боковую панель на всех страницах списков. Вам нужно отредактировать строку 60, добавив HTML-код, соответствующий временной шкале, которую вы хотите встроить.

  1. Перейдите на эту страницу Twitter, введите то, что вы хотите встроить (например, https://twitter.com/TwitterDev), и нажмите «Встроенная временная шкала».

  2. Вы получите код вроде этого:
    <a class="twitter-timeline" href="https://twitter.com/TwitterDev?ref_src=twsrc%5Etfw">Твиты от TwitterDev</a> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

  3. Удалите часть <script>, чтобы у вас остался только:
    <a class="twitter-timeline" href="https://twitter.com/SampleTwitterUser?ref_src=twsrc%5Etfw">Твиты от SampleTwitterUser</a>

  4. Вставьте это в строку 60 ниже, заменив XXXXXXXXXX.

Добавьте это в Desktop - </head>.

<script>
         window.twttr = (function(d, s, id) {
             var js, fjs = d.getElementsByTagName(s)[0],
                 t = window.twttr || {};
             if (d.getElementById(id)) return t;
             js = d.createElement(s);
             js.id = id;
             js.src = "https://platform.twitter.com/widgets.js";
             fjs.parentNode.insertBefore(js, fjs);
             t._e = [];
             t.ready = function(f) {
                 t._e.push(f);
             };
             return t;
         }
         (document, "script", "twitter-wjs"));
</script>
<script type="text/discourse-plugin" version="0.8">
     api.onPageChange(() => {
            twttr.widgets.load( document.getElementById("twitter-sidebar") );
     });
</script>

<script type="text/x-handlebars" data-template-name="discovery/topics">
    {{#if redirectedReason}}
      <div class="alert alert-info">{{redirectedReason}}</div>
    {{/if}}
    
    {{#if showDismissAtTop}}
      <div class="row">
        {{#if showDismissRead}}
          <button title="{{i18n 'topics.bulk.dismiss_tooltip'}}" id='dismiss-topics-top' class='btn btn-default dismiss-read' {{action "dismissReadPosts"}}>{{i18n 'topics.bulk.dismiss_button'}}</button>
        {{/if}}
        {{#if showResetNew}}
        <button id='dismiss-new-top' class='btn btn-default dismiss-read' {{action "resetNew"}}>{{d-icon "check"}} {{i18n 'topics.bulk.dismiss_new'}}</button>
        {{/if}}
      </div>
    {{/if}}
    
    {{#if model.sharedDrafts}}
      {{topic-list
        class="shared-drafts"
        listTitle="shared_drafts.title"
        top=top
        hideCategory="true"
        category=category
        topics=model.sharedDrafts
        discoveryList=true}}
    {{/if}}
    
    {{bulk-select-button selected=selected action=(action "refresh") category=category}}


    <!-- ***********************************************************************
        Это единственная часть шаблона, которая меняется.
        Вам нужно заменить XXXXXXXXXX ниже на ссылку, предоставленную Twitter на этой странице, но без части <script>:
        https://help.twitter.com/en/using-twitter/embed-twitter-feed
    ************************************************************************* -->
    <div id="sidebar">
      XXXXXXXXXX
      <div id="twitter-sidebar"></div>
    </div>



    {{#discovery-topics-list model=model refresh=(action "refresh") incomingCount=topicTrackingState.incomingCount}}
      {{#if top}}
        <div class='top-lists'>
          {{period-chooser period=period action=(action "changePeriod")}}
        </div>
      {{else}}
        {{#if topicTrackingState.hasIncoming}}
          <div class="show-more {{if hasTopics 'has-topics'}}">
            <div class='alert alert-info clickable' {{action "showInserted"}}>
              <a tabindex="0" href="" {{action "showInserted"}}>
                {{count-i18n key="topic_count_" suffix=topicTrackingState.filter count=topicTrackingState.incomingCount}}
              </a>
            </div>
          </div>
        {{/if}}
      {{/if}}
    
      {{#if hasTopics}}
        {{topic-list
          highlightLastVisited=true
          top=top
          showTopicPostBadges=showTopicPostBadges
          showPosters=true
          canBulkSelect=canBulkSelect
          changeSort=(action "changeSort")
          toggleBulkSelect=(action "toggleBulkSelect")
          hideCategory=model.hideCategory
          order=order
          ascending=ascending
          bulkSelectEnabled=bulkSelectEnabled
          selected=selected
          expandGloballyPinned=expandGloballyPinned
          expandAllPinned=expandAllPinned
          category=category
          topics=model.topics
          discoveryList=true}}
      {{/if}}
    {{/discovery-topics-list}}

    <footer class='topic-list-bottom'>
      {{conditional-loading-spinner condition=model.loadingMore}}
      {{#if allLoaded}}
        {{#if showDismissRead}}
          <button title="{{i18n 'topics.bulk.dismiss_tooltip'}}" id='dismiss-topics' class='btn btn-default dismiss-read' {{action "dismissReadPosts"}}>{{i18n 'topics.bulk.dismiss_button'}}</button>
        {{/if}}
        {{#if showResetNew}}
          <button id='dismiss-new' class='btn btn-default dismiss-read' {{action "resetNew"}}>
            {{d-icon "check"}} {{i18n 'topics.bulk.dismiss_new'}}</button>
        {{/if}}
    
        {{#footer-message education=footerEducation message=footerMessage}}
          {{#if latest}}
            {{#if canCreateTopicOnCategory}}<a href {{action "createTopic"}}>{{i18n 'topic.suggest_create_topic'}}</a>{{/if}}
          {{else if top}}
            {{#link-to "discovery.categories"}}{{i18n 'topic.browse_all_categories'}}{{/link-to}}, {{#link-to 'discovery.latest'}}{{i18n 'topic.view_latest_topics'}}{{/link-to}} {{i18n 'or'}} {{i18n 'filters.top.other_periods'}}
            {{top-period-buttons period=period action=(action "changePeriod")}}
          {{else}}
            {{#link-to "discovery.categories"}} {{i18n 'topic.browse_all_categories'}}{{/link-to}} {{i18n 'or'}} {{#link-to 'discovery.latest'}}{{i18n 'topic.view_latest_topics'}}{{/link-to}}
          {{/if}}
        {{/footer-message}}
    
      {{/if}}
    </footer>
</script>

Затем добавьте это в Desktop - CSS:

topic-list {
    width: auto;
}
#sidebar {
    width: 28%;
    float: left;
    margin-right: 20px;
    position: relative;
    z-index: 1;
}
@media (max-width: 900px) {
    #sidebar {
        display: none !important;
    }    
}

Это должно сработать, но на вашем сайте может быть другой CSS, чем у нас, поэтому я не могу гарантировать, что результат будет идеальным для всех.}

Для отображения временной шкалы у неавторизованных пользователей требуется перезагрузка страницы. Это известная ошибка, которую мы ещё не успели исправить.

Это также не работало на iPad, поэтому я добавил этот код, чтобы отключить его для них:

<script type="text/discourse-plugin" version="0.8">
         api.onPageChange(() => { 
            var is_iPad = navigator.userAgent.match(/iPad/i) != null;
            if(is_iPad)  {
                document.getElementById("sidebar").classList.add("hide-it");
            }
         });
</script>

CSS
#sidebar.hide-it {display:none !important}

Впервые сегодня вечером я внимательно посмотрел на всё это в твиттере. Думаю, я понял, где нужно исправить известные баги, но сейчас у меня нет на это времени.

Если кто-то захочет использовать это, я соберу всё в один компонент темы в течение ближайших пары дней.

Вот компонент, который, кажется, стабилен:

Он добавляет боковую панель Twitter в файл discovery/topics.hbs для Discourse, поэтому боковая панель будет отображаться на всех страницах: «Последние», «Непрочитанные», «Новые», «Закладки» и т. д. Она не будет загружаться, если пользователь не авторизован, так как нам не удалось заставить её работать без входа в систему. Также она не работает на iOS, поэтому, вероятно, отключена на iPad, но я не могу это проверить.

Чтобы загрузить вашу ленту Twitter вместо ленты Discourse, следуйте инструкциям на строке 30 в файле Desktop head_tag.html и добавьте правильный код на строке 39.

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

Где находится этот файл?

Спасибо, я нашёл <\head>

У меня не работает. Я вижу только ссылку «тестовая временная шкала». Я добавил оба скрипта в <\head> и CSS для рабочего стола.

Попробуйте компонент темы Smartey, который связал несколько постов.

Я установил компонент темы, но, по какой-то причине, в боковой панели отображается только ссылка на ленту, а не твиты.

Не знаю, что вам сказать. У меня были проблемы с загрузкой ленты, пока я не добавил

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(() => {
        twttr.widgets.load( document.getElementById("sidebar") );
    });
</script>

Но это в компоненте, поэтому, если у вас это не работает, единственное, что я могу предложить, — проверить настройки безопасности, а именно параметр «Политика безопасности контента» (content security policy), и если у вас стоит галочка
image
то, думаю, скрипты Twitter работать не будут.

Это довольно круто. Я попробовал, и всё работает отлично. Молодцы!

Когда я впервые увидел эту тему, подумал, что она будет немного другой. В моём сообществе у многих участников есть Twitter. Сложно мотивировать их вести более глубокие и долгосрочные обсуждения на форуме тем, о которых они твитят. Интерфейс для просмотра ленты и создания темы по твиту был бы интересным решением! Возможно, ленту можно было бы привязать к хештегу? Или же пользователи могли бы видеть свою собственную ленту Twitter в профиле и создавать темы оттуда.

Спасибо, Smertey. Я снял галочку с политики безопасности контента, и теперь всё работает. Есть ли какие-либо риски для безопасности при снятии этой опции?