ctm.portal.portlet.journalarticle.noticia.seo-title New public bus line connecting Banyalbufar and Estellencs with Andratx and Calvià
null New public bus line connecting Banyalbufar and Estellencs with Andratx and Calvià
An error occurred while processing the template.
The following has evaluated to null or missing: ==> ctmContentUtilApi [in template "20101#20128#151203" at line 247, column 17] ---- Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${ctmContentUtilApi.getParentFriendly... [in template "20101#20128#151203" at line 247, column 15] ----
1<#assign newsTitle = .vars['reserved-article-title'].data />
2<#assign metaLang = themeDisplay.getLanguageId()?replace("_","-") />
3
4<#assign
5 titlePage = languageUtil.format(locale,"ctm.portal.portlet.journalarticle.noticia.seo-title",["TIB",newsTitle])
6 descrpPage = languageUtil.format(locale,"ctm.portal.portlet.journalarticle.noticia.meta-description",[newsTitle])
7 keywordsPage = languageUtil.format(locale,"ctm.portal.portlet.journalarticle.noticia.meta-keywords",[themeDisplay.getCompany().getName(),newsTitle?replace(" ",",")])
8/>
9
10${portalUtil.setPageTitle(titlePage, request)}
11${portalUtil.setPageDescription(descrpPage, request)}
12${portalUtil.setPageKeywords(keywordsPage, request)}
13
14<style>
15 #content .mb-2 {
16 visibility:hidden;
17 height:5px;
18 }
19
20 .news-container {
21 display: flex;
22 flex-direction: column;
23 width: 100%;
24 }
25
26 .news-container .news-container-title {
27 font-weight: bold !important;
28 font-size: 28px !important;
29 line-height: 40px !important;
30 color: #002e6d !important;
31 }
32
33 .news-container .news-container-content .news-container-content-header .news-container-content-header-image img.portada{
34 width: 630px;
35 height: 422px;
36 object-fit: cover;
37 }
38
39 .news-container .news-container-content {
40 display: flex;
41 flex-direction: column;
42 width: 100%;
43 margin: 35px 0;
44 }
45
46 .news-container .news-container-content .news-container-content-header {
47 padding: 20px;
48 }
49
50 .news-container .news-container-content .news-container-content-header .news-container-content-header-image{
51 max-width: 545px;
52 float: left;
53 padding-right: 20px;
54 padding-bottom: 15px;
55 }
56 .news-container .news-container-content .news-container-content-header .news-container-content-header-description {
57 }
58 .news-container .news-container-content .news-container-content-header .news-container-content-header-description p {
59 color: #002E6D !important;
60 }
61
62 .news-container .news-container-date {
63 font-size: 14px !important;
64 }
65
66 .news-container .news-container-content-body {
67 font-size: 16px !important;
68 }
69
70 .news-container .documents{
71 padding: 10px 10px 10px 25px;
72 border: 1px solid #002E6D;
73 font-size: 16px;
74 border-radius: 8px;
75 background: #fff;
76 margin-bottom: 20px;
77 width: max-content;
78 cursor: pointer;
79 color: #002E6D !important;
80 }
81
82 .news-container .backToNews{
83 padding: 10px 25px;
84 border: 1px solid #002E6D;
85 font-size: 16px;
86 border-radius: 8px;
87 background: #fff;
88 margin-bottom: 20px;
89 width: max-content;
90 cursor: pointer;
91 color: #002E6D !important;
92 }
93
94 .news-container .news-item-carousel {
95 position: relative;
96 }
97 .news-container .news-item-carousel .carousel-page {
98 display: none;
99 }
100 .news-container .news-item-carousel .carousel-page.active {
101 display: block;
102 }
103 .news-container .news-item-carousel .carousel-btn {
104 position: absolute;
105 top: 50%;
106 transform: translateY(-50%);
107 }
108 .news-container .news-item-carousel .carousel-btn.prev {
109 left: 10px;
110 }
111 .news-container .news-item-carousel .carousel-btn.next {
112 right: 10px;
113 }
114 .news-container .news-item-carousel .carousel-btn img {
115 width: 30px;
116 }
117
118 .news-container .documents .downloadIcon {
119 width:15px;
120 margin-left:50px;
121 }
122
123 .news-container .documents .fileTitle {
124 font-weight: bold;
125 color: #002E6D !important;
126 }
127
128 @media screen and (max-width: 800px) {
129 .news-container {
130 padding: 0 15px;
131 }
132 .news-container .news-container-content .news-container-content-header .news-container-content-header-image, .news-container .news-container-content .news-container-content-header .news-container-content-header-description {
133 max-width: none;
134 }
135 .news-container .news-container-content .news-container-content-header {
136 flex-direction: column;
137 }
138 .news-container .news-container-content .news-container-content-header .news-container-content-header-image{
139 float: none;
140 }
141 .news-container .documents{
142 width: 100%;
143 display: flex;
144 justify-content: space-between;
145 }
146
147 .news-container .backToNews{
148 width: 100%;
149 display: flex;
150 justify-content: space-between;
151 }
152 }
153</style>
154
155<#-- Retrieve the published date meta data field of the web content -->
156<#assign displaydate = .vars['reserved-article-display-date'].data>
157
158<#-- Save the original page locale for later -->
159<#assign originalLocale = .locale>
160
161<#-- Set the page locale to the portals default locale -->
162<#setting locale = localeUtil.getDefault()>
163
164<#-- Parse the date to a date object -->
165<#assign displaydate = displaydate?datetime("EEE, d MMM yyyy HH:mm:ss Z")>
166
167<div class="news-container" itemscope="" itemtype="http://schema.org/Article">
168 <span class="news-container-date" itemprop="datePublished">
169 ${displaydate?string["dd-MM-yyyy"]}.
170 <strong>${languageUtil.get(locale, 'news.actuality')}</strong>
171 </span>
172 <h1 class="news-container-title" itemprop="name headline">
173 ${.vars['reserved-article-title'].data}
174 </h1>
175 <div class="news-container-content">
176
177 <#assign
178 hasImages = ImagenDetalle.getSiblings()?has_content &&
179 ImagenDetalle.getSiblings()?size gt 0 &&
180 ImagenDetalle.getSiblings()[0].getData() != ""
181 hasDescription = .vars['reserved-article-description'].data != ""
182 />
183
184 <#if hasDescription || hasImages>
185 <div class="news-container-content-header">
186 <div class="news-container-content-header-image">
187
188 <#if hasImages>
189 <div class="news-item-carousel">
190 <#list ImagenDetalle.getSiblings() as curImg>
191 <#if curImg?? && curImg?has_content && curImg.getData() != "">
192 <#assign carouselPageClass="" />
193 <#if curImg?is_first>
194 <#assign carouselPageClass="active" />
195 </#if>
196 <div class="carousel-page ${carouselPageClass}">
197 <#if curImg.getData()?? && curImg.getData() != "">
198 <img class="portada" src="${curImg.getData()}"
199 alt="${curImg.getAttribute("alt")}"
200 itemprop="image" />
201 </#if>
202 </div>
203 </#if>
204 </#list>
205
206 <#if ImagenDetalle.getSiblings()?size gt 1>
207 <div class="carousel-btn prev" onclick="prevCarouselPage()">
208 <img alt="prev" src="${themeDisplay.getPathThemeImages()}/angle-left.svg"
209 alt="${languageUtil.get(locale,"alt.prev")}"/>
210 </div>
211 <div class="carousel-btn next" onclick="nextCarouselPage()">
212 <img alt="next" src="${themeDisplay.getPathThemeImages()}/angle-right.svg"
213 alt="${languageUtil.get(locale,"alt.next")}"/>
214 </div>
215 </#if>
216 </div>
217 </#if>
218
219 </div>
220 <#if hasDescription || hasImages>
221 <div class="news-container-content-header-description">
222 ${.vars['reserved-article-description'].data}
223 </div>
224 </#if>
225 <div class="news-container-content-body" itemprop="articleBody">
226 ${texto.getData()}
227 </div>
228 </div>
229 </#if>
230 </div>
231
232 <#if DocumentosMultimedia.getSiblings()?has_content>
233 <#list DocumentosMultimedia.getSiblings() as cur_DocumentosMultimedia>
234 <#if cur_DocumentosMultimedia.getData()?? && cur_DocumentosMultimedia.getData()?has_content>
235 <a class="documents" href="${cur_DocumentosMultimedia.getData()}">
236 <span class="fileTitle">
237 ${cur_DocumentosMultimedia.TituloDocumentoAdjunto.getData()}
238 </span>
239 <img class="downloadIcon" src="${themeDisplay.getPathThemeImages()}/download.svg"
240 alt="${languageUtil.get(locale,"alt.download")}"/>
241 </a>
242 </#if>
243 </#list>
244 </#if>
245
246 <a class="backToNews"
247 href="${ctmContentUtilApi.getParentFriendlyURL(layout,locale)}">
248 ${languageUtil.get(locale, 'news.otherNews')}
249 </a>
250
251</div>
252
253<script>
254 function prevCarouselPage() {
255 var idx = $(".news-item-carousel").find(".carousel-page.active").index();
256 resetCarouselActivePages();
257 if (idx != 0) {
258 $($(".news-item-carousel").find(".carousel-page").get(idx-1)).addClass("active");
259 }
260 else {
261 var lastIdx = $(".news-item-carousel").find(".carousel-page").length-1;
262 $($(".news-item-carousel").find(".carousel-page").get(lastIdx)).addClass("active");
263 }
264 }
265
266 function nextCarouselPage() {
267 var idx = $(".news-item-carousel").find(".carousel-page.active").index();
268 var totalPages = $(".news-item-carousel").find(".carousel-page").length;
269 resetCarouselActivePages();
270 if (idx != totalPages-1) {
271 $($(".news-item-carousel").find(".carousel-page").get(idx+1)).addClass("active");
272 }
273 else {
274 $($(".news-item-carousel").find(".carousel-page").get(0)).addClass("active");
275 }
276 }
277
278 function resetCarouselActivePages() {
279 $(".news-item-carousel").find(".carousel-page").removeClass("active");
280 }
281</script>