Implement EXT:news for events site

This commit is contained in:
Björn Fromme
2018-05-03 18:23:28 +02:00
parent 0e7a914781
commit 9d8b472b9a
11 changed files with 342 additions and 1 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
"license": "WTFPL",
"repository": "https://gitlab.com/dreipunktnull/ep_theme.git",
"scripts": {
"dev": "./node_modules/.bin/encore dev",
"dev": "./node_modules/.bin/encore dev --watch",
"build": "./node_modules/.bin/encore production"
},
"dependencies": {
@@ -0,0 +1,12 @@
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:news/Configuration/TypoScript/setup.txt">
plugin.tx_news {
view {
templateRootPaths.100 = EXT:ep_events/Resources/Private/Templates/News/
partialRootPaths.100 = EXT:ep_events/Resources/Private/Partials/News/
widget.GeorgRinger\News\ViewHelpers\Widget\PaginateViewHelper.templateRootPath = EXT:ep_events/Resources/Private/Templates/News/
}
settings {
link.skipControllerAndAction = 1
}
}
@@ -55,3 +55,4 @@ plugin.tx_epevents {
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:fluid_styled_content/Configuration/TypoScript/Static/constants.txt">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:form/Configuration/TypoScript/constants.txt">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:news/Configuration/TypoScript/constants.txt">
@@ -1,5 +1,6 @@
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:ep_events/Configuration/TypoScript/Extensions/FluidStyledContent.ts">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:ep_events/Configuration/TypoScript/Extensions/Form.ts">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:ep_events/Configuration/TypoScript/Extensions/News.ts">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:ep_events/Configuration/TypoScript/Library/DynamicContent.ts">
<INCLUDE_TYPOSCRIPT: source="FILE:EXT:ep_events/Configuration/TypoScript/Library/ParseFunc.ts">
@@ -0,0 +1,55 @@
.news-entry {
width: 100%;
&:not(:last-child) {
margin-bottom: 20px;
}
}
.news-entry__info {
margin: 0 0 20px;
}
.news-entry__inner {
display: flex;
flex-direction: column;
@include mq($from: tablet) {
flex-direction: row;
}
}
.news-entry__image {
width: 100%;
margin-bottom: 8px;
@include mq($from: tablet) {
width: percentage(1/3);
}
}
.news-entry__info {
font-style: italic;
font-size: 90%;
}
.news-entry__headline {
margin-top: 0;
}
.news-entry__teaser {
width: 100%;
@include mq($from: tablet) {
padding-left: 16px;
width: percentage(2/3);
}
p {
margin-bottom: 16px;
&:last-child {
margin-bottom: 8px;
}
}
}
@@ -39,3 +39,4 @@ $output-bourbon-deprecation-warnings: false;
@import "cookieconsent";
@import "search";
@import "paginator";
@import "news";
@@ -0,0 +1,31 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers"
data-namespace-typo3-fluid="true">
<v:variable.set name="images" value="{media -> v:iterator.filter(propertyName: 'showinpreview', filter: 0)}"/>
<f:if condition="{images}">
<div class="slider slider--content">
<div id="carousel-{id}" class="slider__items">
<f:for each="{images}" as="image" iteration="iteration">
<f:link.typolink parameter="{image.originalResource.link}" class="slider__item">
<img src="{f:uri.image(src: image.uid, treatIdAsReference: 1, crop: image.crop, width: '770', height: '430c+100')}"
class="slider__image" alt="{image.alternative}" title="{image.title}">
</f:link.typolink>
</f:for>
</div>
<f:if condition="{images -> f:count()} > 1">
<div class="slider__thumbs hidden-sm hidden-xs">
<f:for each="{images}" as="image" iteration="iteration">
<f:if condition="{iteration.cycle} <= 5">
<a href="#" class="slider__thumb" data-slide="{iteration.index}">
<img src="{f:uri.image(src: image.uid, treatIdAsReference: 1, crop: image.crop, width: '150', height: '85c+100')}"
class="img-responsive" alt="{image.alternative}" title="{image.title}">
</a>
</f:if>
</f:for>
</div>
</f:if>
</div>
</f:if>
</html>
@@ -0,0 +1,53 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
data-namespace-typo3-fluid="true">
<div class="news-entry" itemscope="itemscope" itemtype="http://schema.org/Article">
<n:excludeDisplayedNews newsItem="{newsItem}"/>
<div class="news-entry__inner">
<div class="news-entry__image">
<f:if condition="{newsItem.mediaPreviews}">
<f:then>
<f:if condition="{newsItem.mediaPreviews.0}">
<f:alias map="{mediaElement: '{newsItem.mediaPreviews.0}'}">
<f:image image="{mediaElement}" title="{mediaElement.originalResource.title}"
crop="{mediaElement.crop}"
width="640" height="360c+50"
alt="{mediaElement.originalResource.alternative}" class="scale"/>
</f:alias>
</f:if>
</f:then>
<f:else>
<f:if condition="{newsItem.media}">
<f:alias map="{mediaElement: '{newsItem.media.0}'}">
<f:image image="{mediaElement}" title="{mediaElement.originalResource.title}"
crop="{mediaElement.crop}"
width="640" height="360c+50"
alt="{mediaElement.originalResource.alternative}" class="scale"/>
</f:alias>
</f:if>
</f:else>
</f:if>
</div>
<div class="news-entry__teaser">
<h2 class="headline headline--primary" itemprop="headline">
{newsItem.title}
<span class="subline">
<time itemprop="datePublished" datetime="{f:format.date(date:newsItem.datetime, format:'Y-m-d')}"><f:format.date format="{f:translate(key:'dateFormat')}">{newsItem.datetime}</f:format.date></time>
</span>
</h2>
<n:removeMediaTags>
<f:if condition="{newsItem.teaser}">
<f:then>
<div itemprop="description">{newsItem.teaser -> f:format.html()}</div>
</f:then>
<f:else>
<div itemprop="description">{newsItem.bodytext -> f:format.html()}</div>
</f:else>
</f:if>
</n:removeMediaTags>
</div>
</div>
</div>
</html>
@@ -0,0 +1,70 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="Detail" />
<f:section name="content">
<f:if condition="{newsItem}">
<f:then>
<div class="blog-entry blog-entry--detail">
<n:format.nothing>
<n:excludeDisplayedNews newsItem="{newsItem}" />
<f:if condition="{newsItem.alternativeTitle}">
<f:then>
<n:titleTag>
<f:format.htmlentitiesDecode>{newsItem.alternativeTitle}</f:format.htmlentitiesDecode>
</n:titleTag>
</f:then>
<f:else>
<n:titleTag>
<f:format.htmlentitiesDecode>{newsItem.title}</f:format.htmlentitiesDecode>
</n:titleTag>
</f:else>
</f:if>
<f:render partial="Detail/Opengraph" arguments="{newsItem: newsItem, settings:settings}" />
</n:format.nothing>
<h2 class="headline headline--primary headline--underlined" itemprop="headline">{newsItem.title}</h2>
<p class="blog-entry__info">
<f:if condition="{newsItem.author}">{newsItem.author} am </f:if>
<time itemprop="datePublished" datetime="{f:format.date(date:newsItem.datetime, format:'Y-m-d')}"><f:format.date format="{f:translate(key:'dateFormat')}">{newsItem.datetime}</f:format.date></time>
<f:if condition="{newsItem.tags}"> in
<f:for each="{newsItem.tags}" as="tag" iteration="iteration">
<f:link.page title="{tag.title}" pageUid="{settings.tagListPageUid}" additionalParams="{tx_news_pi1:{overwriteDemand:{tags: tag}}}">
{tag.title}
</f:link.page>
{f:if(condition: iteration.isLast, else: ', ')}
</f:for>
</f:if>
</p>
<f:if condition="{newsItem.teaser}">
<f:format.html>{newsItem.teaser}</f:format.html>
</f:if>
<n:renderMedia news="{newsItem}" imgClass="img-responsive" videoClass="video-wrapper" audioClass="audio-wrapper">
<f:render partial="Detail/MediaContainer" arguments="{media: newsItem.media, settings:settings, id: newsItem.uid}" />
<f:format.html>{newsItem.bodytext}</f:format.html>
</n:renderMedia>
<f:cObject typoscriptObjectPath="lib.tx_news.contentElementRendering">{newsItem.contentElementIdList}</f:cObject>
<f:if condition="{newsItem.relatedFiles}">
<h3 class="headline headline--underlined">Dateien</h3>
<ul>
<f:for each="{newsItem.relatedFiles}" as="relatedFile">
<li>
<a href="{relatedFile.originalResource.publicUrl -> f:format.htmlspecialchars()}" target="_blank">
{f:if(condition:relatedFile.originalResource.title, then:relatedFile.originalResource.title, else:relatedFile.originalResource.name)}, {relatedFile.originalResource.size -> f:format.bytes()}
</a>
</li>
</f:for>
</ul>
</f:if>
<f:if condition="{settings.backPid}">
<f:link.page pageUid="{settings.backPid}" class="button button--default button--small">
<f:translate key="back-link" />
</f:link.page>
</f:if>
</div>
</f:then>
</f:if>
</f:section>
</html>
@@ -0,0 +1,33 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:layout name="General" />
<f:section name="content">
<f:if condition="{news}">
<f:then>
<f:if condition="{settings.hidePagination}">
<f:then>
<f:for each="{news}" as="newsItem" iteration="iterator">
<f:render partial="List/Item" arguments="{newsItem: newsItem,settings:settings,iterator:iterator}" />
</f:for>
</f:then>
<f:else>
<n:widget.paginate objects="{news}" as="paginatedNews" configuration="{settings.list.paginate}" initial="{offset:settings.offset,limit:settings.limit,recordId:contentObjectData.uid}">
<f:for each="{paginatedNews}" as="newsItem" iteration="iterator">
<f:render partial="List/Item" arguments="{newsItem: newsItem,settings:settings,iterator:iterator}" />
</f:for>
</n:widget.paginate>
</f:else>
</f:if>
</f:then>
<f:else>
<div class="no-news-found">
<f:translate key="list_nonewsfound" />
</div>
</f:else>
</f:if>
</f:section>
</html>
@@ -0,0 +1,84 @@
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
data-namespace-typo3-fluid="true">
<f:renderChildren arguments="{contentArguments}" />
<f:render section="paginator" arguments="{pagination: pagination,configuration:configuration}" />
<f:section name="paginator">
<f:if condition="{pagination.numberOfPages} > 1">
<f:if condition="{settings.list.paginate}">
<f:if condition="{pagination.previousPage}">
<f:if condition="{pagination.previousPage} > 1">
<f:then>
<n:headerData><link rel="prev" href="{f:widget.uri(arguments: {currentPage: pagination.previousPage}) -> f:format.htmlentities()}" /></n:headerData>
</f:then>
<f:else>
<n:headerData><link rel="prev" href="{f:widget.uri() -> f:format.htmlentities()}" /></n:headerData>
</f:else>
</f:if>
</f:if>
<f:if condition="{pagination.nextPage}">
<n:headerData><link rel="next" href="{f:widget.uri(arguments: {currentPage: pagination.nextPage}) -> f:format.htmlentities()}" /></n:headerData>
</f:if>
</f:if>
<nav aria-label="Paginierung">
<ul class="pagination">
<f:if condition="{pagination.previousPage}">
<li class="previous">
<f:if condition="{pagination.previousPage} > 1">
<f:then>
<f:widget.link arguments="{currentPage: pagination.previousPage}">&laquo;</f:widget.link>
</f:then>
<f:else>
<f:widget.link>&laquo;</f:widget.link>
</f:else>
</f:if>
</li>
</f:if>
<f:if condition="{pagination.displayRangeStart} > 1">
<li class="first">
<f:widget.link>1</f:widget.link>
</li>
</f:if>
<f:if condition="{pagination.hasLessPages}">
<li>....</li>
</f:if>
<f:for each="{pagination.pages}" as="page">
<f:if condition="{page.isCurrent}">
<f:then>
<li class="active"><span>{page.number}</span></li>
</f:then>
<f:else>
<li>
<f:if condition="{page.number} > 1">
<f:then>
<f:widget.link arguments="{currentPage: page.number}">{page.number}</f:widget.link>
</f:then>
<f:else>
<f:widget.link>{page.number}</f:widget.link>
</f:else>
</f:if>
</li>
</f:else>
</f:if>
</f:for>
<f:if condition="{pagination.hasMorePages}">
<li class="disabled">....</li>
</f:if>
<f:if condition="{pagination.displayRangeEnd} < {pagination.numberOfPages}">
<li class="last">
<f:widget.link arguments="{currentPage: pagination.numberOfPages}">{pagination.numberOfPages}</f:widget.link>
</li>
</f:if>
<f:if condition="{pagination.nextPage}">
<li class="last next">
<f:widget.link arguments="{currentPage: pagination.nextPage}">&raquo;</f:widget.link>
</li>
</f:if>
</ul>
</nav>
</f:if>
</f:section>
</html>