Une erreur s'est produite lors du traitement du modèle.
Java method "jdk.proxy126.$Proxy935.getLatestArticle(long, String)" threw an exception when invoked on jdk.proxy126.$Proxy935 object "fr.afpa.wrapper.JournalArticleLocalServiceOverride@726cae7c"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign formationArticle = journalArt... [in template "21355#21395#CONTRAT-PRO-DETAILS" at line 248, column 30]
----
1<#assign date = dateUtil.parseDate('EEE, dd MMM yyyy HH:mm:ss Z', .vars["reserved-article-display-date"].data, localeUtil.getDefault()) />
2<#assign dateDebutPublication = dateUtil.getDate(date, "dd/MM/yyyy",themeDisplay.getLocale(), themeDisplay.getTimeZone()) />
3
4<#assign longGroupId = getterUtil.getLong(groupId) />
5<#assign afpaAccountUtil = serviceLocator.findService('fr.afpa.ws.service.AfpaAccountLocalService') />
6<#assign journalArticleUtil = serviceLocator.findService('fr.afpa.ws.service.AfpaJournalArticleLocalService') />
7<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
8<#assign journalArticleResourceLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleResourceLocalService") />
9<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
10<#assign primKey = journalArticleResourceLocalService.getArticleResourcePrimKey(longGroupId, .vars["reserved-article-id"].data) />
11<#assign entry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", primKey) />
12
13<#assign images_folder = themeDisplay.getPathThemeImages() />
14
15<#-- Recuperation de l'url courante pour les twitter cards -->
16<#assign url = portalUtil.getCurrentCompleteURL(httpServletRequest) />
17<#assign titleSEO = httpServletRequest.getAttribute("titleSEO") />
18
19<article class="contat-pro-detail container">
20
21 <div class="column-left">
22 <#if logo.getData()?has_content >
23 <img id="twitterCardImg" src="${logo.getData()}" alt="${titre_offre.getData()}" />
24 <#else>
25
26 </#if>
27 </div>
28
29 <div class="column-middle">
30 <#assign typeAlternance=journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(entry.getClassPK(), vocabularyname_TYPE_ALTERNANCE) />
31 <#if typeAlternance[0].getName() == "Apprentissage" >
32 <span class="edito-title-one"><@liferay.language key="contrat.apprentissage.details.titre"/></span>
33 <#else>
34 <span class="edito-title-one"><@liferay.language key="contrat.de.professionnalisation.details.titre"/></span>
35 </#if>
36
37 <#assign titreOffre=titre_offre.getData()/>
38 <h1 id="twitterCardTitle" class="left-one">
39 ${titreOffre?html}
40 </h1>
41
42 <script>
43 // On change le titre de la page en JS pour mettre ne pas mettre le titre du contenu BO
44 jQuery("title").html("${titreOffre?trim?html} ${titleSEO}");
45 </script>
46
47 <p class="date-publication-contrat">
48 <#-- Recuperation de la categorie "Région" -->
49 <#assign regions = journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(entry.getClassPK(), vocabularyname_REGIONS) />
50 <#if regions?has_content >
51 <strong>${regions[0].getName()}</strong>
52 </#if>
53 <@liferay.language key="contrat.pro.publie.le"/> ${dateDebutPublication}
54 </p>
55
56 <#-- tri du nombre de postes -->
57 <span class="tag">
58 <#if nombre_postes?has_content >
59 <#assign postes = nombre_postes.getData() />
60 <#if postes?eval == 1 >
61 <strong>${postes}</strong> <@liferay.language key="contrat.pro.nombre.poste"/>
62 <#else>
63 <strong>${postes}</strong> <@liferay.language key="contrat.pro.nombre.postes"/>
64 </#if>
65 </#if>
66 </span>
67
68 <#-- Partager & réseaux sociaux -->
69 <div class="social-bar">
70 <#assign facebookAppID = propsUtil["facebook.app.id"]/>
71 <div id="fb-root"></div>
72 <script>(
73 function(d, s, id) {
74 var js, fjs = d.getElementsByTagName(s)[0];
75 if (d.getElementById(id)) return;
76 js = d.createElement(s); js.id = id;
77 js.src = "//connect.facebook.net/fr_FR/sdk.js#xfbml=1&appId=${facebookAppID}&version=v2.3";
78 fjs.parentNode.insertBefore(js, fjs);
79 }(document, 'script', 'facebook-jssdk'));
80
81 jQuery( document ).ready(function() {
82 jQuery("#share-link").on("click",function(event) {
83 jQuery("#share-div").toggle();
84 jQuery(this).toggleClass("active");
85 });
86 jQuery("#print-link").on("click",function(event) {
87 event.preventDefault();
88 print();
89 });
90 //ajout du tooltip sur le bouton imprimer
91 jQuery('#print-link').tooltipster({
92 theme: '.tooltip-custom-theme',
93 position: 'top-left'
94 });
95 //ajout du tooltip sur le bouton share
96 jQuery('#share-link').tooltipster({
97 theme: '.tooltip-custom-theme',
98 position: 'top-left'
99 });
100
101 });
102 </script>
103 <div class="fb-like" data-layout="button_count" data-action="like" data-show-faces="false" data-share="false"></div>
104
105 <a id="print-link" href="javascript:;" title="<@liferay.language key="partage.imprimer.fiche"/>">print</a>
106 <a id="share-link" href="javascript:;" title="<@liferay.language key="partage.partager.fiche"/>">share</a>
107 <div id="share-div" style="display:none;">
108 <span class='st_email_large' displayText='Email' st_image="${images_folder}/afpa/pinAfpa.png"></span>
109 <span class='st_facebook_large' displayText='Facebook'></span>
110 <span class='st_twitter_large' displayText='Tweet'></span>
111 <span class='st_linkedin_large' displayText='LinkedIn'></span>
112 </div>
113 </div>
114 <#-- / Partager & réseaux sociaux -->
115
116 <div class="info-article">
117 <div class="infosMetiers">
118 <h3 class="bold"><@liferay.language key="contrat.pro.infos.metier"/></h3>
119 <#assign secteurs = journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(entry.getClassPK(), vocabularyname_SECTEUR_ACTIVITE) />
120 <#if secteurs?has_content >
121 <p>
122 <strong><@liferay.language key="contrat.pro.domaine"/> : </strong> ${secteurs[0].getName()}
123 </p>
124 </#if>
125 <#if date_debut_offre?has_content >
126 <p>
127 <strong><@liferay.language key="contrat.pro.date.demarrage.en.entreprise"/> : </strong>${date_debut_offre.getData()}
128 </p>
129 </#if>
130 </div>
131 <#if accroche?has_content >
132 <div id="twitterCardDescription" class="metier-resume">
133 ${accroche.getData()}
134 </div>
135 </#if>
136
137 </div>
138
139 <div class="article-content">
140 <#if themeDisplay.isSignedIn() >
141 <#-- Utilisateur connecté -->
142 <#assign canApply = journalArticleUtil.canUserApplyForContract(themeDisplay.getUserId(), .vars["reserved-article-id"].data) />
143 <#if canApply >
144 <#assign typeProfil = afpaAccountUtil.getTypeProfil(themeDisplay) />
145 <#if typeProfil == "particulier" >
146 <#-- L'utilisateur peut postuler -->
147 <a href="${propsUtil["afpa.candidature.url"]}?idContratPro=${.vars["reserved-article-id"].data}" class="pink-button">
148 <@liferay.language key="contrat.pro.postuler.offre"/>
149 </a>
150 </#if>
151 <#else>
152 <#-- L'utilisateur ne peut pas postuler -->
153 <div id="error-same-candidatures-twice" class="bandeau-info" style="display:none;">
154 <div class="container">
155 <@liferay.language key="fiche.detail.erreur.session.deux.contrat.pro"/>
156 <a onclick="jQuery('#error-same-candidatures-twice').hide();" class="close"><img src="${images_folder}/afpa/white-cross.svg" alt="close"/></a>
157 </div>
158 </div>
159 <a href="#" onclick="jQuery('#error-same-candidatures-twice').show();" class="pink-button">
160 <@liferay.language key="contrat.pro.postuler.offre"/>
161 </a>
162 </#if>
163 <#else>
164 <#assign urlConnexion = propsUtil.get("afpa.annuaire.connexion.url") + "?service=" + themeDisplay.getPortalURL() + "/contrat-en-alternance/" + .vars['reserved-article-url-title'].data />
165 <#-- Utilisateur non connecté -->
166 <#assign isApprentissage = typeAlternance[0].getName() == "Apprentissage" />
167
168 <script>
169 function redirectConnexion() {
170 createCookie('urlRedirectConnexion', window.location.href, 1)
171 var etat_connexion = Liferay.ThemeDisplay.isSignedIn() ? 'connecte' : 'anonyme';
172 var contratType = "contratpro";
173 <#if isApprentissage >
174 contratType = "apprentissage";
175 </#if>
176
177 const formationValue = dataLayerManager.courseDataToDataLayer( {
178 course:{
179 parcoursName: 'contratpro',
180 stepNumber: 1,
181 subStepNumber: 1,
182 },
183 job : {
184 name : '${titre_offre.getData()}',
185 type : contratType,
186 id : '${reference_legale.getData()}'
187 },
188 });
189
190 if (typeof sessionStorage !== undefined) {
191 sessionStorage.setItem('formationValue', JSON.stringify(formationValue));
192 } else {
193 createCookie('formationValue', JSON.stringify(formationValue), 1);
194 }
195 }
196 </script>
197 <a href="${urlConnexion}" class="pink-button" onclick="redirectConnexion()">
198 <@liferay.language key="contrat.pro.se.connecter.pour.postuler.offre"/>
199 </a>
200 </#if>
201
202 <#if les_missions?has_content >
203 <div class="article-part">
204 <h2><@liferay.language key="contrat.pro.les.missions"/></h2>
205 ${les_missions.getData()}
206 </div>
207 </#if>
208
209 <#if profil_recherche?has_content >
210 <div class="article-part">
211 <h2><@liferay.language key="contrat.pro.le.profil.recherche"/></h2>
212 ${profil_recherche.getData()}
213 </div>
214 </#if>
215
216 <#if descriptif_offre?has_content >
217 <div class="article-part">
218 <h2><@liferay.language key="contrat.pro.descriptif.offre"/></h2>
219 ${descriptif_offre.getData()}
220 </div>
221 </#if>
222
223 <#if formation_associee?has_content >
224 <div>
225 <h2><@liferay.language key="contrat.pro.formation.associee.title"/></h2>
226 <p>
227 <strong><@liferay.language key="contrat.pro.formation.associee"/> : </strong><br/>
228 ${libelle_formation.getData()}
229 </p>
230
231 <#if "code_session.getData()" !="" >
232 <#if libelle_region?has_content >
233 <p>
234 <strong> <@liferay.language key="contrat.pro.formation.associee.region"/> : </strong><br/> ${libelle_region.getData()}
235 </p>
236 </#if>
237
238 <#if nom_etablissement?has_content >
239 <p>
240 <strong><@liferay.language key="contrat.pro.formation.associee.centre.formation"/> :</strong><br/>
241 ${nom_etablissement.getData()}
242 </p>
243 </#if>
244 </#if>
245 </div>
246
247 <#assign formationArticleId = "FORMATION-" + formation_associee.getData() />
248 <#assign formationArticle = journalArticleLocalService.getLatestArticle(longGroupId, formationArticleId) />
249
250 <#if formationArticle?has_content >
251 <#assign formationPrimKey = journalArticleResourceLocalService.getArticleResourcePrimKey(longGroupId, formationArticleId) />
252 <#assign formationEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", formationPrimKey) />
253 <#assign formationTypes = journalArticleUtil.getAssetEntryAssetCategoriesByVocabularyAndArticleId(formationEntry.getClassPK(), vocabularyname_TYPE_FORMATION) />
254
255 <#if formationTypes?has_content>
256 <#assign formationURL = journalArticleUtil.buildUrlToDisplayFormation(formationTypes[0].getName(), formationArticle.getUrlTitle(), themeDisplay) />
257 <#else>
258 <#assign formationURL = '' />
259 </#if>
260
261 <a href="${formationURL}" class="pink-button"><@liferay.language key="contrat.pro.voir.formation.pour.ce.metier"/></a>
262 </#if>
263 </#if>
264 </div>
265 </div>
266 <div class="column-right">
267 <p class="legend"><@liferay.language key="contrat.pro.details.reference"/> : ${reference_legale.getData()}</p>
268 </div>
269</article>
270
271<#-- Ajout des twitter card -->
272<#assign afpa_twitter_titre = ["twitter:title", titreOffre?trim] />
273<#assign afpa_twitter_description = ["twitter:description",accroche.getData()?trim] />
274
275<#-- Sur l'url, on retire les elements après afpa_query pour ne pas prendre en compte le sticky -->
276<#assign index = url?trim?index_of('&afpa_query') />
277<#if index != -1 >
278 <#assign url = url?trim?substring(0, index) />
279</#if>
280<#assign afpa_twitter_url = ["twitter:url",url] />
281
282<#-- Pour le visuel, on a un pattern /image/journal/article?img_id
283qui est pris en compte par le ContentTransformerListener qui prefix par
284 (cf. ContentTransformerListener l.169)
285Du coup, je retire le /image de la variable, pour l'ajouter ensuite -->
286<#assign image = logo.getData()?trim />
287<#if image?has_content >
288 <#assign index = image?index_of('/image')+6 />
289 <#assign image = image?substring(index) />
290</#if>
291
292<#assign cur_visuel = themeDisplay.getURLPortal() + "/image" + image />
293<#assign afpa_twitter_image = ["twitter:image",cur_visuel] />
294
295<#assign afpa_twitter = [afpa_twitter_titre, afpa_twitter_description, afpa_twitter_url, afpa_twitter_image] />
296<#assign v = httpServletRequest.getSession().setAttribute("afpa_twitter", afpa_twitter) />
297<#assign w = httpServletRequest.getSession().setAttribute("current_visual", cur_visuel) />
298
299<#assign isApprentissage = typeAlternance[0].getName() == "Apprentissage" />
300<script>
301 var etat_connexion = Liferay.ThemeDisplay.isSignedIn() ? 'connecte' : 'anonyme';
302
303 var contratType = "contratpro";
304 <#if isApprentissage >
305 contratType = "apprentissage";
306 </#if>
307
308 const formationValue = dataLayerManager.courseDataToDataLayer( {
309 course:{
310 parcoursName: 'contratpro',
311 stepNumber: 0,
312 },
313 job : {
314 name : '${titre_offre.getData()}',
315 type : contratType,
316 id : '${reference_legale.getData()}'
317 },
318 });
319
320 dataLayerManager.addToDataLayer(formationValue);
321</script>