Hallo Community,
mir gefällt das +Artikel Plugin so gut, aber konnte bisher nichts finden, was sowas für den Blog umsetzen kann. Bisher scheint auch solch eine Umsetzung nicht geplant und ich habe mich nun seit ein paar Wochen daran versucht sowas ohne Kenntnisse und ohne Plugin umzusetzen.
Es ist wahrscheinlich nicht die beste Lösung, aber es scheint bisher seinen Zweck zu erfüllen. Und ich wollte euch das nicht vorenthalten und vielleicht kann das jemand optimieren und daraus was tolles entwickeln.
Voraussetzung ist es, dass template entry aus der Blog-App zu modifizieren.
Der Ganze Inhalt muss mit folgendem ersetzt werden:
{capture assign='pageTitle'}{if $entry->isDraft}{lang}blog.entry.draft{/lang}: {/if}{$entry->subject}{/capture}
{assign var='__mainItemScope' value='itemprop="mainEntity" itemscope itemtype="http://schema.org/Article"'}
{* PAYWALL HACK *}
{if $entry->entryID == 1} {* > ENTRYS *}
{if 6|in_array:$__wcf->user->getGroupIDs()} {* > USERGROUP ACEPTED *}
{* START: ORIGINALCODE *}
{capture assign='contentHeader'}
<header class="contentHeader messageGroupContentHeader blogEntryHeader{if $entry->isDisabled} messageDisabled{/if}{if $entry->isDeleted} messageDeleted{/if}">
<div class="contentHeaderIcon">
{@$entry->getUserProfile()->getAvatar()->getImageTag(64)}
{event name='icons'}
</div>
<div class="contentHeaderTitle">
<h1 class="contentTitle" id="entryTitle{@$entry->entryID}">
{if $entry->isFeatured}
<span class="badge label green jsLabelFeatured">{lang}blog.entry.featured{/lang}</span>
{/if}
{if $entry->isDraft}
<span class="badge">{lang}blog.entry.draft{/lang}</span>
{/if}
{if $entry->isNew()}<span class="badge label">{lang}wcf.message.new{/lang}</span>{/if}
<span itemprop="name headline">{$entry->subject}</span>
</h1>
<ul class="inlineList contentHeaderMetaData">
<li itemprop="author" itemscope itemtype="http://schema.org/Person">
<span class="icon icon16 fa-user"></span>
{if $entry->userID}
<a href="{$entry->getUserProfile()->getLink()}" class="userLink" data-user-id="{@$entry->userID}" itemprop="url">
<span itemprop="name">{@$entry->getUserProfile()->getFormattedUsername()}</span>
</a>
{else}
<span itemprop="name">{$entry->username}</span>
{/if}
</li>
<li>
<span class="icon icon16 fa-clock-o"></span>
<span><a href="{link application='blog' controller='Entry' object=$entry}{/link}" class="permalink">{@$entry->time|time}</a></span>
<meta itemprop="datePublished" content="{@$entry->time|date:'c'}">
<meta itemprop="dateModified" content="{@$entry->time|date:'c'}">
</li>
{if $entry->views}
<li>
<span class="icon icon16 fa-eye"></span>
{lang}blog.entry.views.count{/lang}
</li>
{/if}
{if $entry->comments}
<li itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
<span class="icon icon16 fa-comments"></span>
<span>{lang}blog.entry.comments.count{/lang}</span>
<meta itemprop="interactionType" content="http://schema.org/CommentAction">
<meta itemprop="userInteractionCount" content="{@$entry->comments}">
</li>
{/if}
{event name='contentHeaderMetaData'}
</ul>
<meta itemprop="mainEntityOfPage" content="{$canonicalURL}">
<div itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="{PAGE_TITLE|phrase}">
<div itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
<meta itemprop="url" content="{$__wcf->getStyleHandler()->getStyle()->getPageLogo()}">
</div>
</div>
</div>
{hascontent}
<nav class="contentHeaderNavigation">
<ul>
{content}
{event name='contentHeaderNavigation'}
{/content}
</ul>
</nav>
{/hascontent}
</header>
{/capture}
{capture assign='headContent'}
<link rel="canonical" href="{link application='blog' controller='Entry' object=$entry}{/link}">
{if MODULE_AMP}
<link rel="amphtml" href="{link application='blog' controller='EntryAmp' object=$entry}{/link}">
{/if}
{/capture}
{capture assign='sidebarRight'}
{if $entry->getLeafCategories()|count}
<section class="box">
<h2 class="boxTitle">{lang}blog.entry.categories{/lang}</h2>
<div class="boxContent">
<ul>
{foreach from=$entry->getLeafCategories() item=category}
<li><a href="{link application='blog' controller='BlogEntryList' object=$entry->getBlog()}categoryID={@$category->categoryID}{/link}" class="jsTooltip" title="{lang}blog.entry.categorizedEntries{/lang}">{$category->getTitle()}</a></li>
{/foreach}
</ul>
</div>
</section>
{/if}
{include file='blogArchive' application='blog'}
{if $tags|count}
<section class="box">
<h2 class="boxTitle">{lang}wcf.tagging.tags{/lang}</h2>
<div class="boxContent">
<ul class="tagList">
{foreach from=$tags item=tag}
<li><a href="{link controller='Tagged' object=$tag}objectType=com.woltlab.blog.entry{/link}" class="jsTooltip tag" title="{lang}wcf.tagging.taggedObjects.com.woltlab.blog.entry{/lang}">{$tag->name}</a></li>
{/foreach}
</ul>
</div>
</section>
{/if}
{event name='boxes'}
{/capture}
{include file='header'}
{if !$entry->isPublished && !$entry->isDraft}
<p class="info" role="status">{lang}blog.entry.delayedPublication{/lang}</p>
{/if}
{assign var='objectID' value=$entry->entryID}
<article class="section blogEntry" aria-labelledby="entryTitle{@$entry->entryID}">
<div class="section articleImageContainer" itemprop="image" itemscope itemtype="http://schema.org/ImageObject">
{assign var=coverPhotoImage value=$entry->getCoverPhotoImage()}
<figure class="contentCoverPhotoImage">
<div class="contentCoverPhotoImageWrapper"><img src="{@$coverPhotoImage->getUrl()}" alt=""></div>
</figure>
<meta itemprop="url" content="{$coverPhotoImage->getUrl()}">
<meta itemprop="width" content="{@$coverPhotoImage->getWidth()}">
<meta itemprop="height" content="{@$coverPhotoImage->getHeight()}">
</div>
<div class="section message{if $entry->isDeleted} messageDeleted{/if}{if $entry->isDisabled} messageDisabled{/if}{if $entry->getUserProfile()->userOnlineGroupID} userOnlineGroupMarking{@$entry->getUserProfile()->userOnlineGroupID}{/if}"
{@$__wcf->getReactionHandler()->getDataAttributes('com.woltlab.blog.likeableEntry', $entry->entryID)}
data-is-deleted="{@$entry->isDeleted}" data-is-disabled="{@$entry->isDisabled}" data-is-featured="{@$entry->isFeatured}"
data-can-view-deleted-entry="{if $__wcf->session->getPermission('mod.blog.canViewDeletedEntry')}true{else}false{/if}" data-can-trash-entry="{if $entry->canTrash()}true{else}false{/if}" data-can-restore-entry="{if $entry->canRestore()}true{else}false{/if}" data-can-delete-entry="{if $__wcf->getSession()->getPermission('mod.blog.canDeleteEntry')}true{else}false{/if}" data-can-edit-entry="{if $entry->canEdit()}true{else}false{/if}" data-can-moderate-entry="{if $__wcf->getSession()->getPermission('mod.blog.canModerateEntry')}true{else}false{/if}">
<div class="messageContent">
<div class="messageBody">
{if $entry->getPoll()}
{include file='poll' poll=$entry->getPoll()}
{/if}
{event name='beforeMessageText'}
<div class="messageText">
{if MODULE_WCF_AD}
{@$__wcf->getAdHandler()->getAds('com.woltlab.blog.entry.inEntryMessage')}
{/if}
{@$entry->getFormattedMessage()}
</div>
{event name='afterMessageText'}
</div>
<footer class="messageFooter">
{include file='attachments'}
{if $entry->getUserProfile()->showSignature()}
<div class="messageSignature">
<div>{@$entry->getUserProfile()->getSignature()}</div>
</div>
{/if}
{event name='messageFooter'}
<div class="messageFooterNotes">
{if $entry->canEdit() && $entry->hasOldVersions()}
<p class="blogEntryEditNote messageFooterNote"><a href="{link controller='EditHistory' objectType='com.woltlab.blog.entry' objectID=$entry->entryID}{/link}">{lang}blog.entry.hasOldVersions{/lang}</a></p>
{/if}
{if $entry->getDeleteNote()}
<p class="blogEntryDeleteNote messageFooterNote">{@$entry->getDeleteNote()}</p>
{/if}
{event name='messageFooterNotes'}
</div>
<div class="messageFooterGroup">
{if MODULE_LIKE && $entryLikeData|isset}{include file="reactionSummaryList" reactionData=$entryLikeData objectType="com.woltlab.blog.likeableEntry" objectID=$entry->entryID}{/if}
<ul class="messageFooterButtons buttonList smallButtons">
{if $entry->canEdit()}<li><a href="{link application='blog' controller='EntryEdit' id=$entry->entryID}{/link}" class="button jsButtonEntryInlineEditor" title="{lang}blog.entry.edit{/lang}"><span class="icon icon16 fa-pencil"></span> <span>{lang}wcf.global.button.edit{/lang}</span></a></li>{/if}
<li>
<a href="{$entry->getLink()}" class="button wsShareButton jsOnly" data-link-title="{$entry->getTitle()}">
<span class="icon icon16 fa-share-alt"></span> <span>{lang}wcf.message.share{/lang}</span>
</a>
</li>
{if !VISITOR_USE_TINY_BUILD || $__wcf->user->userID}<li class="jsQuoteMessage" data-object-id="{@$entry->entryID}" data-is-quoted="{if $__quoteFullQuote|isset && $entry->entryID|in_array:$__quoteFullQuote}1{else}0{/if}"><a rel="nofollow" href="{link application='blog' controller='EntryAdd' quoteMessageID=$entry->entryID}{/link}" title="{lang}wcf.message.quote.quoteMessage{/lang}" class="button jsTooltip{if $__quoteFullQuote|isset && $entry->entryID|in_array:$__quoteFullQuote} active{/if}"><span class="icon icon16 fa-quote-left"></span> <span class="invisible">{lang}wcf.message.quote.quoteMessage{/lang}</span></a></li>{/if}
{if $__wcf->session->getPermission('user.profile.canReportContent')}<li class="jsReportEntry jsOnly" data-object-id="{@$entry->entryID}"><a href="#" title="{lang}wcf.moderation.report.reportContent{/lang}" class="button jsTooltip"><span class="icon icon16 fa-exclamation-triangle"></span> <span class="invisible">{lang}wcf.moderation.report.reportContent{/lang}</span></a></li>{/if}
{if MODULE_USER_INFRACTION && $userProfile->userID && $__wcf->session->getPermission('mod.infraction.warning.canWarn') && !$userProfile->getPermission('mod.infraction.warning.immune')}<li class="jsWarnEntry jsOnly" data-object-id="{@$entry->entryID}" data-user-id="{@$userProfile->userID}"><a href="#" title="{lang}wcf.infraction.warn{/lang}" class="button jsTooltip"><span class="icon icon16 fa-gavel"></span> <span class="invisible">{lang}wcf.infraction.warn{/lang}</span></a></li>{/if}
{if $entry->canReact()}<li><a href="#" class="reactButton jsTooltip button{if $entryLikeData[$entry->entryID]|isset && $entryLikeData[$entry->entryID]->reactionTypeID} active{/if}" title="{lang}wcf.reactions.react{/lang}" data-reaction-type-id="{if $entryLikeData[$entry->entryID]|isset && $entryLikeData[$entry->entryID]->reactionTypeID}{$entryLikeData[$entry->entryID]->reactionTypeID}{else}0{/if}"><span class="icon icon16 fa-smile-o"></span> <span class="invisible">{lang}wcf.reactions.react{/lang}</span></a></li>{/if}
{event name='messageFooterButtons'}
</ul>
</div>
</footer>
</div>
</div>
</article>
{if $nextEntry || $previousEntry}
<div class="section blogEntryNavigation">
<nav>
<ul>
{if $previousEntry}
<li class="blogPreviousEntryButton">
<a href="{link application='blog' controller='Entry' object=$previousEntry}{/link}" rel="prev">
<div>
<span class="blogEntryNavigationEntityName">{lang}blog.entry.previousEntry{/lang}</span>
<span class="blogEntryNavigationEntryTitle">{$previousEntry->subject}</span>
</div>
</a>
</li>
{/if}
{if $nextEntry}
<li class="blogNextEntryButton">
<a href="{link application='blog' controller='Entry' object=$nextEntry}{/link}" rel="next">
<div>
<span class="blogEntryNavigationEntityName">{lang}blog.entry.nextEntry{/lang}</span>
<span class="blogEntryNavigationEntryTitle">{$nextEntry->subject}</span>
</div>
</a>
</li>
{/if}
</ul>
</nav>
</div>
{/if}
{event name='beforeComments'}
{if $entry->enableComments}
{if $commentList|count || $commentCanAdd}
<section id="comments" class="section sectionContainerList">
<h2 class="sectionTitle">{lang}wcf.global.comments{/lang}{if $entry->comments} <span class="badge">{#$entry->comments}</span>{/if}</h2>
{include file='__commentJavaScript' commentContainerID='blogEntryCommentList'}
<ul id="blogEntryCommentList" class="commentList containerList" data-can-add="{if $commentCanAdd}true{else}false{/if}" data-object-id="{@$entryID}" data-object-type-id="{@$commentObjectTypeID}" data-comments="{if $entry->comments}{@$commentList->countObjects()}{else}0{/if}" data-last-comment-time="{@$lastCommentTime}">
{if $commentCanAdd}{include file='commentListAddComment' wysiwygSelector='blogEntryCommentListAddComment'}{/if}
{include file='commentList'}
</ul>
</section>
{/if}
{/if}
{* ENDE: ORIGINALCODE *}
{else}
{* START: ORIGINALCODE *}
{capture assign='contentHeader'}
<header class="contentHeader messageGroupContentHeader blogEntryHeader{if $entry->isDisabled} messageDisabled{/if}{if $entry->isDeleted} messageDeleted{/if}">
<div class="contentHeaderIcon">
{@$entry->getUserProfile()->getAvatar()->getImageTag(64)}
{event name='icons'}
</div>
<div class="contentHeaderTitle">
<h1 class="contentTitle" id="entryTitle{@$entry->entryID}">
{if $entry->isFeatured}
<span class="badge label green jsLabelFeatured">{lang}blog.entry.featured{/lang}</span>
{/if}
{if $entry->isDraft}
<span class="badge">{lang}blog.entry.draft{/lang}</span>
{/if}
{if $entry->isNew()}<span class="badge label">{lang}wcf.message.new{/lang}</span>{/if}
<span itemprop="name headline">{$entry->subject}</span>
</h1>
<ul class="inlineList contentHeaderMetaData">
<li itemprop="author" itemscope itemtype="http://schema.org/Person">
<span class="icon icon16 fa-user"></span>
{if $entry->userID}
<a href="{$entry->getUserProfile()->getLink()}" class="userLink" data-user-id="{@$entry->userID}" itemprop="url">
<span itemprop="name">{@$entry->getUserProfile()->getFormattedUsername()}</span>
</a>
{else}
<span itemprop="name">{$entry->username}</span>
{/if}
</li>
<li>
<span class="icon icon16 fa-clock-o"></span>
<span><a href="{link application='blog' controller='Entry' object=$entry}{/link}" class="permalink">{@$entry->time|time}</a></span>
<meta itemprop="datePublished" content="{@$entry->time|date:'c'}">
<meta itemprop="dateModified" content="{@$entry->time|date:'c'}">
</li>
{if $entry->views}
<li>
<span class="icon icon16 fa-eye"></span>
{lang}blog.entry.views.count{/lang}
</li>
{/if}
{if $entry->comments}
<li itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
<span class="icon icon16 fa-comments"></span>
<span>{lang}blog.entry.comments.count{/lang}</span>
<meta itemprop="interactionType" content="http://schema.org/CommentAction">
<meta itemprop="userInteractionCount" content="{@$entry->comments}">
</li>
{/if}
{event name='contentHeaderMetaData'}
</ul>
<meta itemprop="mainEntityOfPage" content="{$canonicalURL}">
<div itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="{PAGE_TITLE|phrase}">
<div itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
<meta itemprop="url" content="{$__wcf->getStyleHandler()->getStyle()->getPageLogo()}">
</div>
</div>
</div>
{hascontent}
<nav class="contentHeaderNavigation">
<ul>
{content}
{event name='contentHeaderNavigation'}
{/content}
</ul>
</nav>
{/hascontent}
</header>
{/capture}
{capture assign='headContent'}
<link rel="canonical" href="{link application='blog' controller='Entry' object=$entry}{/link}">
{if MODULE_AMP}
<link rel="amphtml" href="{link application='blog' controller='EntryAmp' object=$entry}{/link}">
{/if}
{/capture}
{capture assign='sidebarRight'}
{if $entry->getLeafCategories()|count}
<section class="box">
<h2 class="boxTitle">{lang}blog.entry.categories{/lang}</h2>
<div class="boxContent">
<ul>
{foreach from=$entry->getLeafCategories() item=category}
<li><a href="{link application='blog' controller='BlogEntryList' object=$entry->getBlog()}categoryID={@$category->categoryID}{/link}" class="jsTooltip" title="{lang}blog.entry.categorizedEntries{/lang}">{$category->getTitle()}</a></li>
{/foreach}
</ul>
</div>
</section>
{/if}
{include file='blogArchive' application='blog'}
{if $tags|count}
<section class="box">
<h2 class="boxTitle">{lang}wcf.tagging.tags{/lang}</h2>
<div class="boxContent">
<ul class="tagList">
{foreach from=$tags item=tag}
<li><a href="{link controller='Tagged' object=$tag}objectType=com.woltlab.blog.entry{/link}" class="jsTooltip tag" title="{lang}wcf.tagging.taggedObjects.com.woltlab.blog.entry{/lang}">{$tag->name}</a></li>
{/foreach}
</ul>
</div>
</section>
{/if}
{event name='boxes'}
{/capture}
{include file='header'}
{if !$entry->isPublished && !$entry->isDraft}
<p class="info" role="status">{lang}blog.entry.delayedPublication{/lang}</p>
{/if}
{assign var='objectID' value=$entry->entryID}
<article class="section blogEntry" aria-labelledby="entryTitle{@$entry->entryID}">
<div class="section articleImageContainer" itemprop="image" itemscope itemtype="http://schema.org/ImageObject">
{assign var=coverPhotoImage value=$entry->getCoverPhotoImage()}
<figure class="contentCoverPhotoImage">
<div class="contentCoverPhotoImageWrapper"><img src="{@$coverPhotoImage->getUrl()}" alt=""></div>
</figure>
<meta itemprop="url" content="{$coverPhotoImage->getUrl()}">
<meta itemprop="width" content="{@$coverPhotoImage->getWidth()}">
<meta itemprop="height" content="{@$coverPhotoImage->getHeight()}">
</div>
<div class="section message{if $entry->isDeleted} messageDeleted{/if}{if $entry->isDisabled} messageDisabled{/if}{if $entry->getUserProfile()->userOnlineGroupID} userOnlineGroupMarking{@$entry->getUserProfile()->userOnlineGroupID}{/if}"
{@$__wcf->getReactionHandler()->getDataAttributes('com.woltlab.blog.likeableEntry', $entry->entryID)}
data-is-deleted="{@$entry->isDeleted}" data-is-disabled="{@$entry->isDisabled}" data-is-featured="{@$entry->isFeatured}"
data-can-view-deleted-entry="{if $__wcf->session->getPermission('mod.blog.canViewDeletedEntry')}true{else}false{/if}" data-can-trash-entry="{if $entry->canTrash()}true{else}false{/if}" data-can-restore-entry="{if $entry->canRestore()}true{else}false{/if}" data-can-delete-entry="{if $__wcf->getSession()->getPermission('mod.blog.canDeleteEntry')}true{else}false{/if}" data-can-edit-entry="{if $entry->canEdit()}true{else}false{/if}" data-can-moderate-entry="{if $__wcf->getSession()->getPermission('mod.blog.canModerateEntry')}true{else}false{/if}">
<div class="messageContent">
<div class="messageBody">
{if $entry->getPoll()}
{include file='poll' poll=$entry->getPoll()}
{/if}
{event name='beforeMessageText'}
<div class="messageText">
{if MODULE_WCF_AD}
{@$__wcf->getAdHandler()->getAds('com.woltlab.blog.entry.inEntryMessage')}
{/if}
{@$entry->getFormattedMessage()}
</div>
{event name='afterMessageText'}
</div>
<footer class="messageFooter">
{include file='attachments'}
{if $entry->getUserProfile()->showSignature()}
<div class="messageSignature">
<div>{@$entry->getUserProfile()->getSignature()}</div>
</div>
{/if}
{event name='messageFooter'}
<div class="messageFooterNotes">
{if $entry->canEdit() && $entry->hasOldVersions()}
<p class="blogEntryEditNote messageFooterNote"><a href="{link controller='EditHistory' objectType='com.woltlab.blog.entry' objectID=$entry->entryID}{/link}">{lang}blog.entry.hasOldVersions{/lang}</a></p>
{/if}
{if $entry->getDeleteNote()}
<p class="blogEntryDeleteNote messageFooterNote">{@$entry->getDeleteNote()}</p>
{/if}
{event name='messageFooterNotes'}
</div>
<div class="messageFooterGroup">
{if MODULE_LIKE && $entryLikeData|isset}{include file="reactionSummaryList" reactionData=$entryLikeData objectType="com.woltlab.blog.likeableEntry" objectID=$entry->entryID}{/if}
<ul class="messageFooterButtons buttonList smallButtons">
{if $entry->canEdit()}<li><a href="{link application='blog' controller='EntryEdit' id=$entry->entryID}{/link}" class="button jsButtonEntryInlineEditor" title="{lang}blog.entry.edit{/lang}"><span class="icon icon16 fa-pencil"></span> <span>{lang}wcf.global.button.edit{/lang}</span></a></li>{/if}
<li>
<a href="{$entry->getLink()}" class="button wsShareButton jsOnly" data-link-title="{$entry->getTitle()}">
<span class="icon icon16 fa-share-alt"></span> <span>{lang}wcf.message.share{/lang}</span>
</a>
</li>
{if !VISITOR_USE_TINY_BUILD || $__wcf->user->userID}<li class="jsQuoteMessage" data-object-id="{@$entry->entryID}" data-is-quoted="{if $__quoteFullQuote|isset && $entry->entryID|in_array:$__quoteFullQuote}1{else}0{/if}"><a rel="nofollow" href="{link application='blog' controller='EntryAdd' quoteMessageID=$entry->entryID}{/link}" title="{lang}wcf.message.quote.quoteMessage{/lang}" class="button jsTooltip{if $__quoteFullQuote|isset && $entry->entryID|in_array:$__quoteFullQuote} active{/if}"><span class="icon icon16 fa-quote-left"></span> <span class="invisible">{lang}wcf.message.quote.quoteMessage{/lang}</span></a></li>{/if}
{if $__wcf->session->getPermission('user.profile.canReportContent')}<li class="jsReportEntry jsOnly" data-object-id="{@$entry->entryID}"><a href="#" title="{lang}wcf.moderation.report.reportContent{/lang}" class="button jsTooltip"><span class="icon icon16 fa-exclamation-triangle"></span> <span class="invisible">{lang}wcf.moderation.report.reportContent{/lang}</span></a></li>{/if}
{if MODULE_USER_INFRACTION && $userProfile->userID && $__wcf->session->getPermission('mod.infraction.warning.canWarn') && !$userProfile->getPermission('mod.infraction.warning.immune')}<li class="jsWarnEntry jsOnly" data-object-id="{@$entry->entryID}" data-user-id="{@$userProfile->userID}"><a href="#" title="{lang}wcf.infraction.warn{/lang}" class="button jsTooltip"><span class="icon icon16 fa-gavel"></span> <span class="invisible">{lang}wcf.infraction.warn{/lang}</span></a></li>{/if}
{if $entry->canReact()}<li><a href="#" class="reactButton jsTooltip button{if $entryLikeData[$entry->entryID]|isset && $entryLikeData[$entry->entryID]->reactionTypeID} active{/if}" title="{lang}wcf.reactions.react{/lang}" data-reaction-type-id="{if $entryLikeData[$entry->entryID]|isset && $entryLikeData[$entry->entryID]->reactionTypeID}{$entryLikeData[$entry->entryID]->reactionTypeID}{else}0{/if}"><span class="icon icon16 fa-smile-o"></span> <span class="invisible">{lang}wcf.reactions.react{/lang}</span></a></li>{/if}
{event name='messageFooterButtons'}
</ul>
</div>
</footer>
</div>
</div>
</article>
{if $nextEntry || $previousEntry}
<div class="section blogEntryNavigation">
<nav>
<ul>
{if $previousEntry}
<li class="blogPreviousEntryButton">
<a href="{link application='blog' controller='Entry' object=$previousEntry}{/link}" rel="prev">
<div>
<span class="blogEntryNavigationEntityName">{lang}blog.entry.previousEntry{/lang}</span>
<span class="blogEntryNavigationEntryTitle">{$previousEntry->subject}</span>
</div>
</a>
</li>
{/if}
{if $nextEntry}
<li class="blogNextEntryButton">
<a href="{link application='blog' controller='Entry' object=$nextEntry}{/link}" rel="next">
<div>
<span class="blogEntryNavigationEntityName">{lang}blog.entry.nextEntry{/lang}</span>
<span class="blogEntryNavigationEntryTitle">{$nextEntry->subject}</span>
</div>
</a>
</li>
{/if}
</ul>
</nav>
</div>
{/if}
{event name='beforeComments'}
{if $entry->enableComments}
{if $commentList|count || $commentCanAdd}
<section id="comments" class="section sectionContainerList">
<h2 class="sectionTitle">{lang}wcf.global.comments{/lang}{if $entry->comments} <span class="badge">{#$entry->comments}</span>{/if}</h2>
{include file='__commentJavaScript' commentContainerID='blogEntryCommentList'}
<ul id="blogEntryCommentList" class="commentList containerList" data-can-add="{if $commentCanAdd}true{else}false{/if}" data-object-id="{@$entryID}" data-object-type-id="{@$commentObjectTypeID}" data-comments="{if $entry->comments}{@$commentList->countObjects()}{else}0{/if}" data-last-comment-time="{@$lastCommentTime}">
{if $commentCanAdd}{include file='commentListAddComment' wysiwygSelector='blogEntryCommentListAddComment'}{/if}
{include file='commentList'}
</ul>
</section>
{/if}
{/if}
{* ENDE: ORIGINALCODE *}
{* START: HACK *}
<script data-relocate="true">
document.addEventListener("DOMContentLoaded", function() {
var messageTexts = document.querySelectorAll(".messageText");
messageTexts.forEach(function(messageText) {
var textContent = messageText.innerText;
if (textContent.length > 500) {
var shortText = textContent.substr(0, 600) + '...';
var blurText = textContent.substr(700);
var shortBlurText = blurText.substr(0, 700) + '...';
messageText.innerHTML = shortText + '<span class="blogPlusblur">' + shortBlurText + '</span>';
var paywallWrapper = document.createElement("div");
paywallWrapper.id = "blogPlus-wrapper";
paywallWrapper.innerHTML = '<h1>+Blog</h1><p>Um diesen +Blog lesen zu können, ist eine Mitgliedschaft vorausgesetzt.</p><p><br /></p><p><a class="button buttonPrimary" href="https://example.com/subscribe">Subscribe Today!</a></p>';
messageText.appendChild(paywallWrapper);
var blurSections = messageText.querySelectorAll('.blogPlusblur');
if (blurSections.length > 0) {
var lastBlurSection = blurSections[blurSections.length-1];
var paywallWrapperHeight = paywallWrapper.offsetHeight;
lastBlurSection.style.marginBottom = "-" + (paywallWrapperHeight / 2) + "px";
paywallWrapper.querySelector(".button").addEventListener("click", function(event) {
});
var gradient = document.createElement("div");
gradient.classList.add("gradient");
lastBlurSection.appendChild(gradient);
}
}
});
});
</script>
{* ENDE: HACK *}
{/if}
{else}
{* START: ORIGINALCODE *}
{capture assign='contentHeader'}
<header class="contentHeader messageGroupContentHeader blogEntryHeader{if $entry->isDisabled} messageDisabled{/if}{if $entry->isDeleted} messageDeleted{/if}">
<div class="contentHeaderIcon">
{@$entry->getUserProfile()->getAvatar()->getImageTag(64)}
{event name='icons'}
</div>
<div class="contentHeaderTitle">
<h1 class="contentTitle" id="entryTitle{@$entry->entryID}">
{if $entry->isFeatured}
<span class="badge label green jsLabelFeatured">{lang}blog.entry.featured{/lang}</span>
{/if}
{if $entry->isDraft}
<span class="badge">{lang}blog.entry.draft{/lang}</span>
{/if}
{if $entry->isNew()}<span class="badge label">{lang}wcf.message.new{/lang}</span>{/if}
<span itemprop="name headline">{$entry->subject}</span>
</h1>
<ul class="inlineList contentHeaderMetaData">
<li itemprop="author" itemscope itemtype="http://schema.org/Person">
<span class="icon icon16 fa-user"></span>
{if $entry->userID}
<a href="{$entry->getUserProfile()->getLink()}" class="userLink" data-user-id="{@$entry->userID}" itemprop="url">
<span itemprop="name">{@$entry->getUserProfile()->getFormattedUsername()}</span>
</a>
{else}
<span itemprop="name">{$entry->username}</span>
{/if}
</li>
<li>
<span class="icon icon16 fa-clock-o"></span>
<span><a href="{link application='blog' controller='Entry' object=$entry}{/link}" class="permalink">{@$entry->time|time}</a></span>
<meta itemprop="datePublished" content="{@$entry->time|date:'c'}">
<meta itemprop="dateModified" content="{@$entry->time|date:'c'}">
</li>
{if $entry->views}
<li>
<span class="icon icon16 fa-eye"></span>
{lang}blog.entry.views.count{/lang}
</li>
{/if}
{if $entry->comments}
<li itemprop="interactionStatistic" itemscope itemtype="http://schema.org/InteractionCounter">
<span class="icon icon16 fa-comments"></span>
<span>{lang}blog.entry.comments.count{/lang}</span>
<meta itemprop="interactionType" content="http://schema.org/CommentAction">
<meta itemprop="userInteractionCount" content="{@$entry->comments}">
</li>
{/if}
{event name='contentHeaderMetaData'}
</ul>
<meta itemprop="mainEntityOfPage" content="{$canonicalURL}">
<div itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="{PAGE_TITLE|phrase}">
<div itemprop="logo" itemscope itemtype="http://schema.org/ImageObject">
<meta itemprop="url" content="{$__wcf->getStyleHandler()->getStyle()->getPageLogo()}">
</div>
</div>
</div>
{hascontent}
<nav class="contentHeaderNavigation">
<ul>
{content}
{event name='contentHeaderNavigation'}
{/content}
</ul>
</nav>
{/hascontent}
</header>
{/capture}
{capture assign='headContent'}
<link rel="canonical" href="{link application='blog' controller='Entry' object=$entry}{/link}">
{if MODULE_AMP}
<link rel="amphtml" href="{link application='blog' controller='EntryAmp' object=$entry}{/link}">
{/if}
{/capture}
{capture assign='sidebarRight'}
{if $entry->getLeafCategories()|count}
<section class="box">
<h2 class="boxTitle">{lang}blog.entry.categories{/lang}</h2>
<div class="boxContent">
<ul>
{foreach from=$entry->getLeafCategories() item=category}
<li><a href="{link application='blog' controller='BlogEntryList' object=$entry->getBlog()}categoryID={@$category->categoryID}{/link}" class="jsTooltip" title="{lang}blog.entry.categorizedEntries{/lang}">{$category->getTitle()}</a></li>
{/foreach}
</ul>
</div>
</section>
{/if}
{include file='blogArchive' application='blog'}
{if $tags|count}
<section class="box">
<h2 class="boxTitle">{lang}wcf.tagging.tags{/lang}</h2>
<div class="boxContent">
<ul class="tagList">
{foreach from=$tags item=tag}
<li><a href="{link controller='Tagged' object=$tag}objectType=com.woltlab.blog.entry{/link}" class="jsTooltip tag" title="{lang}wcf.tagging.taggedObjects.com.woltlab.blog.entry{/lang}">{$tag->name}</a></li>
{/foreach}
</ul>
</div>
</section>
{/if}
{event name='boxes'}
{/capture}
{include file='header'}
{if !$entry->isPublished && !$entry->isDraft}
<p class="info" role="status">{lang}blog.entry.delayedPublication{/lang}</p>
{/if}
{assign var='objectID' value=$entry->entryID}
<article class="section blogEntry" aria-labelledby="entryTitle{@$entry->entryID}">
<div class="section articleImageContainer" itemprop="image" itemscope itemtype="http://schema.org/ImageObject">
{assign var=coverPhotoImage value=$entry->getCoverPhotoImage()}
<figure class="contentCoverPhotoImage">
<div class="contentCoverPhotoImageWrapper"><img src="{@$coverPhotoImage->getUrl()}" alt=""></div>
</figure>
<meta itemprop="url" content="{$coverPhotoImage->getUrl()}">
<meta itemprop="width" content="{@$coverPhotoImage->getWidth()}">
<meta itemprop="height" content="{@$coverPhotoImage->getHeight()}">
</div>
<div class="section message{if $entry->isDeleted} messageDeleted{/if}{if $entry->isDisabled} messageDisabled{/if}{if $entry->getUserProfile()->userOnlineGroupID} userOnlineGroupMarking{@$entry->getUserProfile()->userOnlineGroupID}{/if}"
{@$__wcf->getReactionHandler()->getDataAttributes('com.woltlab.blog.likeableEntry', $entry->entryID)}
data-is-deleted="{@$entry->isDeleted}" data-is-disabled="{@$entry->isDisabled}" data-is-featured="{@$entry->isFeatured}"
data-can-view-deleted-entry="{if $__wcf->session->getPermission('mod.blog.canViewDeletedEntry')}true{else}false{/if}" data-can-trash-entry="{if $entry->canTrash()}true{else}false{/if}" data-can-restore-entry="{if $entry->canRestore()}true{else}false{/if}" data-can-delete-entry="{if $__wcf->getSession()->getPermission('mod.blog.canDeleteEntry')}true{else}false{/if}" data-can-edit-entry="{if $entry->canEdit()}true{else}false{/if}" data-can-moderate-entry="{if $__wcf->getSession()->getPermission('mod.blog.canModerateEntry')}true{else}false{/if}">
<div class="messageContent">
<div class="messageBody">
{if $entry->getPoll()}
{include file='poll' poll=$entry->getPoll()}
{/if}
{event name='beforeMessageText'}
<div class="messageText">
{if MODULE_WCF_AD}
{@$__wcf->getAdHandler()->getAds('com.woltlab.blog.entry.inEntryMessage')}
{/if}
{@$entry->getFormattedMessage()}
</div>
{event name='afterMessageText'}
</div>
<footer class="messageFooter">
{include file='attachments'}
{if $entry->getUserProfile()->showSignature()}
<div class="messageSignature">
<div>{@$entry->getUserProfile()->getSignature()}</div>
</div>
{/if}
{event name='messageFooter'}
<div class="messageFooterNotes">
{if $entry->canEdit() && $entry->hasOldVersions()}
<p class="blogEntryEditNote messageFooterNote"><a href="{link controller='EditHistory' objectType='com.woltlab.blog.entry' objectID=$entry->entryID}{/link}">{lang}blog.entry.hasOldVersions{/lang}</a></p>
{/if}
{if $entry->getDeleteNote()}
<p class="blogEntryDeleteNote messageFooterNote">{@$entry->getDeleteNote()}</p>
{/if}
{event name='messageFooterNotes'}
</div>
<div class="messageFooterGroup">
{if MODULE_LIKE && $entryLikeData|isset}{include file="reactionSummaryList" reactionData=$entryLikeData objectType="com.woltlab.blog.likeableEntry" objectID=$entry->entryID}{/if}
<ul class="messageFooterButtons buttonList smallButtons">
{if $entry->canEdit()}<li><a href="{link application='blog' controller='EntryEdit' id=$entry->entryID}{/link}" class="button jsButtonEntryInlineEditor" title="{lang}blog.entry.edit{/lang}"><span class="icon icon16 fa-pencil"></span> <span>{lang}wcf.global.button.edit{/lang}</span></a></li>{/if}
<li>
<a href="{$entry->getLink()}" class="button wsShareButton jsOnly" data-link-title="{$entry->getTitle()}">
<span class="icon icon16 fa-share-alt"></span> <span>{lang}wcf.message.share{/lang}</span>
</a>
</li>
{if !VISITOR_USE_TINY_BUILD || $__wcf->user->userID}<li class="jsQuoteMessage" data-object-id="{@$entry->entryID}" data-is-quoted="{if $__quoteFullQuote|isset && $entry->entryID|in_array:$__quoteFullQuote}1{else}0{/if}"><a rel="nofollow" href="{link application='blog' controller='EntryAdd' quoteMessageID=$entry->entryID}{/link}" title="{lang}wcf.message.quote.quoteMessage{/lang}" class="button jsTooltip{if $__quoteFullQuote|isset && $entry->entryID|in_array:$__quoteFullQuote} active{/if}"><span class="icon icon16 fa-quote-left"></span> <span class="invisible">{lang}wcf.message.quote.quoteMessage{/lang}</span></a></li>{/if}
{if $__wcf->session->getPermission('user.profile.canReportContent')}<li class="jsReportEntry jsOnly" data-object-id="{@$entry->entryID}"><a href="#" title="{lang}wcf.moderation.report.reportContent{/lang}" class="button jsTooltip"><span class="icon icon16 fa-exclamation-triangle"></span> <span class="invisible">{lang}wcf.moderation.report.reportContent{/lang}</span></a></li>{/if}
{if MODULE_USER_INFRACTION && $userProfile->userID && $__wcf->session->getPermission('mod.infraction.warning.canWarn') && !$userProfile->getPermission('mod.infraction.warning.immune')}<li class="jsWarnEntry jsOnly" data-object-id="{@$entry->entryID}" data-user-id="{@$userProfile->userID}"><a href="#" title="{lang}wcf.infraction.warn{/lang}" class="button jsTooltip"><span class="icon icon16 fa-gavel"></span> <span class="invisible">{lang}wcf.infraction.warn{/lang}</span></a></li>{/if}
{if $entry->canReact()}<li><a href="#" class="reactButton jsTooltip button{if $entryLikeData[$entry->entryID]|isset && $entryLikeData[$entry->entryID]->reactionTypeID} active{/if}" title="{lang}wcf.reactions.react{/lang}" data-reaction-type-id="{if $entryLikeData[$entry->entryID]|isset && $entryLikeData[$entry->entryID]->reactionTypeID}{$entryLikeData[$entry->entryID]->reactionTypeID}{else}0{/if}"><span class="icon icon16 fa-smile-o"></span> <span class="invisible">{lang}wcf.reactions.react{/lang}</span></a></li>{/if}
{event name='messageFooterButtons'}
</ul>
</div>
</footer>
</div>
</div>
</article>
{if $nextEntry || $previousEntry}
<div class="section blogEntryNavigation">
<nav>
<ul>
{if $previousEntry}
<li class="blogPreviousEntryButton">
<a href="{link application='blog' controller='Entry' object=$previousEntry}{/link}" rel="prev">
<div>
<span class="blogEntryNavigationEntityName">{lang}blog.entry.previousEntry{/lang}</span>
<span class="blogEntryNavigationEntryTitle">{$previousEntry->subject}</span>
</div>
</a>
</li>
{/if}
{if $nextEntry}
<li class="blogNextEntryButton">
<a href="{link application='blog' controller='Entry' object=$nextEntry}{/link}" rel="next">
<div>
<span class="blogEntryNavigationEntityName">{lang}blog.entry.nextEntry{/lang}</span>
<span class="blogEntryNavigationEntryTitle">{$nextEntry->subject}</span>
</div>
</a>
</li>
{/if}
</ul>
</nav>
</div>
{/if}
{event name='beforeComments'}
{if $entry->enableComments}
{if $commentList|count || $commentCanAdd}
<section id="comments" class="section sectionContainerList">
<h2 class="sectionTitle">{lang}wcf.global.comments{/lang}{if $entry->comments} <span class="badge">{#$entry->comments}</span>{/if}</h2>
{include file='__commentJavaScript' commentContainerID='blogEntryCommentList'}
<ul id="blogEntryCommentList" class="commentList containerList" data-can-add="{if $commentCanAdd}true{else}false{/if}" data-object-id="{@$entryID}" data-object-type-id="{@$commentObjectTypeID}" data-comments="{if $entry->comments}{@$commentList->countObjects()}{else}0{/if}" data-last-comment-time="{@$lastCommentTime}">
{if $commentCanAdd}{include file='commentListAddComment' wysiwygSelector='blogEntryCommentListAddComment'}{/if}
{include file='commentList'}
</ul>
</section>
{/if}
{/if}
{* ENDE: ORIGINALCODE *}
{/if}
<script data-relocate="true" src="{@$__wcf->getPath()}js/WCF.Infraction{if !ENABLE_DEBUG_MODE}.min{/if}.js?v={@LAST_UPDATE_TIME}"></script>
<script data-relocate="true">
$(function() {
WCF.Language.addObject({
'blog.entry.delete': '{jslang}blog.entry.delete{/jslang}',
'blog.entry.delete.confirmMessage': '{jslang}blog.entry.delete.confirmMessage{/jslang}',
'blog.entry.delete.success': '{jslang}blog.entry.delete.success{/jslang}',
'blog.entry.disable': '{jslang}blog.entry.disable{/jslang}',
'blog.entry.enable': '{jslang}blog.entry.enable{/jslang}',
'blog.entry.restore': '{jslang}blog.entry.restore{/jslang}',
'blog.entry.trash': '{jslang}blog.entry.trash{/jslang}',
'blog.entry.trash.confirmMessage': '{jslang}blog.entry.trash.confirmMessage{/jslang}',
'blog.entry.trash.reason': '{jslang}blog.entry.trash.reason{/jslang}',
'blog.entry.setAsFeatured': '{jslang}blog.entry.setAsFeatured{/jslang}',
'blog.entry.unsetAsFeatured': '{jslang}blog.entry.unsetAsFeatured{/jslang}',
'blog.entry.featured': '{jslang}blog.entry.featured{/jslang}',
'wcf.moderation.report.reportContent': '{jslang}wcf.moderation.report.reportContent{/jslang}',
'wcf.moderation.report.success': '{jslang}wcf.moderation.report.success{/jslang}',
'wcf.infraction.warn': '{jslang}wcf.infraction.warn{/jslang}',
'wcf.infraction.warn.success': '{jslang}wcf.infraction.warn.success{/jslang}',
'wcf.message.bbcode.code.copy': '{jslang}wcf.message.bbcode.code.copy{/jslang}',
'wcf.message.status.disabled': '{jslang}wcf.message.status.disabled{/jslang}',
'wcf.message.status.deleted': '{jslang}wcf.message.status.deleted{/jslang}'
});
var $inlineEditor = new Blog.Entry.InlineEditor('.message');
$inlineEditor.setRedirectURL('{link application='blog' controller='BlogList' encode=false}{/link}', 'entry');
{if $__wcf->session->getPermission('user.profile.canReportContent')}
new WCF.Moderation.Report.Content('com.woltlab.blog.entry', '.jsReportEntry');
{/if}
{if MODULE_USER_INFRACTION && $__wcf->session->getPermission('mod.infraction.warning.canWarn')}
new WCF.Infraction.Warning.Content('com.woltlab.blog.warnableEntry', '.jsWarnEntry');
{/if}
});
require(["WoltLabSuite/Blog/Ui/Entry/Quote"], ({ UiEntryQuote }) => {
{include file='__messageQuoteManager' wysiwygSelector='text' supportPaste=false}
new UiEntryQuote($quoteManager);
});
</script>
{if MODULE_LIKE && $__wcf->getSession()->getPermission('user.like.canViewLike')}
<script data-relocate="true">
require(['WoltLabSuite/Core/Ui/Reaction/Handler'], function(UiReactionHandler) {
new UiReactionHandler('com.woltlab.blog.likeableEntry', {
// selectors
containerSelector: '.message'
});
});
</script>
{/if}
{include file='footer'}
Display More
Der Originale Code aus dem Blog-entry-Template ist immer zwischen {* START: ORIGINALCODE *} und {* ENDE: ORIGINALCODE *} zu finden.
Das einzige was ich hinzugefügt habe, sind folgende Dinge.
If/else- Abfrage
Mit {if $entry->entryID == 1} {* > ENTRYS *} frage ich die ID des Artikels ab. Das kann dann später mit weiteren IDs erweitert werden, die als Paywall dienen sollen. Weitere IDs würde so aussehen: {if $entry->entryID == 1 || $entry->entryID == 2} {* > ENTRYS *}
Mit {if 6|in_array:$__wcf->user->getGroupIDs()} {* > USERGROUP ACEPTED *} frage ich zusätzlich die Benutzergruppe ab, die den Zugriff haben soll. Das kann man sehr gut mit Bezahlte Mitgliedschaften verknüpfen. Auch hier kann man später bei bedarf mehrere Benutzergruppen hinzufügen.
Und dann habe ich mit Mühe und Not ein Javascript und Stylesheet zusammengebastelt, was dann für die Ansicht (Siehe Bilder) sorgt.
document.addEventListener("DOMContentLoaded", function() {
var messageTexts = document.querySelectorAll(".messageText");
messageTexts.forEach(function(messageText) {
var textContent = messageText.innerText;
if (textContent.length > 500) {
var shortText = textContent.substr(0, 600) + '...';
var blurText = textContent.substr(700);
var shortBlurText = blurText.substr(0, 700) + '...';
messageText.innerHTML = shortText + '<span class="blogPlusblur">' + shortBlurText + '</span>';
var paywallWrapper = document.createElement("div");
paywallWrapper.id = "blogPlus-wrapper";
paywallWrapper.innerHTML = '<h1>+Blog</h1><p>Um diesen +Blog lesen zu können, ist eine Mitgliedschaft vorausgesetzt.</p><p><br /></p><p><a class="button buttonPrimary" href="https://example.com/subscribe">Subscribe Today!</a></p>';
messageText.appendChild(paywallWrapper);
var blurSections = messageText.querySelectorAll('.blogPlusblur');
if (blurSections.length > 0) {
var lastBlurSection = blurSections[blurSections.length-1];
var paywallWrapperHeight = paywallWrapper.offsetHeight;
lastBlurSection.style.marginBottom = "-" + (paywallWrapperHeight / 2) + "px";
paywallWrapper.querySelector(".button").addEventListener("click", function(event) {
});
var gradient = document.createElement("div");
gradient.classList.add("gradient");
lastBlurSection.appendChild(gradient);
}
}
});
});
Display More
/* Text mit dem Blur-Effekt für die ersten 500 Zeichen*/
.blogPlusblur {
filter: blur(4px);
position: relative;
z-index: 1;
}
#blogPlus-wrapper {
padding: 5px;
border-radius: 5px;
position: relative;
margin-bottom: 30px;
box-shadow: 0px 0px 20px -1px rgba(0, 0, 0, 0.2);
background-color: #3F4F60;
border-color: #12876f;
color: #38D7B7;
}
#blogPlus-wrapper * {
text-align: center;
}
Display More
Es wird nach 600 Zeichen ein Blur-Effeckt auf den Rest der Textes eingeleitet. Der Blurtext selber besitzt in dem Fall 700 Zeichen
Der Button kann dann selbst verlinkt und beschriftet werden
Würde mich freuen, mit Interessierte vielleicht etwas schöneres daraus zu formen.
Denn alleine {* START: ORIGINALCODE *} und {* ENDE: ORIGINALCODE *} kommen insgesamt drei mal vor, anders habe ich es nicht geschafft das andere Artikel-IDs für jeden frei zugänglich sind. Wahrscheinlich habe ich auch einige Logik-Fehler dabei und freue mich über jede Idee und Anregung.
Die bisherige Logik soll sein:
- Prüfe ob Blog-Artikel (ID) freigegeben ist, sonst Blur
- Prüfe ob User in Benutzergruppe (ID) vorhanden ist, sonst Blur
- Alle anderen Artikel sollen für jeden lesbar sein
mfg