Une erreur s'est produite lors du traitement du gabarit.
The following has evaluated to null or missing: ==> image [in template "20101#20128#195325" at line 25, column 10] ---- 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: #if image.getData()?has_content [in template "20101#20128#195325" at line 25, column 5] ----
1<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
2<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
3<#assign JournalContentSearchLocalService = serviceLocator.findService("com.liferay.journal.service.JournalContentSearchLocalService") />
4<#assign LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService") />
5<#assign AssetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") />
6<#assign colorId = themeDisplay.getColorSchemeId() />
7
8<#assign universeUrl = "" />
9<#assign universeName = "" />
10<#assign thematicUrl = "" />
11<#assign thematicName = "" />
12<#assign currentArticleUrl = "" />
13<#assign isArticle = false />
14<#assign breadcrumbLevel = 1 />
15
16<article class="article">
17 <section class="article__history-back">
18 <div class="container">
19 <a class="waves-effect btn btn-flat text-grey-darken-4-i rounded-pill my-1" href="javascript:history.back();"><span class="d-flex align-items-center justify-content-center"><i class="icon-cardif-angle-left text-100 pr-2 lh-150"></i><span>Retour</span></span></a>
20 </div>
21 </section>
22
23 <#assign imageUrl = "" />
24 <#assign imageOverlay = "" />
25 <#if image.getData()?has_content>
26 <#assign imageUrl = image.getData() />
27 <#if image.overlay?? && image.overlay.getData()?has_content>
28 <#assign imageOverlay = image.overlay.getData() />
29 </#if>
30 </#if>
31 <section class="article__illustration banner-header bg-lazy ${imageOverlay} floating-ctas-trigger " data-src="${imageUrl}">
32 <div class="container">
33 <div class="row d-flex justify-content-center">
34 <div class="col-lg-8">
35 <h1 class="text-center m-0 pt-5 pb-3">${.vars['reserved-article-title'].data}</h1>
36 </div>
37 </div>
38 </div>
39 </section>
40
41 <!--Main Content-->
42 <section id="article-content" class="article__content mt-1 mt-md-n10 text-light">
43 <div class="container">
44 <div class="row d-flex justify-content-center">
45 <div class="col-lg-10 px-3 px-lg-9 py-5 bg-white rounded-top">
46 <#assign displayDate = .vars['reserved-article-display-date'].data>
47 <#assign modifiedDate = .vars['reserved-article-modified-date'].data>
48 <#-- Save the original page locale for later -->
49 <#assign originalLocale = locale>
50
51 <#-- Set the page locale to the portals default locale -->
52 <#setting locale = localeUtil.getDefault()>
53
54 <#-- Parse the date to a date object -->
55 <#assign publishedDate = displayDate?date("EEE, d MMM yyyy")>
56 <#assign displayDate = displayDate?datetime("EEE, d MMM yyyy HH:mm:ss")>
57 <#assign modifiedDate = modifiedDate?datetime("EEE, d MMM yyyy HH:mm:ss")>
58
59 <#-- Set the page locale back to the original page locale -->
60 <#assign locale = originalLocale>
61
62 <#if publishedDate?? >
63 <time class="published-date text-80 d-block mb-3" datetime="${dateUtil.getDate(publishedDate, "yyyy-MM-dd", locale)}">Publié le ${dateUtil.getDate(publishedDate, "dd MMMM yyyy", locale)} </time>
64 </#if>
65
66 <#if intro.getData()?has_content>
67 <p class="intro text-grey-lighten-1 text-120 text-normal mb-5">
68 ${intro.getData()}
69 </p>
70 </#if>
71 ${description.getData()}
72
73 <#-- campaign banner -->
74 <#if campaign.getData()?has_content>
75 <div class="article__banner-campaign">
76 <#assign bannerContent = "" />
77 <#assign bannerContentId = "" />
78
79 <#assign bannerContent = JournalArticleLocalService.getArticleByUrlTitle(groupId, campaign.getData()) />
80 <#if bannerContent??>
81 <#assign bannerContentId = bannerContent.getArticleId() />
82 </#if>
83
84 <#if bannerContentId??>
85 <#assign bannerContent = journalContentUtil.getContent(groupId, bannerContentId, viewMode, localeUtil.getDefault(), themeDisplay) />
86 ${bannerContent}
87 </#if>
88 </div>
89 </#if>
90 <#-- bloc contact expert -->
91 <section class="bloc contact expert">
92 <#if colorId == "04">
93 <#assign blocInformatifId = JournalArticleLocalService.getArticleByUrlTitle(groupId, 'bloc-en-savoir-plus').getArticleId() />
94 <#elseif colorId == "03">
95 <#assign blocInformatifId = JournalArticleLocalService.getArticleByUrlTitle(groupId, 'bloc-en-savoir-plus-epargne').getArticleId() />
96 </#if>
97
98 <#if blocInformatifId??>
99 <#assign blocInformatif = journalContentUtil.getContent(groupId, blocInformatifId, viewMode, localeUtil.getDefault(), themeDisplay) />
100 ${blocInformatif}
101 </#if>
102 </section>
103
104 <!-- Social network -->
105 <div id="article_share" class="bg-grey-lighten-5 d-flex flex-column flex-md-row align-items-center justify-content-between mt-5">
106 <div id="total_count" class="px-3 py-2 py-md-0">
107 <span class="icon-cardif-share align-middle">
108 <!--picto-->
109 </span>
110
111 <span class="article_share-title">
112 Je partage cet article
113 </span>
114 </div>
115 <div id="social_networks"></div>
116 </div>
117 </div>
118 </div>
119 </div>
120 </section>
121
122 <#-- Push contents -->
123 <#if promotion.getSiblings()?has_content>
124 <section class="article__push-forward">
125 <#list promotion.getSiblings() as cur_promotion>
126 <#if cur_promotion.getData()?has_content>
127 <#assign pushContent = "" />
128 <#assign pushContentId = "" />
129
130 <#assign pushContent = JournalArticleLocalService.getArticleByUrlTitle(groupId, cur_promotion.getData()) />
131 <#if pushContent??>
132 <#assign pushContentId = pushContent.getArticleId() />
133 </#if>
134
135 <#if pushContentId??>
136 <#assign pushContent = journalContentUtil.getContent(groupId, pushContentId, viewMode, localeUtil.getDefault(), themeDisplay) />
137 ${pushContent}
138 </#if>
139 </#if>
140 </#list>
141 </section>
142 </#if>
143
144 <#-- list categories of an article -->
145 <#assign journalArticleId = .vars['reserved-article-id'].data>
146 <#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.journal.service.JournalArticleResourceLocalServiceUtil"]>
147 <#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetCategoryLocalServiceUtil"]>
148 <#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/>
149 <#assign categoryList = assetCategoryLocalServiceUtil.getCategories("com.liferay.journal.model.JournalArticle",articleResourcePK) >
150
151 <#-- Get vocabulary from category -->
152 <#assign assetVocabularyLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetVocabularyLocalServiceUtil"]>
153 <#assign dossierThematiqueId = 0 />
154 <#list categoryList as category>
155 <#assign vocab = assetVocabularyLocalServiceUtil.getVocabulary(category.getVocabularyId()) />
156 <#if vocab.getName()?index_of("Dossier Thématique") != -1>
157 <#assign dossierThematiqueId = category.getCategoryId() />
158 </#if>
159 <#if "Article" == category.getName()>
160 <#assign isArticle = true />
161 </#if>
162 </#list>
163
164 <#-- Get Current article URL -->
165 <#assign currentLayoutIds = JournalContentSearchLocalService.getLayoutIds(groupId, false, journalArticleId) />
166 <#if currentLayoutIds?has_content>
167 <#list currentLayoutIds as layoutId>
168 <#assign currentArticleLayout = LayoutLocalService.getLayout(groupId, false, layoutId) />
169 <#assign currentArticleUrl = currentArticleLayout.getFriendlyURL(locale) />
170 <#break />
171 </#list>
172
173 <#if currentArticleUrl?index_of("/assurance-emprunteur") == 0>
174 <#assign universeUrl = "/assurance-emprunteur" />
175 <#assign universeName = "Assurance de prêt immobilier" />
176 <#assign breadcrumbLevel = 2 />
177 <#elseif currentArticleUrl?index_of("/assurance-prevoyance") == 0>
178 <#assign universeUrl = "/assurance-prevoyance" />
179 <#assign universeName = "Prévoyance" />
180 <#assign breadcrumbLevel = 2 />
181 <#elseif currentArticleUrl?index_of("/placement-epargne") == 0>
182 <#assign universeUrl = "/placement-epargne" />
183 <#assign universeName = "Epargne" />
184 <#assign breadcrumbLevel = 2 />
185 <#elseif currentArticleUrl?index_of("/epargne-retraite") == 0>
186 <#assign universeUrl = "/epargne-retraite" />
187 <#assign universeName = "Retraite" />
188 <#assign breadcrumbLevel = 2 />
189 </#if>
190 </#if>
191
192 <#if dossierThematiqueId != 0>
193 <!-- list of all similar articles -->
194 <#assign assetEntryQuery = objectUtil('com.liferay.asset.kernel.service.persistence.AssetEntryQuery') />
195 <#assign search = assetEntryQuery.setOrderByCol1("publishDate") />
196 <#assign search = assetEntryQuery.setClassName("com.liferay.journal.model.JournalArticle") />
197 <#assign search = assetEntryQuery.setAnyCategoryIds([dossierThematiqueId]) />
198 <#assign assetEntryQueryService = objectUtil('com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil')>
199 <#assign entries = assetEntryQueryService.getEntries(assetEntryQuery)>
200 <#assign dossierThematiqueUrl = "" />
201
202 <#if entries?has_content>
203 <section class="container my-4" >
204 <div class="row d-flex justify-content-center">
205 <div class="col-lg-10 px-3 px-lg-9">
206 <div class="card h-100 m-0 b-0 bl-3 b-primary-i b-solid rounded-bottom py-5">
207 <div class="col-lg-12">
208 <h3 class="mb-4 text-primary-i"><span class="text-90 text-md-80 text-xl-100">Nos suggestions d'articles</span></h3>
209 </div>
210 <ul class="list-styled list-bullet-text-primary">
211 <#list entries as entry>
212 <#assign assetRenderer = entry.getAssetRenderer() />
213 <#assign article = assetRenderer.getArticle() />
214 <#if journalArticleId != article.getArticleId() >
215 <#assign entryTitle = assetRenderer.getTitle(locale) />
216 <#assign entryCategories = entry.getCategories() />
217
218 <#assign viewURL = "" />
219 <#assign layoutIds = JournalContentSearchLocalService.getLayoutIds(groupId, false, article.getArticleId()) />
220 <#if layoutIds?has_content>
221 <#list layoutIds as layoutId>
222 <#assign articleLayout = LayoutLocalService.getLayout(groupId, false, layoutId) />
223 <#assign viewURL = articleLayout.getFriendlyURL(locale) />
224 <#break />
225 </#list>
226 </#if>
227
228 <#assign isTypeArticle = false />
229
230 <#if entryCategories?has_content >
231 <#list entryCategories as category>
232 <#assign subVocab = assetVocabularyLocalServiceUtil.getVocabulary(category.getVocabularyId()) />
233 <#if "Particulier Type Article" == subVocab.getName()>
234 <#assign isTypeArticle = true />
235 <#break />
236 </#if>
237 </#list>
238 </#if>
239
240 <#if isTypeArticle >
241 <li class="mb-1 icon-cardif-hook-right"><a href="${viewURL}" class="text-black-i ho-text-underline fo-text-underline text-decoration-none text-90">${entryTitle}</a></li>
242 <#else>
243 <#assign thematicName = entryTitle />
244 <#assign thematicUrl = viewURL />
245 <#assign breadcrumbLevel = 3 />
246 </#if>
247 </#if>
248 </#list>
249 </ul>
250 <#if thematicUrl?has_content>
251 <div class="col-lg-12 pt-2">
252 <p class="text-left">
253 <a class="btn btn-outline btn-primary w-100 w-md-70 w-xl-30 waves-effect" href="${thematicUrl}">Voir le dossier complet</a>
254 </p>
255 </div>
256 </#if>
257 </div>
258 </div>
259 </div>
260 </section>
261 </#if>
262 </#if>
263
264 <#-- Floating CTAs -->
265 <#if floatingCTA.getData()?has_content>
266 <#assign ctaArticle = JournalArticleLocalService.getArticleByUrlTitle(groupId, floatingCTA.getData()) />
267 <#else>
268 <#if colorId == "02">
269 <#assign ctaArticle = JournalArticleLocalService.getArticleByUrlTitle(groupId, "floating-cta-assurer-mon-pret") />
270 <#elseif colorId == "03">
271 <#assign ctaArticle = JournalArticleLocalService.getArticleByUrlTitle(groupId, "floating-cta-epargne") />
272 <#elseif colorId == "04">
273 <#assign ctaArticle = JournalArticleLocalService.getArticleByUrlTitle(groupId, "floating-cta-retraite") />
274 <#elseif colorId == "05">
275 <#assign ctaArticle = JournalArticleLocalService.getArticleByUrlTitle(groupId, "floating-cta-prevoyance") />
276 </#if>
277 </#if>
278
279 <#if ctaArticle??>
280 <#assign ctaArticleId = ctaArticle.getArticleId() />
281 </#if>
282
283 <#if ctaArticleId??>
284 <section id="article__ctas">
285 <#assign ctaArticle = journalContentUtil.getContent(groupId, ctaArticleId, viewMode, localeUtil.getDefault(), themeDisplay) />
286 ${ctaArticle}
287 </section>
288 </#if>
289</article>
290
291<!-- image inbenta -->
292<div class="d-none" id="vignette-article"><img src="${.vars['reserved-article-small-image-url'].data}"></div>
293
294<style type="text/css">
295 .mat #social_networks .btn {border: transparent; color: #fff !important; }
296 .mat #social_networks .icon-cardif-linkedin2 {background-color: #326eae;}
297 .mat #social_networks .icon-cardif-linkedin2:focus,
298 .mat #social_networks .icon-cardif-linkedin2:hover {background-color: #4887cb;}
299 .mat #social_networks .icon-cardif-twitter2 {background-color: #52afec;}
300 .mat #social_networks .icon-cardif-twitter2:focus,
301 .mat #social_networks .icon-cardif-twitter2:hover {background-color: #80c4f1;}
302 .mat #social_networks .icon-cardif-facebook2 {background-color: #495fa5;}
303 .mat #social_networks .icon-cardif-facebook2:focus,
304 .mat #social_networks .icon-cardif-facebook2:hover {background-color: #667abb;}
305 .mat #social_networks .icon-cardif-share-mail {background-color: #00965e;}
306 .mat #social_networks .icon-cardif-share-mail:focus,
307 .mat #social_networks .icon-cardif-share-mail:hover {background-color: #00c97e;}
308</style>
309<script type="text/javascript" data-senna-track='temporary' src="/documents/9413226/9414665/jquery.social-shares.min.js/e3f3a65f-5317-4346-ac45-d62edc31e6c6?t=1660212763761"></script>
310<script type="text/javascript">
311 $(document).ready(function() {
312 $("#social_networks").jsSocials({
313 shares: ["linkedin", "twitter", "facebook", "email"]
314 });
315 });
316</script>
317<#if isArticle>
318<script type = "application/ld+json">
319 {
320 "@context": "http://schema.org",
321 "@type": "Article",
322 "mainEntityOfPage": {
323 "@type": "WebPage",
324 "@id": "${themeDisplay.getPortalURL()}${currentArticleUrl}"
325 },
326 "headline": "${htmlUtil.escape(htmlUtil.stripHtml(.vars['reserved-article-title'].data))}",
327 "image": {
328 "@type": "ImageObject",
329 "url": "${themeDisplay.getPortalURL()}${imageUrl}",
330 "height": 1600,
331 "width": 400
332 },
333 "datePublished": "${displayDate?iso_local}",
334 "dateModified": "${modifiedDate?iso_local}",
335 "author": {
336 "@type": "Organization",
337 "name": "Cardif France"
338 },
339 "speakable": {
340 "@type": "SpeakableSpecification",
341 "cssSelector": ["#article-title", "#article-content"]
342 },
343 "publisher": {
344 "@type": "Organization",
345 "name": "Cardif France",
346 "logo": {
347 "@type": "ImageObject",
348 "url": "${themeDisplay.getPortalURL()}/documents/420686/420898/cardif-logo.png/7a9c3746-d39e-410d-a0d3-b99d154cc6ee?t=1579797861659",
349 "width": 160,
350 "height": 42
351 }
352 },
353 "description": "${htmlUtil.escape(htmlUtil.stripHtml(intro.getData()))}",
354 "articleBody": "${htmlUtil.escape(htmlUtil.stripHtml(description.getData()))}"
355 }
356</script>
357</#if>
358
359<script type="application/ld+json">
360{
361 "@context": "https://schema.org",
362 "@type": "BreadcrumbList",
363 "itemListElement": [
364 <#if breadcrumbLevel gt 1>
365 {
366 "@type": "ListItem",
367 "position": 1,
368 "name": "${htmlUtil.escape(htmlUtil.stripHtml(universeName))}",
369 "item": "${themeDisplay.getPortalURL()}${universeUrl}"
370 },
371 </#if>
372 <#if breadcrumbLevel gt 2>
373 {
374 "@type": "ListItem",
375 "position": 2,
376 "name": "${htmlUtil.escape(htmlUtil.stripHtml(thematicName))}",
377 "item": "${themeDisplay.getPortalURL()}${thematicUrl}"
378 },
379 </#if>
380 {
381 "@type": "ListItem",
382 "position": ${breadcrumbLevel},
383 "name": "${htmlUtil.escape(htmlUtil.stripHtml(.vars['reserved-article-title'].data))}",
384 "item": "${themeDisplay.getPortalURL()}${currentArticleUrl}"
385 }
386 ]
387}
388</script>