Aufbau Ausgabe Thread / thread_view

Admin

Administrator

Aufbau Ausgabe Thread / thread_view

Ich habe es mir bis heute nicht merken können und stets herumgedoktert, aber es muss ja mal eine Übersicht geben zu diesem Saustall.

Eine Themenseite wird ausgegeben mit thread_view
Und das sieht heuer schon wieder anders aus als früher.

Dazu gibt es thread_view als _type_article, _type_poll, _type_question, _type_suggestion und evtl. mehr mit mindestens zwei Addons.

Da mich erstmal nur thread_view und _type_article interessieren und _type_article leer ist, geht es also nur um thread_view.
 

thread_view

thread_view kommentiert. Thread_view hat mit Kommentaren über 10.000 Zeichen und passt folglich nicht in einen Standard-Beitrag.


Teil 1: Titel, Meta-Tags und Beschreibung

XML:
<!-- Setzt den Titel und die Hauptüberschrift des Threads, einschließlich eines Präfixes, falls vorhanden -->
<xf:title page="{$page}">{{ prefix('thread', $thread, 'escaped') }}{$thread.title}</xf:title>
<xf:h1>{{ prefix('thread', $thread) }}{$thread.title}</xf:h1>

<!-- Fügt das noindex-Meta-Tag hinzu, wenn der Thread nicht von Suchmaschinen indexiert werden soll -->
<xf:if is="!$thread.isSearchEngineIndexable()">
    <xf:head option="metaNoindex"><meta name="robots" content="noindex" /></xf:head>
</xf:if>

<!-- Beschreibungsblock mit einer Inline-Liste, die den Thread-Ersteller und das Erstellungsdatum anzeigt -->
<xf:description meta="false">
    <ul class="listInline listInline--bullet">
        <li>
            <xf:fa icon="fa-user" title="{{ phrase('thread_starter')|for_attr }}" />
            <span class="u-srOnly">{{ phrase('thread_starter') }}</span>

            <xf:username user="{$thread.User}" defaultname="{$thread.username}" class="u-concealed" />
        </li>
        <li>
            <xf:fa icon="fa-clock" title="{{ phrase('start_date')|for_attr }}" />
            <span class="u-srOnly">{{ phrase('start_date') }}</span>

            <a href="{{ link('threads', $thread) }}" class="u-concealed"><xf:date time="{$thread.post_date}" /></a>
        </li>
        <!-- Zeigt ein "Featured"-Label an, wenn der Thread hervorgehoben ist -->
        <xf:if is="$thread.featured">
            <li><span class="label label--accent">{{ phrase('featured') }}</span></li>
        </xf:if>
        <!-- Zeigt Tags an, wenn das Tagging aktiviert ist und der Benutzer diese bearbeiten kann -->
        <xf:if is="$xf.options.enableTagging AND ($thread.canEditTags() OR $thread.tags)">
            <li>
                <xf:macro id="tag_macros::list"
                    arg-tags="{$thread.tags}"
                    arg-tagList="tagList--thread-{$thread.thread_id}"
                    arg-editLink="{{ $thread.canEditTags() ? link('threads/tags', $thread) : '' }}" />
            </li>
        </xf:if>
    </ul>
</xf:description>
 

Teil 2: Metadaten, strukturierte Daten und Seitenelemente


XML:
<!-- Erstellt ein Snippet aus dem ersten Beitrag, das für die Metadaten verwendet wird -->
<xf:set var="$fpSnippet" value="{{ snippet($firstPost.message, 0, {'stripBbCode': true}) }}" />

<!-- Fügt Metadaten wie Beschreibung, Share-URL und kanonische URL hinzu -->
<xf:macro id="metadata_macros::metadata"
    arg-description="{$fpSnippet}"
    arg-shareUrl="{{ link('canonical:threads', $thread) }}"
    arg-canonicalUrl="{{ link('canonical:threads', $thread, {'page': $page}) }}" />

<!-- Erstellt eine oEmbed-URL und den Titel für die Einbettung -->
<xf:macro id="metadata_macros::oembed"
    arg-oembedUrl="{$thread.getOembedEndpointUrl()}"
    arg-title="{$thread.getContentTitle()}" />

<!-- Füge strukturierte Daten (LD+JSON) für die Suchmaschinenoptimierung hinzu -->
<xf:page option="ldJsonHtml">
    <xf:extension id="structured_data_extra_params" value="{{ [] }}" />
    <xf:extension id="structured_data">
        <xf:set var="$ldJson"
            value="{{ $thread.getLdStructuredData($firstPost, $page, extension_value('structured_data_extra_params')) }}"
        />
        <xf:if is="$ldJson">
            <script type="application/ld+json">
                {$ldJson|json(true)|raw}
            </script>
        </xf:if>
    </xf:extension>
</xf:page>

<!-- Erweiterungspunkt für zusätzlichen Inhalt oberhalb der Nachrichten -->
<xf:extension id="content_top"></xf:extension>
<!--[XF:content_top]-->
 

Teil 3: Nachrichtenanzeige, Thread-Aktionen und Formulare


XML:
<!-- Zeigt eine wichtige Nachricht an, wenn der Thread noch auf Genehmigung wartet -->
<xf:if is="$pendingApproval">
    <div class="blockMessage blockMessage--important">{{ phrase('content_submitted_displayed_pending_approval') }}</div>
</xf:if>

<!-- Zeigt eine Nachricht an, wenn der Thread ein Präfix hat -->
<xf:if is="$thread.prefix_id">
    <xf:if contentcheck="true">
        <div class="blockMessage blockMessage--alt blockMessage--small blockMessage--close">
            <xf:contentcheck>{{ prefix_description('thread', $thread.prefix_id) }}</xf:contentcheck>
        </div>
    </xf:if>
</xf:if>

<!-- Optionen für die Forumsseite und die Brotkrümelnavigation -->
<xf:macro id="forum_macros::forum_page_options" arg-forum="{$forum}" arg-thread="{$thread}" />
<xf:breadcrumb source="$forum.getBreadcrumbs()" />

<!-- Lädt das Inline-Mod-Skript, wenn die Bedingungen erfüllt sind -->
<xf:if is="$canInlineMod OR $thread.canUseInlineModeration()">
    <xf:js src="xf/inline_mod.js" min="1" />
</xf:if>

<!-- Erweiterungspunkt für Inhalte über den Nachrichten -->
<xf:extension id="above_messages"></xf:extension>
<xf:ad position="thread_view_above_messages" arg-thread="{$thread}" />
<xf:widgetpos id="thread_view_above_messages" context-thread="{$thread}" />

<!-- HTML für Thread-Aktionen wie Löschen, Bearbeiten, etc. -->
<xf:set var="$threadActionsHtml">
    <xf:extension id="thread_actions">
        <xf:if contentcheck="true">
            <div class="block-outer-opposite">
                <div class="buttonGroup">
                <xf:contentcheck>
                    <xf:extension id="thread_action_buttons">
                        <xf:if is="$canInlineMod">
                            <xf:macro id="inline_mod_macros::button" />
                        </xf:if>
                        <xf:if is="$thread.discussion_state == 'deleted' AND $thread.canUndelete()">
                            <xf:button href="{{ link('threads/undelete', $thread) }}" class="button--link" overlay="true">
                                {{ phrase('undelete') }}
                            </xf:button>
                        </xf:if>
                        <xf:if is="$thread.canApproveUnapprove() AND $thread.discussion_state == 'moderated'">
                            <xf:button href="{{ link('threads/approve', $thread) }}" class="button--link" overlay="true">
                                {{ phrase('approve') }}
                            </xf:button>
                        </xf:if>
                        <xf:if is="$xf.visitor.user_id AND $thread.isUnread()">
                            <xf:button href="{{ ($firstUnread AND $isSimpleDateDisplay) ? ('#post-' . $firstUnread.post_id) : link('threads/unread', $thread, {'new': 1}) }}"
                                class="button--link"
                                data-xf-click="scroll-to"
                                data-silent="true">
                                    {{ phrase('jump_to_new') }}
                            </xf:button>
                        </xf:if>
                        <xf:if is="$thread.canWatch()">
                            <xf:button href="{{ link('threads/watch', $thread) }}" class="button--link"
                                data-xf-click="switch-overlay"
                                data-sk-watch="{{ phrase('watch') }}"
                                data-sk-unwatch="{{ phrase('unwatch') }}">
                                <xf:if is="{$thread.Watch.{$xf.visitor.user_id}}">
                                    {{ phrase('unwatch') }}
                                <xf:else />
                                    {{ phrase('watch') }}
                                </xf:if>
                            </xf:button>
                        </xf:if>

                        <xf:if contentcheck="true">
                            <div class="buttonGroup-buttonWrapper">
                                <xf:button class="button--link menuTrigger" data-xf-click="menu" aria-expanded="false" aria-haspopup="true" title="{{ phrase('more_options') }}">&#8226;&#8226;&#8226;</xf:button>
                                <div class="menu" data-menu="menu" aria-hidden="true">
                                    <div class="menu-content">
                                        <h4 class="menu-header">{{ phrase('more_options') }}</h4>
                                        <xf:contentcheck>
                                            <!-- Menü mit Thread-Werkzeugen (z.B. Bearbeiten, Verschieben) -->
                                            <xf:if is="$thread.canEdit()">
                                                <a href="{{ link('threads/edit', $thread) }}" data-xf-click="overlay" class="menu-linkRow">{{ phrase('edit_thread') }}</a>
                                            </xf:if>
                                            <xf:if is="$thread.canChangeType() AND count($creatableThreadTypes) > 1">
                                                 <a href="{{ link('threads/change-type', $thread) }}" data-xf-click="overlay" class="menu-linkRow">{{ phrase('change_thread_type') }}</a>
                                            </xf:if>
                                            <xf:if is="$thread.canLockUnlock()">
                                                <a href="{{ link('threads/quick-close', $thread) }}"
                                                    class="menu-linkRow"
                                                    data-xf-click="switch"
                                                    data-menu-closer="true">
                                                    <xf:if is="$thread.discussion_open">
                                                        {{ phrase('lock_thread') }}
                                                    <xf:else />
                                                        {{ phrase('unlock_thread') }}
                                                    </xf:if>
                                                </a>
                                            </xf:if>
                                            <xf:if is="$thread.canStickUnstick()">
                                                <a href="{{ link('threads/quick-stick', $thread) }}"
                                                    class="menu-linkRow"
                                                    data-xf-click="switch"
                                                    data-menu-closer="true">
                                                    <xf:if is="$thread.sticky">
                                                        {{ phrase('unstick_thread') }}
                                                    <xf:else />
                                                        {{ phrase('stick_thread') }}
                                                    </xf:if>
                                                </a>
                                            </xf:if>
                                            <!-- Weitere Optionen... -->
                                        </xf:contentcheck>
                                    </div>
                                </div>
                            </div>
                        </xf:if>
                    </xf:extension>
                </xf:contentcheck>
                </div>
            </div>
        </xf:if>
    </xf:extension>
</xf:set>
 

Auszug von oben: Post-Bereich


XML:
<!-- Der eigentliche Nachrichtenbereich -->
    <div class="block-body js-replyNewMessageContainer">
        <xf:if is="$posts is not empty">
            <xf:foreach loop="$posts" value="$post">

                <!-- Erweiterungspunkte vor jedem Beitrag -->
                <xf:extension id="messages_block_body_before_post"></xf:extension>

                <!-- Überprüfung des Nachrichtenstatus (z.B. gelöschte Nachrichten) -->
                <xf:if is="$post.message_state == 'deleted'">
                    <xf:macro id="{{ $templateOverrides.post_deleted_macro ?: 'post_macros::post_deleted' }}"
                        arg-post="{$post}"
                        arg-thread="{$thread}"
                        args="{$templateOverrides.post_deleted_macro_args}" />
                <xf:else />
                    <!-- Anzeigen des Beitrags -->
                    <xf:macro id="{{ $templateOverrides.post_macro ?: 'post_macros::post' }}"
                        arg-post="{$post}"
                        arg-thread="{$thread}"
                        arg-highlightedPosts="{$highlightedPosts}"
                        args="{$templateOverrides.post_macro_args}" />
                </xf:if>

                <!-- Erweiterungspunkte nach jedem Beitrag -->
                <xf:extension id="messages_block_body_after_post"></xf:extension>

            </xf:foreach>
        <xf:else />
            <!-- Nachricht, wenn keine Beiträge vorhanden sind -->
            <xf:if is="$filters">
                <div class="message">
                    <div class="message-inner">
                        <div class="message-cell">
                            {{ phrase('there_no_posts_matching_your_filters') }}
                        </div>
                    </div>
                </div>
            </xf:if>
        </xf:if>
    </div>
</div>
 

Single Post


XML:
<xf:macro id="{{ $templateOverrides.post_macro ?: 'post_macros::post' }}"
                        arg-post="{$post}"
                        arg-thread="{$thread}"
                        arg-highlightedPosts="{$highlightedPosts}"
                        args="{$templateOverrides.post_macro_args}" />

Irgendwas überschreibt, ansonsten geht es normal mit post_macros und dort mit post weiter.
 
Zurück
Oben